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/TradeController.py

from flask import Flask, request, Blueprint, jsonify, redirect, url_for,flash, render_template,session,Response,jsonify,json
from core.model.BOModel import BOModel
from core.model.UserModel import UserModel
from core.model.SpotRegModel import SpotRegModel
from core.model.VerifyPaymentModel import VerifyPaymentModel
from core.model.OfflineModel import OfflineModel
from core.model.BOReportModel import BOReportModel
from core.model.TradeModel import TradeModel
from core.model.AddonsModel import AddonsModel
from core.model.SurgicalUserModel import SurgicalUserModel
from random import randint
from .. import Cryptography,Auth,RouteGroup,Helper,Custom,AWSUpload
import datetime
from core.library.email import EMAIL
import math
from datetime import timedelta,date,datetime
from flask import session, app
from os import listdir
import io
import csv
import ast
import requests,mandrill,json,math
import base64
import flask
from num2words import num2words
from werkzeug.utils import secure_filename
import boto3, botocore
from botocore.exceptions import ClientError

import webbrowser
import os #use for new instance of chrome

import urllib.parse

from io import BytesIO

import xlsxwriter
from xlsxwriter import Workbook
import xlwt

from collections import defaultdict

app = Blueprint('trade_reg', __name__)

'''--------------------------------------- Back Office Start --------------------------------------------------  '''

@app.route('/<int:conf_id>/<conf_key>/admin', methods = ["GET", "POST"])
@app.route('/admin', methods = ["GET", "POST"])
def BoHome(conf_id =None,conf_key=None):
	host      = request.host
	host_data = UserModel().get_conference_by_host(host)
	if host_data:
		if conf_id:
			conf_id = conf_id
			conf_key = conf_key
		else:
			conf_id = host_data["conf_id"]
			conf_key = host_data["conf_key"]	
		return redirect (url_for('back_office.Home',conf_id=conf_id,conf_key=conf_key))
	else:
		return "Application not found"

@app.route('/<int:conf_id>/<conf_key>/trade_user_post_login', methods = ["GET","POST"])
@RouteGroup.conf_required
def TradeUserPostLogin(conf_id,conf_key):
	conf        = Auth.getConf(conf_id,conf_key)
	conf_id     = conf['conf_id']
	conf_name   = conf['conf_name']
	society_id  = conf['society_id']
	now         = datetime.now()
	if request.method == 'POST':
		email = request.form['email']
		if conf_id == 5 and email in ['santosh.bhide7@gmail.com','aaheroor@gmail.com','vivekmotewar@gmail.com','pushparaj.she8igar@gmail.com'] :
			data={'msg' : 'Access-Denied'}
			return jsonify(data) 
		password = request.form['password']
		if  not email  or not password:
			flash('Please enter email and password')
			return redirect (url_for('delegate.login'))
		else :
			us = BOModel()
			output = BOModel().get_bo_users_email(email,society_id,conf_id)
			login_data = output
			kc_session = None
			fc_session = None
			
# 			for index,value in enumerate(conferences_data):
# 				if index == 0:
# 					fc_session = value
# 				if index == 1:
# 					kc_session = value
				
# 			if fc_session[0]['session_key'] != None:
# 				fc_session = fc_session
# 				fc_data = {
# 							'fc_session': fc_session
# 				}
# 				login_data.update(fc_data)
# 			else:
# 				fc_session = None

# 			if kc_session[0]['session_key'] != None :
# 				kc_session = kc_session[0]
# 				kc_data = {
# 							'kc_session': kc_session
# 				}
# 				login_data.update(kc_data)
# 			else:
# 				kc_session = None
				
			if output != None :
				is_admin =  output['is_admin']
				bo_access   = UserModel().check_bo_access(email,2,society_id,conf_id) # for check back office admin access
				if bo_access["is_admin"] == 1 :
					db_pass =  output['password']
					if password == db_pass:
						user_id = output['user_id']
						Auth.bologin(login_data,society_id)
						datas = {
							'user_id'   : output['user_id'],
							'log'       : "back office login",
							'app_type'  : Helper.AppType,
							'society_id': society_id,
							'conf_id'   : conf_id,
							'log_at'    : now
							}
						BOModel().insert_back_offie_login_logs(datas)   
						data = {'msg':'success','conf_name':conf_name,'conf_id' :conf_id}                  
					else:
						data={'msg' : 'No-Match-Password'}
				else:
					data={'msg' : 'Access-Denied'}           
			else:
				data={'msg' : 'No-data'}

		return jsonify(data)
	else:
		email = request.values.get('email')
		if conf_id == 5 and email in ['santosh.bhide7@gmail.com','chetankharkande4045@gmail.com','aaheroor@gmail.com','vivekmotewar@gmail.com','pushparaj.she8igar@gmail.com'] :
			data={'msg' : 'Access-Denied'}
			return jsonify(data) 

		password = request.values.get('password')
		if  not email  or not password:
			flash('Please enter email and password')
			return redirect (url_for('delegate.login'))
		else :
			us = BOModel()
			output = BOModel().get_bo_users_email(email,society_id,conf_id)
			login_data = output
			kc_session = None
			fc_session = None

# 			for index,value in enumerate(conferences_data):
# 				if index == 0:
# 					fc_session = value
# 				if index == 1:
# 					kc_session = value
				
# 			if fc_session[0]['session_key'] != None:
# 				fc_session = fc_session
# 				fc_data = {
# 							'fc_session': fc_session
# 				}
# 				login_data.update(fc_data)
# 			else:
# 				fc_session = None

# 			if kc_session[0]['session_key'] != None :
# 				kc_session = kc_session[0]
# 				kc_data = {
# 							'kc_session': kc_session
# 				}
# 				login_data.update(kc_data)
# 			else:
# 				kc_session = None

			if output != None :
				is_admin =  output['is_admin']
				bo_access   = UserModel().check_bo_access(email,2,society_id,conf_id) # for check back office admin access
				if bo_access["is_admin"] == 1 :
					db_pass =  output['password']
					if password == db_pass:
						user_id = output['user_id']
						Auth.bologin(login_data,society_id)
						datas = {
							'user_id'   : output['user_id'],
							'log'       : "back office login",
							'app_type'  : Helper.AppType,
							'society_id': society_id,
							'conf_id'   : conf_id,
							'log_at'    : now
							}
						BOModel().insert_back_offie_login_logs(datas)
						del_status_id = 2 # success data
						return redirect(url_for('trade_reg.Index_user',conf_id=conf_id,conf_key=conf_key,del_status_id=del_status_id))                 
					else:
						flash("No-Match-Password",'errorMsg')
						return redirect (url_for('back_office.Home',conf_id=conf_id,conf_key=conf_key))
				else:
					flash("Access-Denied",'errorMsg')
					return redirect (url_for('back_office.Home',conf_id=conf_id,conf_key=conf_key))
			else:
				flash("No-data",'errorMsg')
				return redirect (url_for('back_office.Home',conf_id=conf_id,conf_key=conf_key))

		flash("Invaild login",'errorMsg')
		return redirect (url_for('back_office.Home',conf_id=conf_id,conf_key=conf_key))


@app.route('/<int:conf_id>/<conf_key>/bo_trade_logout', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.bo_trade_login_required
def BoTradeLogout(conf_id,conf_key):
	conf       = Auth.getConf(conf_id,conf_key)
	society_id = conf['society_id']
	if Auth.bocheck(society_id):
		Auth.bologout(society_id)
		if conf_id and int(conf_id) == 46:
			return render_template('view_delegates_list/view_delegate_list_login.html',conf=conf)
		else:
			return redirect (url_for('back_office.Home',conf_id=conf_id,conf_key=conf_key))
	else:
		flash("Invaild login")
		return redirect (url_for('back_office.Home',conf_id=conf_id,conf_key=conf_key))


@app.route('/<int:conf_id>/<conf_key>/bo/login', methods = ["GET", "POST"])
@RouteGroup.conf_required
def Home(conf_id,conf_key):
	conf       = Auth.getConf(conf_id,conf_key)
	society_id = conf['society_id']
	if conf:
		if Auth.bocheck(society_id):
			return redirect (url_for('trade_reg.Index_user',conf_id=conf_id,conf_key=conf_key)) 
		else:
			return render_template('backoffice_user/login.html',conf=conf)
	else:
		return "Invaild Link"       



# @app.route('/<int:conf_id>/<conf_key>/bo', methods = ["GET", "POST"])
# @RouteGroup.conf_required
# def HomeLanding(conf_id,conf_key):
# 	conf = Auth.getConf(conf_id,conf_key)
# 	conf_id     = conf['conf_id']
# 	society_id  = conf['society_id']
# 	now         = datetime.now()
# 	if conf:
# 		if Auth.bocheck(society_id):
# 			datas = {
# 					'user_id'   : Auth.user(society_id)['user_id'],
# 					'log'       : "login",
# 					'app_type'  : Helper.AppType,
# 					'society_id': society_id,
# 					'conf_id'   : conf_id,
# 					'log_at'    : now
# 					}
# 			BOModel().insert_back_offie_login_logs(datas)
# 			del_status_id = 2 # success data


# 			return redirect (url_for('back_office.Index_user',conf_id=conf_id,conf_key=conf_key,del_status_id=del_status_id)) 
# 		else:
# 			return redirect (url_for('back_office.Home',conf_id=conf_id,conf_key=conf_key))
# 	else:
# 		return "Invaild Link" 


@app.route("/<int:conf_id>/<conf_key>/bo/trade_index" , methods=['GET','POST'])
@RouteGroup.conf_required
# @RouteGroup.bo_trade_login_required
def TradeIndex_user(conf_id,conf_key):
	conf            = Auth.getConf(conf_id,conf_key)
	society_id      = conf['society_id']
	now             = datetime.now()
	dt_string       = now.strftime("%Y-%m-%d %H:%M:%S")
	if conf_id and conf_id == 46:
		data = BOModel().get_surgical_delegates_details(conf_id)
		if data:
			total_count = len(data)
		else:
			total_count = 0	
		return render_template('surgical_strike/bo_surgical_strike.html',conf=conf,data=data,total_count=total_count)
	else:	
		Auth_user       = Auth.user(society_id)
		prefix          = Auth_user['prefix'] or None
		name            = Auth_user['full_name'] or None
		email           = Auth_user['email']
		mobile          = Auth_user['mobile']
		user_id         = request.values.get('user_id',None)
		if user_id:
			user_id = user_id
		else:
			user_id = Auth_user['user_id']	
		
		full_name       = prefix + " " + name if prefix else name
		is_export    = False
		delegate_nos = request.values.get("delegate_nos",None)
		
		if delegate_nos:
			text_placeholder                   = delegate_nos
			delegate_nos,from_del_no,to_del_no = conv_dele_no(delegate_nos)
		else:
			text_placeholder                   = None
			delegate_nos,from_del_no,to_del_no = None,None,None
	
		receipt_nos = request.values.get("receipt_nos",None)
		
		if receipt_nos:
			text_placeholder_receipt_nos              = receipt_nos
			receipt_nos,from_receipt_no,to_receipt_no = conv_dele_no(receipt_nos)
		else:
			text_placeholder_receipt_nos              = None
			receipt_nos,from_receipt_no,to_receipt_no = None,None,None
			
		del_status_id = request.values.get("del_status_id","2")
		if conf["is_gen_number"] == "ref_number":
			orderby =  request.values.get("orderby","d.ref_no_only")
		else:	
			orderby = request.values.get("orderby","d.delegate_no")
		search_data = {
				'delegate_nos'    : delegate_nos,
				'from_del_no'     : from_del_no,
				'to_del_no'       : to_del_no,
				'receipt_nos'     : receipt_nos,
				'from_receipt_no' : from_receipt_no,
				'to_receipt_no'   : to_receipt_no,
				'search'          : request.values.get("search",None),
				'user_type'       : request.values.get("user_type",None),
				'reg_mode'        : request.values.get("reg_mode",None),
				'pay_mode'        : request.values.get("pay_mode",None),
				'del_status_id'   : del_status_id,
				'From'            : request.values.get("From",None),
				'to'              : request.values.get("to",None),
				'orderby'         : orderby,
				'order_type'      : request.values.get("order_type","desc"),
				'amount_from'	  : request.values.get("amount_from",None),
				'amount_to'		  : request.values.get("amount_to",None),
				'role'		      : request.values.get("role",None)
			}
		
	
		page  = request.values.get("page",1)
		if  "chetankharkande4045@gmail.com" in email  and int(conf_id) == 5:
			limit = request.values.get("limit",10)
		else :
			limit = request.values.get("limit",100)
	
		page        = conv_int(page)
		limit       = conv_int(limit)
		total_count = BOModel().get_countBOModel(conf_id)
		numPages    = math.ceil(total_count/limit)
		
		for i in range(1,numPages+1):
			pagenum=i
		
		submit_btn=request.values.get('submit_btn',None)
	
		#Post method block start
		if request.method == "POST":
			submit_btn=request.values.get('submit_btn',None)
			#if reset true search data all value set none 
			if request.values.get('reset_btn',None):
				search_data['delegate_nos']     =  None
				search_data['from_del_no']      =  None
				search_data['to_del_no']        =  None
				search_data['receipt_nos']      =  None
				search_data['from_receipt_no']  =  None
				search_data['to_receipt_no']    =  None
				search_data['search']           =  None
				search_data['user_type']        =  None
				search_data['reg_mode']         =  None
				search_data['pay_mode']         =  None
				search_data['del_status_id']    =  None
				search_data['From']             =  None
				search_data['to']               =  None
				search_data['amount_to'] 		=  None
				search_data['amount_from']      =  None
				if conf['is_gen_number'] == 'ref_number':
					search_data['orderby']          =  "d.ref_no_only"
				else:	
					search_data['orderby']          =  "d.delegate_no"
				search_data['order_type']       =  "desc"
				search_data['role']             =  None
				
			if submit_btn == '<' and page >1:
				page  = page -1 
				offset=int((page-1)*limit)
			elif submit_btn == '>' and numPages>page :
				page  = page +1
				offset=int((page-1)*limit)
			else:
				page=page
				offset=int((page-1)*limit)
		else:
			offset=int((page-1)*limit)
		#post method block end
	
	
		offset=int((page-1)*limit)
	
		filter_btn  =request.values.get('filter_btn',None)
		if  not submit_btn and  filter_btn  :
			filter_visible = 1
		elif   submit_btn and  filter_btn  :
			filter_visible = 0  
		elif not submit_btn and not filter_btn :
			filter_visible = 0
		else :
			filter_visible = 0
			# filter_visible = 1  #here submit button click filter will not shows           
		if request.values.get('export_btn',None):
			offset = None
			limit = None
			is_export = True
	
		output  = TradeModel().getdata_trade(search_data['delegate_nos'],search_data['from_del_no'],search_data['to_del_no'],search_data['receipt_nos'],search_data['from_receipt_no'],search_data['to_receipt_no'],search_data['search'],search_data['user_type'],search_data['del_status_id'],search_data['From'],search_data['to'],search_data['orderby'],search_data['order_type'],search_data['reg_mode'],search_data['pay_mode'],search_data['amount_from'],search_data['amount_to'],limit,offset,conf_id,society_id,search_data['role'],user_id)
		
		for index,value in enumerate(output):
			if index == 0:
				data = value
			if index == 1:
				datas = value
			if index == 2:
				color = value
			if index == 3:
				payment_types = value
			if index == 4:
				addons = value
			if index == 5:
				role = value	
	
		if datas:
			total_list = len(datas)
		else:
			total_list = 0


		if is_export == True:
			if data:
				if conf['is_gen_number'] == 'ref_number':
					export_columns = ["ref_no","name", "membership_no", "member_type", "total_amt", "remarks", "paid_at",  "payment_method", "is_generate", "gender", "mobile", "email", "address","city", "state_name", "mc_number", "mc_state", "api_payment_id", "receipt_no",  "reg_for", "parent_name", "parent_email", "parent_mobile", "accom_persons", "role", "delegate_remarks"]
					col_name = ['Reference no', 'Name','Membership no', 'User Type', 'Amount','Remarks' , 'Paid on','Payment Method','Registered Mode','Gender', 'Mobile No.','Email Id' ,'Address','City','State','MCI Number','MCI State','Transaction Id','Receipt no','Registered For','Registered By ','Registered By Email Id','Registered By Mobile No.','accom_persons','role','delegate_remarks']
				else:
					export_columns = ["delegate_no","name", "membership_no", "member_type", "total_amt", "remarks", "paid_at",  "payment_method", "is_generate", "gender", "mobile", "email", "address","city", "state_name", "mc_number", "mc_state", "api_payment_id", "receipt_no",  "reg_for", "parent_name", "parent_email", "parent_mobile", "accom_persons", "role", "delegate_remarks"]
					col_name = ['Delegate no', 'Name','Membership no', 'User Type', 'Amount','Remarks' , 'Paid on','Payment Method','Registered Mode','Gender', 'Mobile No.','Email Id' ,'Address','City','State','MCI Number','MCI State','Transaction Id','Receipt no','Registered For','Registered By ','Registered By Email Id','Registered By Mobile No.','accom_persons','role','delegate_remarks']
				return ExportDownloadXSL(datas,export_columns,col_name,conf_key)
			else:
				flash("No Record Found !..")    
		html = render_template('trade/index/index_table.html' ,user_data = data ,offset=offset,conf_id=conf_id,conf_key=conf_key,conf=conf,payment_types=payment_types,search_data=search_data,limit=limit,page=page,dt_string=dt_string,str=str,int=int)
		
		if total_list:
			numpages = math.ceil(total_list/limit)
		else:
			numpages = 0    
		
		return render_template('trade/index/user_register.html' ,user_data= data,color=color,search_data=search_data,text_placeholder =text_placeholder,limit=limit,offset=offset,page=page,total_list=total_list,text_placeholder_receipt_nos=text_placeholder_receipt_nos,numpages=numpages,filter_visible = filter_visible ,table_val =  html,conf=conf,payment_types=payment_types,addons=addons,str=str,del_status_id=del_status_id,role=role,user_id=user_id)

def conv_int(value):
	try:    
		intval = int(value)
		return intval
	except:
		return None

def conv_dele_no(value):
	delegate_nos = None
	from_del_no  = None
	to_del_no    = None

	if ',' in value or len(value) == 1 :
		delegate_nos = value
	elif '-' in value:
		result   = value.split('-')
		if result and len(result)>0:
			from_del_no = result[0] if result[0] else None 
			to_del_no   = result[1] if result[1] else None
	else:
		delegate_nos = value        
	return delegate_nos,from_del_no,to_del_no


def conv_recepit_no(value):
	receipt_nos = None
	from_receipt_no  = None
	to_receipt_no    = None

	if ',' in value or len(value) == 1 :
		receipt_nos = value
	elif '-' in value:
		result   = value.split('-')
		if result and len(result)>0:
			from_receipt_no = result[0] if result[0] else None 
			to_receipt_no   = result[1] if result[1] else None
	else:
		receipt_nos = value     
	return receipt_nos,from_receipt_no,to_receipt_no    

	  

def DownloadCSV(data,conf_key):
	now    = datetime.now()
	date   = now.strftime("%Y-%m-%d %H:%M")
	output = io.StringIO()
	writer = csv.writer(output)
	# writer = csv.writer(output,delimiter=' ',quotechar='|', quoting=csv.QUOTE_MINIMA)
	line = ['Delegate no', 'Name','Membership no', 'User Type', 'Amount','Remarks' , 'Paid on','Payment Method','Registered Mode','Gender', 'Mobile No.','Email Id' ,'Address','City','State','MCI Number','MCI State','Transaction Id','Receipt no','Registered For','Registered By ','Registered By Email Id','Registered By Mobile No.']
	writer.writerow(line)
	for row in data:
		line = [row['delegate_no'] ,row['name'],row['membership_no'] , row['member_type'], row['total_amt'],row['remarks'],row['paid_at'],row['payment_method'], row['is_generate'],row['gender'] , row['mobile'], row['email'],row['address'], row['city'], row['state_name'], row['mc_number'],row['mc_state'],row['api_payment_id'], row['receipt_no'] ,row['reg_for'], row['parent_name'] ,  row['parent_email'] ,  row['parent_mobile']]
		writer.writerow(line)

	output.seek(0)
	return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+str(conf_key)+"_Delegates_Report_"+str(date)+".csv"})


# Date    : 07-07-2023 (ramya) 
# Purpose : to export report Download in XSL format

def ExportDownloadXSL(data_name,export_columns,col_name,conf_key):
		now      = datetime.now()
		date     = now.strftime("%Y-%m-%d %H:%M")
		output   = io.BytesIO()
		Workbook = xlwt.Workbook()
		sh       = Workbook.add_sheet('Report')
		idx      = 0
		a 		 = 0
		for row in col_name:
			sh.write(0,a,row)
			a+=1
		b=0
		sno_val = 0
		
		for row in data_name:
			for i in export_columns:
				sh.write(idx+1, b, row[i])
				b+=1
			b=0
			idx+=1
			
		Workbook.save(output)

		output.seek(0)

		now    = datetime.now()

		date   = now.strftime("%Y-%m-%d %H:%M")

		return Response(output, mimetype="application/ms-excel", headers={"Content-Disposition":"attachment;filename="+str(conf_key)+"_Delegates_Report_"+str(date)+".xls"})


@app.route('/bo_check_addons_new', methods = [ "GET","POST"])
def BoCheckAddonsNew():
	now    = datetime.now()
	date   = now.strftime("%Y-%m-%d %H:%M")
	curr_dt = now.strftime("%Y-%m-%d %H:%M:%S")
	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') or 0
	
	delegate_addons = BOModel().check_delegate_addons(delegate_id,conf_id)
	
	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,curr_dt,conf_id,addon_ids)
	return render_template('backoffice_user/addons_modal.html' , delegate_addons= delegate_addons,reg_types=reg_types,addons=addons,str=str,conf=conf)


@app.route('/<int:conf_id>/<conf_key>/bo/trade_edit_remarks',methods = ["POST"])
def TradeEditRemarks(conf_id,conf_key):
	conf          = Auth.getConf(conf_id,conf_key)
	payment_id    = request.values.get('payment_id',None)
	remarks       = request.values.get('remarks',None)
	del_status_id = request.values.get('del_status_id',None)
	edit_remarks  = BOModel().edit_remarks(payment_id,remarks)
	flash("Updated Successfully....","successMsg")
	return redirect(url_for('trade_reg.TradeIndex_user',conf_id=conf_id,conf_key=conf_key,del_status_id=del_status_id))


@app.route('/<int:conf_id>/<conf_key>/check_addons_new', methods = [ "GET","POST"])
def CheckAddonsNew(conf_id,conf_key):
	conf            = Auth.getConf(conf_id,conf_key)
	now             = datetime.now()
	delegate_id     = request.values.get('delegate_id',0)
	delegate        = BOModel().check_delegate_addons(delegate_id)
	reg_types       = BOModel().get_addon_reg_type_for_modal()
	addons          = BOModel().get_addonsBOModel(delegate_id,now,conf_id)
	return render_template('backoffice_user/addons_modal.html' , delegate= delegate,reg_types=reg_types,addons=addons,str=str,conf=conf)

'''------------------------Back Office End --------------------------------------------------  '''

'''-------------- Pay Now Button Payment Proccess Starts ----------------------------------------------'''

@app.route('/<int:conf_id>/<conf_key>/bo/bo_payment', methods = ["GET","POST"])
@RouteGroup.conf_required
def BoPayment(conf_id,conf_key):
	now              = datetime.now()
	created_at       = now.strftime("%Y-%m-%d %H:%M:%S")
	conf             = Auth.getConf(conf_id,conf_key)
	submit_btn       = request.values.get('sub_btn')
	society_id       = conf['society_id']
	
	user_id          = Auth.user(society_id)['user_id']
	full_name        = request.values.get('name')
	email            = request.values.get('email')
	mobile           = request.values.get('mobile')
	delegate_ids     = request.values.getlist('checklist')
	show_msg         = request.values.get('show_msg')
	if len(full_name) == 0 or len(mobile) == 0 or len(email) == 0 : 
		flash("Please fill the data","Payerror")
		return redirect(url_for('back_office.BoDelegate',conf_id=conf_id,conf_key=conf_key))
	elif len(delegate_ids)> 0 :
		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')      
		
		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     = app_name
		unique_id       = app_key+"_"+unique_id
		delegate_ids    = (",".join(delegate_ids))
		app_type        = Helper.AppType
		if submit_btn == "Pay Now":
			is_generate     = 0
			is_generate_link_payment = 0
			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)
			if usp_del_generate_payement :
				return redirect(url_for('user.GeneratePostPayment',conf_id=conf_id,conf_key=conf_key,delegate_ids=delegate_ids,full_name=full_name,email=email,mobile=mobile,is_generate_link_payment=is_generate_link_payment))
			else :
				flash("Please select atleast one delegate to proceed further","Payerror")
				return redirect(url_for('back_office.BoRegister',conf_id=conf_id,conf_key=conf_key))        
		else:
			is_generate     = 1
			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,society_id,app_type,conf_id)    
			if usp_del_generate_payement :
				for delegate in usp_del_generate_payement:
					payment_id  = delegate['payment_id']
				return redirect(url_for('user.GenerateDelegateMail',conf_id=conf_id,conf_key=conf_key,payment_id=payment_id,unique_id=unique_id,full_name=full_name,email=email,is_generate_link_payment=is_generate_link_payment,show_msg=show_msg))
			else :
				flash("Please select atleast one delegate to proceed further","Payerror")
				return redirect(url_for('back_office.BoDelegate',conf_id=conf_id,conf_key=conf_key))
	
	else :
		flash("Please select atleast one delegate to proceed further","Payerror")
		return redirect(url_for('back_office.BoDelegate',conf_id=conf_id,conf_key=conf_key))


'''-------------- Pay Now Button Payment Proccess Ends ----------------------------------------------'''

@app.route('/<int:conf_id>/<conf_key>/bo/trade_bo_post_offline_payment', methods = ["POST"])
@RouteGroup.conf_required
def TradeBoPostOfflinePayment(conf_id,conf_key):
	conf             = Auth.getConf(conf_id,conf_key)
	# regex            = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
	submit_btn       = request.values.get('sub_btn')
	delegate_ids     = request.values.getlist('delegate_ids')
	payment_method   = request.values.get('method')
	remarks          = request.values.get('remarks')
	receipt_mail     = request.values.get('receipt_mail')
	confimation_mail = request.values.get('confimation_mail')
	txn_id           = request.values.get('txn_id')
	custom_email     = request.values.get('custom_email')
	paid_by          = request.values.get('paid_by')
	receipt_type     = request.values.get('multiple_receipt')
	now              = datetime.now()
	dt_string        = now.strftime("%Y-%m-%d %H:%M:%S")
	society_id       = conf['society_id']
	auth_users       = Auth.user(society_id)
	if auth_users :
		user_id          =   auth_users["user_id"]
		full_name        =   auth_users["full_name"]
		email            =   auth_users["email"]
		mobile           =   auth_users["mobile"]
	else :
		flash("Invaild login" ,"errorMsg")
		return redirect(url_for('back_office.Home',conf_id=conf_id,conf_key=conf_key))	

	if receipt_type == 'multiple_receipt':
		del_list = list(map(int, delegate_ids[0].split(',')))
		for delegate_id in del_list:
			delegate =  UserModel().get_delegate(delegate_id)		
			if paid_by :
				full_name = paid_by
				email     = None
				mobile    = None
			else:
				name      = delegate['full_name']
				prefix    = delegate['prefix']
				full_name = prefix + " " + name if prefix else name
				email     = delegate['email']
				mobile    = delegate['mobile']

			if len(custom_email) > 0 and custom_email is not None:
				if paid_by :
					full_name = paid_by
				else :
					full_name = None
				
				email        = custom_email
				mobile       = None
				receipt_mail = 'receipt_mail'

			new_datetime = now + timedelta(milliseconds=1)
			unique_id    = new_datetime.strftime('%Y%m%d%H%M%S%f')
			now = datetime.now()

			# Add 1 millisecond to the current datetime

			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

			payment_for     = app_name
			unique_id       = app_key+"_"+unique_id
			app_type        = Helper.AppType
			is_generate     = 1

			if payment_method == "Free": # return "free" 
				generate_payement = BOModel().usp_del_generate_free_payement(unique_id,delegate_id,user_id,payment_for,payment_method,remarks,full_name,email,mobile,is_generate,created_at,txn_id,society_id,app_type,conf_id)
			else: # return "cash"
				generate_payement = BOModel().usp_del_generate_cash_payement(unique_id,delegate_id,user_id,payment_for,payment_method,remarks,full_name,email,mobile,is_generate,created_at,txn_id,society_id,app_type,conf_id)
			
			if generate_payement :
				BoPaymentServerResponseLoop(conf_id,conf_key,user_id,unique_id,payment_method,receipt_mail,confimation_mail)
				# return redirect(url_for('back_office.BoPaymentServerResponse',user_id=user_id,unique_id=unique_id,payment_method=payment_method,receipt_mail=receipt_mail,confimation_mail=confimation_mail,conf_id=conf_id,conf_key=conf_key))     
				incompleted_template    = BOget_parent_incompleted_delegates(user_id,conf_id,conf_key)
				data={
						'status': 2,
						'msg'   : 'Registered Completed',
						'incompleted_template':incompleted_template
				}
		
				# return redirect(url_for('back_office.BoPaymentServerResponse',user_id=user_id,unique_id=unique_id,payment_method=payment_method,receipt_mail=receipt_mail,confimation_mail=confimation_mail,conf_id=conf_id,conf_key=conf_key))     
			else :
				flash("Please select atleast one delegate","Payerror")
				return redirect(url_for('back_office.BoRegister',conf_id=conf_id,conf_key=conf_key))
		return jsonify(data)
			
	else:	
		if len(delegate_ids)> 0 :
			del_list = str(delegate_ids).split(",")

			if len(del_list) == 1:
				delegate_id = delegate_ids[0]
				delegate =  UserModel().get_delegate(delegate_id)
				
				if paid_by :
					full_name = paid_by
					email     = None
					mobile    = None
				else:
					name      = delegate['full_name']
					prefix    = delegate['prefix']
					full_name = prefix + " " + name if prefix else name
					email     = delegate['email']
					mobile    = delegate['mobile']

			else:
				full_name = paid_by		

			if len(custom_email) > 0 and custom_email is not None:
				if paid_by :
					full_name = paid_by
				else :
					full_name = None
				
				email        = custom_email
				mobile       = None
				receipt_mail = 'receipt_mail'

			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

			payment_for     = app_name
			unique_id       = app_key+"_"+unique_id
			delegate_ids    = (",".join(delegate_ids))
			app_type        = Helper.AppType
			is_generate     = 1

			if payment_method == "Free": # return "free" 
				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)
			else: # return "cash"
				generate_payement = BOModel().usp_del_generate_cash_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)
			
			if generate_payement :
				return redirect(url_for('back_office.BoPaymentServerResponse',user_id=user_id,unique_id=unique_id,payment_method=payment_method,receipt_mail=receipt_mail,confimation_mail=confimation_mail,conf_id=conf_id,conf_key=conf_key))
			else :
				flash("Please select atleast one delegate","Payerror")
				return redirect(url_for('back_office.BoRegister',conf_id=conf_id,conf_key=conf_key))
			
		else :
			flash("Please select atleast one delegate to proceed further","Payerror")
			return redirect(url_for('back_office.Index_user',conf_id=conf_id,conf_key=conf_key))


# updated at 2023-12-08 16:05 Sathosh G

@app.route('/<int:conf_id>/<conf_key>/payment_server_response_loop', methods = ["GET", "POST"])
# @RouteGroup.conf_required
def BoPaymentServerResponseLoop(conf_id,conf_key,user_id,unique_id,payment_method,receipt_mail,confimation_mail):
	conf                = Auth.getConf(conf_id,conf_key)
	status              = "success"
	now                 = datetime.now()
	dt_string           = now.strftime('%Y-%m-%d %H:%M:%S')
	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
		amount 		  = getData_1['amount'] or "0.00"

	delegate_ids      = delegate_ids.split(',') 
	data                = {'status' : status,'updated_at' :dt_string,'paid_at' :dt_string,'payment_method':payment_method}
	update_and_get_data = BOModel().updatePayment(unique_id,data,dt_string) # update payment status in your table
	if update_and_get_data == "updated" and status =="success":
		u = BOModel()
		if len(delegate_ids) > 0 :
			roles = []
			for index,value in enumerate(getData) :
				# del_id_1 = delegate_ids[index]
				range_1  = value["range_1"]
				role     = value["role"]
				roles.append(role) 

			roles = list(dict.fromkeys(roles))
			i = 0	
			for role in roles:
				generatedDelegates = BOModel().BOdelegate_no_generate(unique_id,conf_id,role)
				i = i+ 1	

			# flash("Payment successful.","successMsg")
		if generatedDelegates:
				receipt_mail_sent = 0
				for delegate in generatedDelegates:
					delegate_id  = delegate['delegate_id']
					delegate_no   = delegate['delegate_no']
					# Code testing start
					if len(delegate_ids) == 1:
						if confimation_mail == "confimation_mail" and receipt_mail == "receipt_mail":
							if payment_method and payment_method.lower() != "free": 
								BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,1,email)
						elif confimation_mail == "confimation_mail":  
							BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,delegate,1,None)
							if payment_method and payment_method.lower() != "free": 
								BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,0,email)
						elif receipt_mail == "receipt_mail" and receipt_mail_sent == 0:
							receipt_mail_sent = 1
							# Added Status
							if payment_method and payment_method.lower() != "free": 
								receipt_datas = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
								if receipt_datas:
									BoReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],1,None)	
						else:
							# Added Status
							if payment_method and payment_method.lower() != "free": 
								receipt_datas = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
								BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,0,email)
					else:
						if confimation_mail == "confimation_mail": 
							BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,delegate,1,None)
						else:
							pass

						# Added Status
						if payment_method and payment_method.lower() != "free": 
							receipt_datas = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
							if receipt_mail == "receipt_mail" and receipt_mail_sent == 0:
								receipt_mail_sent = 1
								if receipt_datas:
									# flash("An amount of Rs.{} 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(amount,conf_name,email,receipt_no,delegate_nos),"successMsg")
									BoReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],1,None)
								else:
									BoReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],0,None)
							else:
								BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,0,None)

		
		r_data    =  generatedDelegates[0]
		r_amount  = r_data['total_amount']
		conf_name = r_data['conf_name']
		email     = r_data['parent_email']
		ref_nos   = r_data['ref_nos']

		if str(r_amount) == "0.00":
			r_amount = "Free"
		else:
			r_amount = int(r_amount)
			r_amount = f"{r_amount:,}"
			r_amount = "Rs."+r_amount+"/-"

		if int(session.get('showSuccessMsg',0)) == 0:
			session["showSuccessMsg"] = 1
			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(r_amount,email,receipt_no),"successMsg")
			else:
				confimation_mail_link = "/bo_view_confirmation_delegate_mail/"+str(conf_id)+"/"+str(conf_key)+"/"+str(delegate_id)

				delegate_nos = delegate_no
				delegate_no = '<a href="'+confimation_mail_link+'" target="_blank" >'+str(delegate_nos)+'</a>'

				badge_print_url = "https://conference.numerotech.com/"+str(conf_id)+"/"+str(conf_key)+"/delegate_batch_print_from_reg?del_nos="+str(delegate_nos)+"&is_kit=1"
				btn_link = '<a href="'+badge_print_url+'" target="_blank"  > <i class ="fa fa-print fa-1x"></i> <span aria-hidden="true" title="Print Badge">Print Badge</span></a>' 
				
				if conf_id in [8,18,22,17,19,41,32,36,44,27,10,38]:
					btn_link = btn_link
				else:
					btn_link = ""

				if payment_method and payment_method.lower() != "free":
					if conf['is_gen_number'] == 'ref_number':
						flash("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. {} .Reference no(s). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,ref_nos,btn_link),"successMsg")
					else:
						flash("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). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,delegate_nos,btn_link),"successMsg")
				else:
					if conf['is_gen_number'] == 'ref_number':
						flash("An amount of {} has been made towards {} registration. \nA delegate registration confirmation email has been sent to the email id of the delegate(s). Reference no(s). {}  <br/> {}".format(r_amount,conf_name,ref_nos,btn_link),"successMsg")
					else:
						flash("An amount of {} has been made towards {} registration. \nA delegate registration confirmation email has been sent to the email id of the delegate(s). Delegate no(s). {}  <br/> {}".format(r_amount,conf_name,delegate_nos,btn_link),"successMsg")
		session["showSuccessMsg"] = 0  
	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")
	
	society_id      = conf['society_id']
	Auth_user       = Auth.user(society_id)
	name            = Auth_user['full_name'] or None
	payment_method  = "Paid by "+name

	data                = {'payment_method':payment_method}
	update_and_get_data = TradeModel().updatePaymentTrade(unique_id,data) # update payment status in your table
	
	if badge_table:
		update_badge_data = BOModel().update_delegates_in_dele_badge(delegate_no,conf_id,badge_table,is_update=1)  # 1 For Offline Registration


@app.route('/<int:conf_id>/<conf_key>/bo/bo_post_payment', methods = ["POST"])
@RouteGroup.conf_required
def BoPostPayment(conf_id,conf_key):
	conf          = Auth.getConf(conf_id,conf_key)
	society_id    = conf['society_id']
	submit_btn    = request.values.get('sub_btn')
	delegate_ids  = request.values.getlist('checklist')
	full_name     = request.values.get('full_name')
	email         = request.values.get('email')
	mobile    	  = request.values.get('mobile')
	unique_id     = request.values.get('unique_id')
	user_id       = request.values.get('user_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 len(delegate_ids)> 0 :   
		if submit_btn == "Pay Now":
			if len(payment_types) == 1:
				if payment_type == "PAYMENT GATEWAY":
					return redirect(url_for('user.CallPayment',conf_id = conf_id,conf_key=conf_key,unique_id=unique_id))
				else:
					getData     = UserModel().getDataforPayments(unique_id)
					getData     = getData[0]
					amount      = getData['amount']
					payment_id  = getData['payment_id']
					delegate_id = delegate_ids
					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)
					# 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:
				getData     = UserModel().getDataforPayments(unique_id)
				getData     = getData[0]
				amount      = getData['amount']
				payment_id  = getData['payment_id']
				delegate_id = delegate_ids
				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)
		else:
			
			return redirect(url_for('back_office.BoGeneratePostPayment',conf_id=conf_id,conf_key=conf_key,delegate_ids=delegate_ids,full_name=full_name,email=email,mobile=mobile))
	else :
		flash("Please select atleast one delegate to proceed further","Payerror")
		return redirect(url_for('back_office.BoRegister',conf_id=conf_id,conf_key=conf_key))



@app.route('/<int:conf_id>/<conf_key>/payment_server_response', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoPaymentServerResponse(conf_id,conf_key):
	conf                = Auth.getConf(conf_id,conf_key)
	status              = "success"
	user_id             = request.values.get('user_id')
	unique_id           = request.values.get('unique_id')
	payment_method      = request.values.get('payment_method')
	# return "success"
	receipt_mail        = request.values.get('receipt_mail')
	confimation_mail    = request.values.get('confimation_mail')
	now                 = datetime.now()
	dt_string           = now.strftime('%Y-%m-%d %H:%M:%S')
	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
		amount        = getData_1['amount'] or "0.00"

	delegate_ids      = delegate_ids.split(',') 
	data                = {'status' : status,'updated_at' :dt_string,'paid_at' :dt_string,'payment_method':payment_method}
	update_and_get_data = BOModel().updatePayment(unique_id,data,dt_string) # update payment status in your table
	if update_and_get_data == "updated" and status =="success":
		u = BOModel()
		if len(delegate_ids) > 0 :
			roles = []
			for index,value in enumerate(getData) :
				# del_id_1 = delegate_ids[index]
				range_1  = value["range_1"]
				role     = value["role"]
				roles.append(role) 

				
				# if conf_id == 1 :
				# 	generatedDelegates = BOModel().BOSpecificDelegateNoGenerate(unique_id,conf_id,range_1,role,del_id_1)
				# else : 
				# 	generatedDelegates = BOModel().BOdelegate_no_generate(unique_id,conf_id)
			roles = list(dict.fromkeys(roles))
			i = 0	
			for role in roles:
				generatedDelegates = BOModel().BOdelegate_no_generate(unique_id,conf_id,role)
				i = i+ 1	

			flash("Payment successful.","successMsg")
		if generatedDelegates:
			ref_nos      = []
			delegate_nos = []
			receipt_mail_sent = 0
			for delegate in generatedDelegates:
				delegate_id  = delegate['delegate_id']
				delegate_no  = delegate['delegate_no']
				ref_no       = delegate['ref_no']
				if ref_no:
					ref_nos.append(ref_no)

				if delegate_no:
					delegate_nos.append(delegate_no)
				
				# Code testing start
				if len(delegate_ids) == 1:
					if confimation_mail == "confimation_mail" and receipt_mail == "receipt_mail":
						if payment_method and payment_method.lower() != "free":
							BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,1,email)
					elif confimation_mail == "confimation_mail":  
						BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,delegate,1,None)
						if payment_method and payment_method.lower() != "free":
							BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,0,email)
					elif receipt_mail == "receipt_mail" and receipt_mail_sent == 0:
						receipt_mail_sent = 1
						# Added Status
						if payment_method and payment_method.lower() != "free":
							receipt_datas = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
							if receipt_datas:
								BoReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],1,None)	
					else:
						# Added Status
						if payment_method and payment_method.lower() != "free":
							receipt_datas = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
							BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,0,email)
				else:
					if confimation_mail == "confimation_mail": 
						BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,delegate,1,None)
					else:
						pass
					
					# Added Status
					if payment_method and payment_method.lower() != "free":
						receipt_datas = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
						if receipt_mail == "receipt_mail" and receipt_mail_sent == 0:
							receipt_mail_sent = 1
							if receipt_datas:
								# flash("An amount of Rs.{} 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(amount,conf_name,email,receipt_no,delegate_nos),"successMsg")
								
								BoReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],1,None)
							else:
								BoReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],0,None)
						else:
							BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,0,None)
					# code testing end					
		# if len(delegate_ids) == 1:
		# 	if confimation_mail == "confimation_mail" and receipt_mail == "receipt_mail":
		# 		BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,1,email)
		# 	else:
		# 		receipt_datas = u.receipt_no_generate_and_get(unique_id,conf_id)
		# 		BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,0,email)
		# else:
		# 	if confimation_mail == "confimation_mail":
		# 		BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,delegate,1,None)
		# 	else:
		# 		pass     
		# 	receipt_datas = u.receipt_no_generate_and_get(unique_id,conf_id)
		# 	if receipt_mail == "receipt_mail":
		# 		if receipt_datas:
		# 			# flash("An amount of Rs.{} 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(amount,conf_name,email,receipt_no,delegate_nos),"successMsg")
		# 			BoReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],1,None)
		# 		else:
		# 			BoReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_datas[0],0,None)
		# 	else:
		# 		BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,0,None)
		
		if ref_no:
			ref_nos = str(ref_nos).replace("['",'').replace("']",'').replace("'",'')

		if delegate_no:
			delegate_nos = str(delegate_nos).replace("[",'').replace("]",'')

		r_data    =  generatedDelegates[0]
		r_amount  = r_data['total_amount']
		conf_name = r_data['conf_name']
		email     = r_data['parent_email']

		if str(r_amount) == "0.00":
			r_amount = "Free"
		else:
			r_amount = int(r_amount)
			r_amount = f"{r_amount:,}"
			r_amount = "Rs."+r_amount+"/-"

		# flash("An amount of Rs.{} 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). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,delegate_nos,btn_link),"successMsg")
		if int(session.get('showSuccessMsg',0)) == 0:
			session["showSuccessMsg"] = 1
			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(r_amount,email,receipt_no),"successMsg")
			else:
				confimation_mail_link = "/bo_view_confirmation_delegate_mail/"+str(conf_id)+"/"+str(conf_key)+"/"+str(delegate_id)

				delegate_nos = delegate_no
				delegate_no = '<a href="'+confimation_mail_link+'" target="_blank" >'+str(delegate_nos)+'</a>'

				badge_print_url = "https://conference.numerotech.com/"+str(conf_id)+"/"+str(conf_key)+"/delegate_batch_print_from_reg?del_nos="+str(delegate_nos)+"&is_kit=1"
				btn_link = '<a href="'+badge_print_url+'" target="_blank"  > <i class ="fa fa-print fa-1x"></i> <span aria-hidden="true" title="Print Badge">Print Badge</span></a>' 
				
				if conf_id in [8,18,22,17,19,41,32,36,44,27,10,38]:
					btn_link = btn_link
				else:
					btn_link = ""

				if payment_method and payment_method.lower() != "free":
					if conf['is_gen_number'] == 'ref_number':
						flash("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. {} .Reference no(s). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,ref_nos,btn_link),"successMsg")
					else:    
						flash("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). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,delegate_nos,btn_link),"successMsg")
				else:
					if conf['is_gen_number'] == 'ref_number':
						flash("An amount of {} has been made towards {} registration. \nA delegate registration confirmation email has been sent to the email id of the delegate(s). Reference no(s). {}  <br/> {}".format(r_amount,conf_name,ref_nos,btn_link),"successMsg")
					else:    
						flash("An amount of {} has been made towards {} registration. \nA delegate registration confirmation email has been sent to the email id of the delegate(s). Delegate no(s). {}  <br/> {}".format(r_amount,conf_name,delegate_nos,btn_link),"successMsg")  

		session["showSuccessMsg"] = 0
	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")
	
# 	badge_data = MoveDelegateDataToBadge(conf_id,conf_key)
	if badge_table:
		update_badge_data = BOModel().update_delegates_in_dele_badge(delegate_no,conf_id,badge_table,is_update=1)  # 1 For Offline Registration
	incompleted_template    = BOget_parent_incompleted_delegates(user_id,conf_id,conf_key)
	data={
			'status': 2,
			'msg'   : 'Registered Completed',
			'incompleted_template':incompleted_template
	}
	return jsonify(data)

def MoveDelegateDataToBadge(conf_id,conf_key):
	url = 'https://conference.numerotech.com/'+str(conf_id)+'/'+conf_key+'/move_delegates'
	r = requests.get(url)
	return "true"


@app.route('/<int:conf_id>/<conf_key>/<parent_user_id>/bo_get_parent_incompleted_delegates', methods = ["GET", "POST"])
def BOget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key):
	conf          = Auth.getConf(conf_id,conf_key)
	unique_id     = None
	society_id    = conf['society_id']
	payment_types = BOModel().get_payment_types(conf_id)
	delegateData  = BOModel().get_incompleted_delegates_by_parent_user_id(parent_user_id,unique_id,conf_id,reg_mode=1)
	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)
		del_html_data = render_template('offlines/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,payment_types=payment_types)
	else:
		del_html_data = ""
	return del_html_data	


@app.route('/<int:conf_id>/<conf_key>/spot_common_payment_server_response', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoSpotCommonPaymentServerResponse(conf_id,conf_key):
	conf                = Auth.getConf(conf_id,conf_key)
	status              = "success"
	success_msg			= ''
	user_id             = request.values.get('user_id')
	unique_id           = request.values.get('unique_id')
	payment_method      = request.values.get('payment_method')
	role      			= request.values.get('role')
	register_id      	= request.values.get('register_id')
	# return "success"
	confirmation_mail   = request.values.get('confirmation_mail') # added confirmation_mail
	receipt_mail        = request.values.get('receipt_mail') # added receipt_mail
	now                 = datetime.now()
	dt_string           = now.strftime('%Y-%m-%d %H:%M:%S')
	getData             = BOModel().BOgetDataforPayments(unique_id,conf_id)
	# 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
		amount        = getData_1['amount'] or "0.00"
		r_amount      = amount

	delegate_ids      = delegate_ids.split(',') 
	data                = {'status' : status,'updated_at' :dt_string,'paid_at' :dt_string,'payment_method':payment_method}
	update_and_get_data = BOModel().updatePayment(unique_id,data,dt_string) # update payment status in your table
	if update_and_get_data == "updated" and status =="success":
		roles = []
		for index,value in enumerate(getData) :
			range_1  = value["range_1"]
			role     = value["role"]
			roles.append(role) 

		roles = list(dict.fromkeys(roles))
		i = 0	
		for role in roles:	
			generatedDelegates = BOModel().BOdelegate_no_generate(unique_id,conf_id,role)
			i = i+ 1
			
		if generatedDelegates:
			for delegate in generatedDelegates:
				delegate_id   = delegate['delegate_id']
				delegate_no   = delegate['delegate_no']
				ref_no        = delegate['ref_no']

		badge_table = conf['del_table_name'] 
		if register_id  :
			self_spot_entry_update = SpotRegModel().update_completed_registered_delegates(register_id,delegate_no,conf_id)
		else : 
			pass

		if badge_table:
			update_badge_data = BOModel().update_delegates_in_dele_badge(delegate_no,conf_id,badge_table,is_update=2)  # 2 For Spot Registration
		status = 1
		if confirmation_mail == "confirmation_mail" and receipt_mail == "receipt_mail":
			if payment_method and payment_method.lower() != "free":
				success_msg = BoSpotConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,1,email)
		elif confirmation_mail  == "confirmation_mail" :
			BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1,None)
			if payment_method and payment_method.lower() != "free":
				success_msg = BoSpotConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,0,email)
		elif receipt_mail == "receipt_mail":
			# Added Status
			if payment_method and payment_method.lower() != "free":
				BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,1,None)
				success_msg = BoSpotConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,0,email)
		else:
			# Added Status
			if payment_method and payment_method.lower() != "free":
				BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,0,None)
				success_msg = BoSpotConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,0,email)
			else:
				if str(r_amount) == "0.00":
					r_amount = "Free"
				else:
					r_amount = int(r_amount)
					r_amount = f"{r_amount:,}"
					r_amount = "Rs."+r_amount+"/-"	
				
				confimation_mail_link = "/bo_view_confirmation_delegate_mail/"+str(conf_id)+"/"+str(conf_key)+"/"+str(delegate_id)

				delegate_nos = delegate_no
				delegate_no = '<a href="'+confimation_mail_link+'" target="_blank" >'+str(delegate_nos)+'</a>'

				badge_print_url = "https://conference.numerotech.com/"+str(conf_id)+"/"+str(conf_key)+"/delegate_batch_print_from_reg?del_nos="+str(delegate_nos)+"&is_kit=1"
				btn_link = '<a href="'+badge_print_url+'" target="_blank"  > <i class ="fa fa-print fa-1x"></i> <span aria-hidden="true" title="Print Badge">Print Badge</span></a>' 
				
				if conf_id in [8,18,22,17,19,41,32,36,44,27,10,38]:
					btn_link = btn_link
				else:
					btn_link = ""
				
				if conf['is_gen_number'] == 'ref_number':
					success_msg = "An amount of {} has been made towards {} registration.\nA delegate registration confirmation email has been sent to the email id of the delegate(s). Reference no(s). {}  <br/> {}".format(r_amount,conf['conf_name'],ref_no,btn_link)
				else:    
					success_msg = "An amount of {} has been made towards {} registration.\nA delegate registration confirmation email has been sent to the email id of the delegate(s). Delegate no(s). {}  <br/> {}".format(r_amount,conf['conf_name'],delegate_no,btn_link)	     

		if success_msg:
			success_msg = success_msg
		else:
			if str(r_amount) == "0.00":
				r_amount = "Free"
			else:
				r_amount = int(r_amount)
				r_amount = f"{r_amount:,}"
				r_amount = "Rs."+r_amount+"/-"	
			
			confimation_mail_link = "/bo_view_confirmation_delegate_mail/"+str(conf_id)+"/"+str(conf_key)+"/"+str(delegate_id)

			delegate_nos = delegate_no
			delegate_no = '<a href="'+confimation_mail_link+'" target="_blank" >'+str(delegate_nos)+'</a>'

			badge_print_url = "https://conference.numerotech.com/"+str(conf_id)+"/"+str(conf_key)+"/delegate_batch_print_from_reg?del_nos="+str(delegate_nos)+"&is_kit=1"
			btn_link = '<a href="'+badge_print_url+'" target="_blank"  > <i class ="fa fa-print fa-1x"></i> <span aria-hidden="true" title="Print Badge">Print Badge</span></a>' 
			
			if conf_id in [8,18,22,17,19,41,32,36,44,27,10,38]:
				btn_link = btn_link
			else:
				btn_link = ""
			if conf['is_gen_number'] == 'ref_number':
				success_msg = "An amount of {} has been made towards {} registration.\nA delegate registration confirmation email has been sent to the email id of the delegate(s). Reference no(s). {}  <br/> {}".format(r_amount,conf['conf_name'],ref_no,btn_link)	 
			else:
				success_msg = "An amount of {} has been made towards {} registration.\nA delegate registration confirmation email has been sent to the email id of the delegate(s). Delegate no(s). {}  <br/> {}".format(r_amount,conf['conf_name'],delegate_no,btn_link)	 
	else:
		status = 0
		success_msg = "Failed"
	
	data={
			'status'      : status,
			'success_msg' : success_msg,
			'msg'         :'Registered Completed'

	}
	return jsonify(data)


@app.route('/bo/bo_spot_confirmation_and_receipt_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
# @RouteGroup.bo_trade_login_required
def BoSpotConfirmationAndReceiptDelegagteMail(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']
		payment_method  =  receipt_data['payment_method']

		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"]

		########### Ganesan Nov 25 ,2022
		# add kit counter for session map
		del_table_name  = conf["del_table_name"]
		if del_table_name :
			kc_del_sess_table = conf["kc_del_session_table_name"]
			fc_del_sess_table = conf["fc_del_session_table_name"]
			if is_kit and int(is_kit)  > 0 :
				session_table = "numerotech_foodkit.kc_sessions"
				del_ses_table = kc_del_sess_table
			else : 
				session_table = "numerotech_foodkit.fc_sessions"
				del_ses_table = fc_del_sess_table
			
			del_id_int = int(delegate_no)
			insert_session = BOModel().sessionMapSpotReg(conf_id,del_id_int,del_table_name,kc_del_sess_table,fc_del_sess_table)

		badge_print_url = "https://conference.numerotech.com/"+str(conf_id)+"/"+str(conf_key)+"/delegate_batch_print_from_reg?del_nos="+str(delegate_nos)+"&is_kit="+str(is_kit)
		
		btn_link = '<a href="'+badge_print_url+'" target="_blank"  > <i class ="fa fa-print fa-1x"></i> <span aria-hidden="true" title="Print Badge">Print Badge</span></a>' 
		
		if conf_id in [8,18,22,17,19,41,32,36,44,27,10,38]:
			btn_link = btn_link
		else:
			btn_link = ""

# 		if del_table_name and conf_id == 12 :
# 			otp_1 = BOModel().getOTPforConfirmationMail(delegate_no,conf_id,del_table_name)
# 		else :
# 			pass	
		
		if otp_1 :
			otp = otp_1["otp"]
			
		else:
			otp = None
		

		confimation_mail_link = "/bo_view_confirmation_delegate_mail/"+str(conf_id)+"/"+str(conf_key)+"/"+str(delegate_id)	
		delegate_no = '<a href="'+confimation_mail_link+'" target="_blank" >'+delegate_nos+'</a>'	
		
		# Added Status
		if payment_method and payment_method.lower() != "free":
			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). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,delegate_no,btn_link)
			# subject      = "Confirmation and Receipt Mail for Delegate Registration."
			subject      = "Confirmation and Receipt Mail for Delegate Registration - " + name + " ("+  str(delegate_no) + ")."
		else :
			success_msg = "An amount of {} has been made towards {} registration.\nA delegate registration confirmation email has been sent to the email id of the delegate(s). Delegate no(s). {}  <br/> {}".format(r_amount,conf_name,delegate_no,btn_link)
			# subject      = "Confirmation Mail for Delegate Registration."
			subject = "Confirmation of registration - {}".format(delegate_no)


		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,otp=otp)
		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('/bo_receipt_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_data,is_send,email):
	conf            = 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   = 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']    
		
		receipt_no    = receipt_data['receipt_no']
		delegate_id   = receipt_data['delegate_ids']
		amount        = receipt_data['amount']
		conf_name     = receipt_data['conf_name']
		delegate_nos  = receipt_data['delegate_nos']
		ref_nos       = receipt_data['ref_nos']

		if str(amount) == "0.00":
			amount = "Free"
		else:
			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 = amount
		else:
			amount = "Rs."+amount+"/-"

		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)

		btn_link = ""

		if delegate_nos :
			badge_print_url = "https://conference.numerotech.com/"+str(conf_id)+"/"+conf_key+"/delegate_batch_print_from_reg?del_nos="+delegate_nos 
			btn_link = '<a href="'+badge_print_url+'" target="_blank"  ><i class ="fa fa-print fa-1x"></i> <span aria-hidden="true" title="Print Badge">Print Badge</span></a>' 
		if conf_id in [8,41,44,10,38]:
			btn_link = btn_link
		else:
			btn_link = ""

		if int(session.get('showSuccessMsg',0)) == 0:
			session["showSuccessMsg"] = 1
			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")
			else:
				if conf['is_gen_number'] == 'ref_number':
					flash("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. {} .Reference no(s). {}  <br/> {}".format(amount,conf_name,email,receipt_no,ref_nos,btn_link),"successMsg")
				else:
					flash("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). {}  <br/> {}".format(amount,conf_name,email,receipt_no,delegate_nos,btn_link),"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),
					'is_offline'  : 1
					}
					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 html



@app.route('/bo_sample_receipt_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoSampleReceiptDelegagteMail(conf_id,conf_key,unique_id,receipt_data,is_send,email):
	conf            = 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   = 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']    
		
		receipt_no    = receipt_data['receipt_no']
		delegate_id   = receipt_data['delegate_ids']
		amount        = receipt_data['amount']
		conf_name     = receipt_data['conf_name']
		delegate_nos  = receipt_data['delegate_nos']

		if str(amount) == "0.00":
			amount = "Free"
		else:
			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 = amount
		else:
			amount = "Rs."+amount+"/-"

		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)

		badge_print_url = "https://conference.numerotech.com/"+str(conf_id)+"/"+conf_key+"/delegate_batch_print_from_reg?del_nos="+delegate_nos 
		btn_link = '<a href="'+badge_print_url+'" target="_blank"  ><i class ="fa fa-print fa-1x"></i> <span aria-hidden="true" title="Print Badge">Print Badge</span></a>' 
		if conf_id in [8,41,44,10,38]:
			btn_link = btn_link
		else:
			btn_link = ""

		if int(session.get('showSuccessMsg',0)) == 0:
			session["showSuccessMsg"] = 1
			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")
			else:
				flash("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). {}  <br/> {}".format(amount,conf_name,email,receipt_no,delegate_nos,btn_link),"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),
					'is_offline'  : 0
					}
					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 html


@app.route('/bo_confirmation_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
def BoConfirmationDelegateMailURL(conf_id,conf_key,delegate_id):
	return BoConfirmationDelegateMail(conf_id,conf_key,delegate_id)


@RouteGroup.conf_required
def BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,delegate=None,is_send=None,email=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 delegate is None:
		delegates   = BOModel().usp_del_get_delegates_by_delegate_id(delegate_id)
		if delegates:
			delegate = delegates[0]
			
	if delegate:
		if email:
			email = email
		else:
			email        = delegate['email']

		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']
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]
		if str(amount) == "0.00":
			amount = "Free"
		else:
			amount = "Rs."+str(amount)
		
		
		is_gen_number = conf['is_gen_number']
		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)
		tricon_subject = "Book your Accommodation for TRICON now!"
		tricon_tnoa_23_html = render_template('email/tricon_tnoa_23_accommodation_mail.html',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),
					'is_offline'  : 1
					}
					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)
			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),
						'is_offline'  : 1
						}
						data_1.update(update_data) 
						UserModel().insert_mandrill_logs(data_1)
			if conf_id == 17:
				EMAIL.MailTemplateSendMail(tricon_subject,tricon_tnoa_23_html,email,mailData,conf)
		else:   
			return html     
	else :
		return None 



'''------------------------ Offine Registartion in Back Office End ----------------------------------------'''


@app.route('/bo_generate_confirmation_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoGenerateConfirmationDelegateMail(conf_id,conf_key,delegate_id,delegate,is_send):
	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 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']
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]
		if str(amount) == "0.00":
			amount = "Free"
		else:
			amount = "Rs."+str(amount) 
		
		is_gen_number = conf['is_gen_number']
		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)
		tricon_subject = "Book your Accommodation for TRICON now!"
		tricon_tnoa_23_html = render_template('email/tricon_tnoa_23_accommodation_mail.html',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),
					'is_offline'  : 0
					}
					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),
						'is_offline'  : 0
						}
						data_1.update(update_data) 
						UserModel().insert_mandrill_logs(data_1)
			if conf_id == 17:
				EMAIL.MailTemplateSendMail(tricon_subject,tricon_tnoa_23_html,email,mailData,conf)
		else:   
			return html     
	else :
		return None 


@app.route('/trade_view_confirmation_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def TradeViewConfirmationDelegateMail(conf_id,conf_key,delegate_id):
	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)
	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']
		title        = "View Confimation Mail"
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]
		if str(amount) == "0.00":
			amount = "Free"
		else:
			amount = "Rs."+str(amount)

		is_gen_number = conf['is_gen_number']
		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_data     = render_template('email/confirmation_mail_v1.html',mail_content=mail_content,conf=conf)
		html          = render_template('trade/index/view_confirmation.html',delegate=delegate,conf_id=conf_id,conf_key=conf_key,delegate_id=delegate_id,conf=conf,subject=subject,html_data=html_data,title=title)  
		return html     
	else :
		return None


@app.route('/bo_view_receipl_delegate_mail/<int:conf_id>/<conf_key>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoViewReceiptDelegagteMail(conf_id,conf_key,unique_id):
	conf = 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)
	receipt_datas   = BOModel().BOreceipt_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']
		amount       = receipt_data['amount']
		# return amount
		conf_name    = receipt_data['conf_name']
		delegate_nos = receipt_data['delegate_nos']
		title        = "View Receipt Mail"
		if str(amount) == "0.00":
			amount = "Free"
		else:
			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 = amount
		else:
			amount = "Rs."+amount+"/-"
		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_data         = render_template('email/receipt_email_v1.html',mail_content=mail_content,conf=conf)
		html         = render_template('email/view_receipt_email.html',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,unique_id=unique_id,subject=subject,html_data=html_data)
	return html


@app.route('/bo_send_confirmation_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
def BoSendConfirmationDelegateMail(conf_id,conf_key,delegate_id):
	email = request.values.get('sample_email',None)
	BoSampleConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1,email)
	return "Confirmation mail sent Successful"


@app.route('/bo_send_receipl_delegate_mail/<int:conf_id>/<conf_key>/<unique_id>', methods = ["GET", "POST"])
def BoSendReceiptDelegagteMail(conf_id,conf_key,unique_id):
	email = request.values.get('sample_email',None)
	if email:
		BoSampleReceiptDelegagteMail(conf_id,conf_key,unique_id,None,1,email)
	else:
		BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,1,email)	
	return "Receipt mail sent Successful"



	
# updated on 06 Oct 2022
# @app.route('/<int:conf_id>/<conf_key>/bo_reg_report_view', methods = ["GET", "POST"])
# @RouteGroup.conf_required
# def BORegReportView(conf_id,conf_key):
# 	conf              = Auth.getConf(conf_id,conf_key)
# 	today_count       = 0
# 	total_count       = 0
# 	today_paid_amount = 0
# 	total_paid_amount = 0
# 	today_del_count   = 0
# 	total_del_count   = 0 
# 	dt_string         = datetime.now().strftime("%d-%m-%Y %I:%M %p")
# 	date_1            = request.values.get("date",None)
# 	current_dt        = datetime.now() - timedelta(1)
# 	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
# 	base_url 	      = request.host_url
# 	if "https" in base_url :
# 		pass
# 	else :
# 		base_url = base_url.replace("http" ,"https")
# 	if date_1 :
# 		previous_date = date_1
# 	else :
# 		yesterday     = datetime.now() - timedelta(1)
# 		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
# 		previous_date = yesterday

# 	reg_data = BOModel().GetRegDataForMail(previous_date,conf_id)
# 	if reg_data :
# 		for index, value in enumerate(reg_data):
# 			addon_type_id       = value["addon_type_id"]
# 			today_count         = today_count+value['today_count']
# 			total_count         = total_count+value['total_count']
# 			today_paid_amount   = today_paid_amount+value['today_paid_amount']
# 			total_paid_amount   = total_paid_amount+value['total_paid_amount']
# 			if addon_type_id == 1:
# 				today_del_count         = today_del_count+value['today_count']
# 				total_del_count         = total_del_count+value['total_count']

# 		return render_template('email/reg_report_email.html',previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count,base_url=base_url)
# 	else :
# 		return "Registration record not exists."    


@app.route('/<int:conf_id>/<conf_key>/daily_count_delegate_mail', methods = ["GET", "POST"])
@RouteGroup.conf_required
def DailyCountDelegateMail(conf_id,conf_key):
	conf   = Auth.getConf(conf_id,conf_key)
	if conf :
		send_manual    = request.values.get('send_manual',None)
		date_1         = request.values.get("date",None)
		reg_end_on     = conf['reg_end_on']
		current_tm     = datetime.now()
		dt_string      = current_tm.strftime("%Y-%m-%d %I:%M %p")
		# print("CRON JOB Executed at " + dt_string)
		next_day       = reg_end_on + timedelta(days=2)
		# next_day       = "2021-05-30"
		# next_day     = datetime.strptime(next_day, '%Y-%m-%d').date()
		if send_manual and int(send_manual) > 0  :
			DelegateReportSendMail(conf_id,conf_key,date_1)
			return "Mail sent Successful."
		else :
			if next_day > current_tm :
				if (current_tm.hour == 5 and current_tm.minute > 45) or (current_tm.hour == 6 and current_tm.minute < 25):
					print("Time match - " + dt_string)
				# if ( current_tm.hour == 9 or current_tm.hour == 10 ):
					DelegateReportSendMail(conf_id,conf_key,date_1)
					return "Mail sent Successful."
				else:
					print("Time not match - " + dt_string)
					return ( dt_string +" Time not match ")  
			else:
				return "Registration closed"    
	else :
		return "Invalid  conf-id or conf-key"           

# def DelegateReportSendMail(conf_id,conf_key,date_1):
# 	conf              = Auth.getConf(conf_id,conf_key)
# 	mailData          = None
# 	row_val           = []
# 	today_count       = 0
# 	total_count       = 0
# 	today_paid_amount = 0
# 	total_paid_amount = 0
# 	today_del_count   = 0
# 	total_del_count   = 0
# 	current_dt        = datetime.now() - timedelta(1)
# 	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
# 	base_url 	      = request.host_url
# 	if "https" in base_url :
# 		pass
# 	else :
# 		base_url = base_url.replace("http" ,"https")
	
# 	if date_1 :
# 		previous_date = date_1
# 	else :
# 		yesterday     = datetime.now() - timedelta(1)
# 		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
# 		previous_date = yesterday
	
# 	users             = BOModel().get_daily_count_send_mail(conf_id,conf_key)   
# 	dt_string         = datetime.now().strftime("%d-%m-%Y %I:%M %p")

# 	if users :
# 		reg_data = BOModel().GetRegDataForMail(previous_date,conf_id)
# 		for index, value in enumerate(reg_data):
# 			addon_type_id       = value["addon_type_id"]
# 			today_count         = today_count+value['today_count']
# 			total_count         = total_count+value['total_count']
# 			today_paid_amount   = today_paid_amount+value['today_paid_amount']
# 			total_paid_amount   = total_paid_amount+value['total_paid_amount']
# 			if addon_type_id == 1:
# 				today_del_count         = today_del_count+value['today_count']
# 				total_del_count         = total_del_count+value['total_count']
# 		if reg_data :
# 			html    = render_template('email/reg_report_email.html',previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count,base_url=base_url)
# 			subject = conf['conf_name']+"- Delegate Registration Count as on {}".format(dt_string)
# 			for index,value in enumerate(users):
# 				receiver_email      = value['email']
# 				receiver_mobile     = value['mobile']
# 				receiver_name       = value['full_name']
# 				created_at = datetime.now()
# 				# call here send mail function
# 				EMAIL.MailTemplateSendMail(subject,html,receiver_email,mailData,conf)
# 				# EMAIL.sendMail(subject,html,receiver_email,conf)
# 				stmt_1              =('''INSERT INTO send_mail_index ( conf_id,receiver_name,receiver_email,receiver_mobile,mail_send_at,created_at) VALUES ''')
# 				row_val.append(('(' + ''''{}','{}',"{}",'{}','{}','{}' ''' +')').format(conf_id,receiver_name,receiver_email,receiver_mobile,created_at,created_at))
			
# 			stmt_1 = stmt_1 +  ",".join(row_val)
# 			stmt_1 = stmt_1 + ';'   

# 			BOModel().save_delegate_report_sendmail(stmt_1)
# 			return "success"
# 	else : 
# 		return "Report data is not available."      
 


@app.route('/bo_send_confirmation_and_receipl_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>/<unique_id>', methods = ["GET", "POST"])
def BoSendConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id):
	email = request.values.get('sample_email',None)
	if email:
		BoSampleConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,1,email)
	else:
		BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,1,email)	
	return "Confirmation and Receipt mail sent Successful"


@app.route('/bo_view_confirmation_and_receipt_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoViewConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id):
	conf           = Auth.getConf(conf_id,conf_key)
	del_table_name = None
	otp_1          = None
	if conf :
		del_table_name = conf["del_table_name"]
	receipt_datas    = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
	if receipt_datas:
		receipt_data = receipt_datas[0]
	if receipt_data:
		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']
		if not  r_amount :
			r_amount = "0.00"

		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
		if r_amount == "Free" : 
			amount_in_words = "Free"
		else :
			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"]
		if str(c_amount) == "0.00":
			c_amount = "Free"
		else:
			c_amount = "Rs."+str(c_amount)
		# Code updated by Ganesan on Dec 09 ,2022 for karavali 2022 pedicon conference
# 		if del_table_name and conf_id == 12 :
# 			otp_1 = BOModel().getOTPforConfirmationMail(delegate_no,conf_id,del_table_name)
# 		else :
# 			pass	
		
		if otp_1 :
			otp = otp_1["otp"]
			
		else:
			otp = None
		

		# subject      = "Receipt #{} for delegate registration ({})".format(receipt_no,r_amount)
		subject      = "Receipt #{} - Confirmation and Receipt Mail for Delegate Registration.".format(receipt_no)
		html_data    = 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,otp=otp)
		html         = render_template('email/view_confirmation_and_receipt_email.html',conf_id=conf_id,conf_key=conf_key ,conf=conf,delegate_id=delegate_id,unique_id=unique_id,subject=subject,delegate=delegate,html_data=html_data)
	
	return html

@app.route('/bo/bo_confirmation_and_receipt_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoConfirmationAndReceiptDelegagteMail(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)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	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:
		receipt_no     = receipt_data['receipt_no']
		r_amount       = receipt_data['amount']
		conf_name      = receipt_data['conf_name']
		delegate_nos   = receipt_data['delegate_nos']
		ref_nos        = receipt_data['ref_nos']
		payment_method = receipt_data['payment_method']

		if not  r_amount :
			r_amount = "0.00"

		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
		if r_amount == "Free" : 
			amount_in_words = "Free"
			amount_for_convertion = None
		else :
			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:
		if email:
			email = email
		else:
			email        = delegate['email']
		# 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']
		ref_no       = delegate['ref_no']
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]

		# subject      = "Receipt #{} for delegate registration ({})".format(receipt_no,r_amount)
		if conf['is_gen_number'] == 'ref_number':
			badge_print_url = ""
		else:
		  #  badge_print_url = ""
			badge_print_url = "https://conference.numerotech.com/"+str(conf_id)+"/"+str(conf_key)+"/delegate_batch_print_from_reg?del_nos="+delegate_nos 
		
		btn_link = '<a href="'+badge_print_url+'" target="_blank"  ><i class ="fa fa-print fa-1x"></i> <span aria-hidden="true" title="Print Badge">Print Badge</span></a>' 

		if conf_id in [8,1,16,41,44,10,38]:
			btn_link = btn_link
		else:
			btn_link = ""

		if int(session.get('showSuccessMsg',0)) == 0:
			session["showSuccessMsg"] = 1
			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(r_amount,email,receipt_no),"successMsg")
			else:
				if payment_method and payment_method.lower() != "free":
					if conf['is_gen_number'] == 'ref_number':
						flash("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. {} .Reference no(s). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,ref_nos,btn_link),"successMsg")
					else:    
						flash("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). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,delegate_nos,btn_link),"successMsg")
				else:
					if conf['is_gen_number'] == 'ref_number':
						flash("An amount of {} has been made towards {} registration. \nA delegate registration confirmation email has been sent to the email id of the delegate(s). Reference no(s). {}  <br/> {}".format(r_amount,conf_name,email,ref_nos,btn_link),"successMsg")    
					else:    
						flash("An amount of {} has been made towards {} registration. \nA delegate registration confirmation email has been sent to the email id of the delegate(s). Delegate no(s). {}  <br/> {}".format(r_amount,conf_name,email,delegate_nos,btn_link),"successMsg")
		
		# Code updated by Ganesan on Dec 09 ,2022 for karavali 2022 pedicon conference
# 		if del_table_name and conf_id == 12 :
# 			otp_1 = BOModel().getOTPforConfirmationMail(delegate_no,conf_id,del_table_name)
# 		else : 
# 			pass	
		
		if otp_1 :
			otp = otp_1["otp"]
			
		else:
			otp = None
		
		# Added Status	
		is_gen_number = conf['is_gen_number']
		if payment_method and payment_method.lower() != "free":
			if is_gen_number == 'ref_number':
				subject = "Confirmation for Delegate Registration - " + name + " ("+  str(ref_no) + ")."
			else:
				subject      = "Confirmation and Receipt Mail for Delegate Registration - " + name + " ("+  str(delegate_no) + ")."
		else:
			if is_gen_number == 'ref_number':
				subject = "Confirmation for Delegate Registration - " + name + " ("+  str(ref_no) + ")."
			else:
				subject      = "Confirmation for Delegate Registration - " + name + " ("+  str(delegate_no) + ")."
		
		# subject      = "Confirmation and Receipt Mail for Delegate Registration - " + name + " ("+  str(delegate_no) + ")."
		
		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,otp=otp)
		tricon_subject = "Book your Accommodation for TRICON now!"
		tricon_tnoa_23_html = render_template('email/tricon_tnoa_23_accommodation_mail.html',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),
					'is_offline'  : 1
					}
					data_1.update(update_data) 
					UserModel().insert_mandrill_logs(data_1)
			if conf_id == 17:
				EMAIL.MailTemplateSendMail(tricon_subject,tricon_tnoa_23_html,email,mailData,conf)
		else:   
			return html 		

	return html



@app.route('/bo/bo_sample_confirmation_and_receipt_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoSampleConfirmationAndReceiptDelegagteMail(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)
	now             = datetime.now()
	dt_string       = now.strftime('%Y-%m-%d %H:%M:%S')
	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:
		receipt_no     = receipt_data['receipt_no']
		r_amount       = receipt_data['amount']
		conf_name      = receipt_data['conf_name']
		delegate_nos   = receipt_data['delegate_nos']
		ref_nos        = receipt_data['ref_nos']
		payment_method = receipt_data['payment_method']

		if not  r_amount :
			r_amount = "0.00"

		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
		if r_amount == "Free" : 
			amount_in_words = "Free"
		else :
			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:
		if email:
			email = email
		else:
			email        = delegate['email']
		# 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']
		ref_no       = delegate['ref_no']
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]

		# subject      = "Receipt #{} for delegate registration ({})".format(receipt_no,r_amount)
		
		if conf['is_gen_number'] == 'ref_number':
			badge_print_url = ""
		else:
			badge_print_url = "https://conference.numerotech.com/"+str(conf_id)+"/"+conf_key+"/delegate_batch_print_from_reg?del_nos="+delegate_nos 
		
		btn_link = '<a href="'+badge_print_url+'" target="_blank"  ><i class ="fa fa-print fa-1x"></i> <span aria-hidden="true" title="Print Badge">Print Badge</span></a>' 

		if conf_id in [8,1,16,41,44,10,38]:
			btn_link = btn_link
		else:
			btn_link = ""

		if int(session.get('showSuccessMsg',0)) == 0:
			session["showSuccessMsg"] = 1
			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(r_amount,email,receipt_no),"successMsg")
			else:
				if payment_method and payment_method.lower() != "free":
					if conf['is_gen_number'] == 'ref_number':
						flash("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. {} .Reference no(s). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,ref_nos,btn_link),"successMsg")
					else:    
						flash("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). {}  <br/> {}".format(r_amount,conf_name,email,receipt_no,delegate_nos,btn_link),"successMsg")
				else:
					if conf['is_gen_number'] == 'ref_number':
						flash("An amount of {} has been made towards {} registration. \nA delegate registration confirmation email has been sent to the email id of the delegate(s). Reference no(s). {}  <br/> {}".format(r_amount,conf_name,ref_nos,btn_link),"successMsg")
					else:
						flash("An amount of {} has been made towards {} registration. \nA delegate registration confirmation email has been sent to the email id of the delegate(s). Delegate no(s). {}  <br/> {}".format(r_amount,conf_name,delegate_nos,btn_link),"successMsg")
		
		# Code updated by Ganesan on Dec 09 ,2022 for karavali 2022 pedicon conference
# 		if del_table_name and conf_id == 12 :
# 			otp_1 = BOModel().getOTPforConfirmationMail(delegate_no,conf_id,del_table_name)
# 		else : 
# 			pass	
		
		if otp_1 :
			otp = otp_1["otp"]
			
		else:
			otp = None


		# Added Status	
		if payment_method and payment_method.lower() != "free":
			if conf['is_gen_number'] == 'ref_number':
				subject = "Confirmation for Delegate Registration - " + name + " ("+  str(ref_no) + ")."
			else:
				subject      = "Confirmation and Receipt Mail for Delegate Registration - " + name + " ("+  str(delegate_no) + ")."
		else:
			if conf['is_gen_number'] == 'ref_number':
				subject = "Confirmation for Delegate Registration - " + name + " ("+  str(ref_no) + ")."
			else:
				subject      = "Confirmation for Delegate Registration - " + name + " ("+  str(delegate_no) + ")."	
		
		# subject      = "Confirmation and Receipt Mail for Delegate Registration - " + name + " ("+  str(delegate_no) + ")."

		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,otp=otp)
		tricon_subject = "Book your Accommodation for TRICON now!"
		tricon_tnoa_23_html = render_template('email/tricon_tnoa_23_accommodation_mail.html',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),
					'is_offline'  : 0
					}
					data_1.update(update_data) 
					UserModel().insert_mandrill_logs(data_1)
			if conf_id == 17:
				EMAIL.MailTemplateSendMail(tricon_subject,tricon_tnoa_23_html,email,mailData,conf)		
		else:   
			return html 		

	return html	


@app.route('/<int:conf_id>/<conf_key>/bo/bo_post_addons_add_register', methods = ["POST"])
@RouteGroup.conf_required
def BoPostAddonsAddRegister(conf_id,conf_key):
	conf              = Auth.getConf(conf_id,conf_key)
	msg               = ""
	status            = 1
	data              = ""
	
	payment_method    = request.values.get('method')
	remarks           = request.values.get('remark')
	receipt_mail      = request.values.get('receipt_mail')
	confimation_mail  = request.values.get('confimation_mail')
	txn_id            = request.values.get('txn_id')
	custom_email      = request.values.get('custom_email')
	
	delegate_id       = request.form['delegate_ids'] or None  
	
	now               = datetime.now()
	dt_string         = now.strftime("%Y-%m-%d %H:%M:%S")

	conf_id           = conf['conf_id'] 
	conf_key          = conf['conf_key']
	society_id        = conf['society_id']
	
	reg_types         = BOModel().get_addon_reg_type(conf_id)
	addons            = BOModel().get_addonsBOModel(delegate_id,now,conf_id)
	total_amount      = 0
	reg_addons        = {} 
	insert_del_addons = []
	delete_del_addons = [] 
	addon_for_pay     = []

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

	is_mandatory = {}
	for rt in reg_types:
		is_mandatory[rt['addon_type_id']]   =  rt['is_mandatory']
		values = request.values.getlist(rt.get('input_name'))
		if values:
			is_mandatory[rt['addon_type_id']] = 0
			for val in values:
				addon = reg_addons[int(val)]
				if  addon.get("delegate_addon_id") and addon.get("delegate_addon_id") > 0 and addon.get('reg_status') != 2:
					addon_for_pay.append(addon.get("delegate_addon_id"))
					total_amount = addon.get("amount",0) + total_amount
				else:
					add_data = {
								 "addon_id"         : val,
								 "amount"           : request.form['addon_amount_'+val] or addon.get("amount",0),
								 "original_amount"  : request.form['addon_amount_'+val] or addon.get("amount",0),
								 "reg_status"       : 0      
					}
					insert_del_addons.append(add_data)
					total_amount = addon.get("amount",0) + total_amount


	reg_Validation = []         
	for key in is_mandatory:
		if is_mandatory[key] == 1:
			reg_Validation.append({'key': key ,'msg': "following field is mandatory."})  
			status = 0;


	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 get_addons_data:
			is_mandatory_mc_no_state = get_addons_data['is_mandatory_mc_no_state']
			if is_mandatory_mc_no_state and is_mandatory_mc_no_state==1:
				if mc_number == None and mc_state_id == None:
					data= { 'msg':'Please fill the medical council number and medical council state.  This data is mandatorily required for '+get_addons_data['user_type'],'status' : 2}
					return jsonify(data)
				if mc_number == None :
					data= { 'msg':'Please fill the medical council number and medical council state.  This data is mandatorily required for '+get_addons_data['user_type'],'status' : 2}
					return jsonify(data)
				if mc_state_id == None:	
					data= { 'msg':'Please fill the medical council number and medical council state.  This data is mandatorily required for '+get_addons_data['user_type'],'status' : 2}
					return jsonify(data)		

	if len(insert_del_addons) > 0 or len(addon_for_pay)> 0:
		UserModel().save_delegates_addons(delegate_id,insert_del_addons,delete_del_addons,now)
		Auth_user       = Auth.user(society_id)
		prefix          = Auth_user['prefix'] or None
		name            = Auth_user['full_name'] or None
		email           = Auth_user['email']
		mobile          = Auth_user['mobile']
		user_id         = Auth_user['user_id']
		full_name       = prefix + " " + name if prefix else name
		if delegate_id:
			delegate_id = delegate_id
			delegate 	= UserModel().get_delegate(delegate_id)
			name         = delegate['full_name']
			prefix       = delegate['prefix']
			full_name    = prefix + " " + name if prefix else name
			# full_name   = delegate['full_name']
			email       = delegate['email']
			mobile      = delegate['mobile']

		if len(custom_email) > 0 and custom_email is not None: 
			full_name    = None
			email        = custom_email
			mobile       = None
			receipt_mail = 'receipt_mail'

		unique_id    = now.strftime('%Y%m%d%H%M%S')
		created_at   = now
		url 		 = conf['payment_api_url']
		r 			 = requests.get(url)
		apikey       = json.loads(r.content.decode())
		
		am_id   	 = conf['pg_appmaster_id']
		is_test 	 = conf['pg_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     = app_name
		unique_id       = app_key+"_"+unique_id
		delegate_ids    = delegate_id
		app_type        = Helper.AppType
		is_generate     = 1

		if payment_method == "Free": # return "free" 
			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)
		else: # return "cash"
			generate_payement = BOModel().usp_del_generate_cash_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)
		
		if generate_payement :
			return redirect(url_for('back_office.BoPaymentServerResponse',user_id=user_id,unique_id=unique_id,payment_method=payment_method,receipt_mail=receipt_mail,confimation_mail=confimation_mail,conf_id=conf_id,conf_key=conf_key))     
		else :
			flash("Please select atleast one delegate","Payerror")
			return redirect(url_for('back_office.BoRegister',conf_id=conf_id,conf_key=conf_key))
	else:
		data ={ 'msg':'following field is mandatory.','status':0,'data':''}	
		return jsonify(data)

@app.route('/<int:conf_id>/<conf_key>/bo/generate_payement_link', methods = ["GET","POST"])
@RouteGroup.conf_required
def BoGeneratePayementLink(conf_id,conf_key):
	conf        	 = Auth.getConf(conf_id,conf_key)
	submit_btn		 =request.values.get('sub_btn')
	# conf           = BOModel().get_conf(conf_id,conf_key)
	society_id       = conf['society_id']
	now              = datetime.now()
	created_at       = now.strftime("%Y-%m-%d %H:%M:%S")
	user_id          = Auth.user(society_id)['user_id']
	full_name        = request.values.get('name')
	email            = request.values.get('email')
	mobile           = request.values.get('mobile')
	delegate_ids     = request.values.get('delegate_ids')
	show_msg         = request.values.get('show_msg')
	addon_for_pay    = []
	total_amount     = 0
	if len(delegate_ids)> 0 :
		reg_types         = BOModel().get_addon_reg_type(conf_id)
		addons            = BOModel().get_addonsBOModel(delegate_ids,now,conf_id)
		
		reg_addons        = {} 
		insert_del_addons = []
		delete_del_addons = [] 
		
		for addon in addons:
			reg_addons[addon["addon_id"]] = addon
			if  addon.get("delegate_addon_id") and addon.get("delegate_addon_id") > 0 and addon.get('reg_status') != 2:
				delete_del_addons.append(addon["delegate_addon_id"])
			#collect all delegate_addon_id for delegate 

		is_mandatory = {}
		for rt in reg_types:
			is_mandatory[rt['addon_type_id']]   =  rt['is_mandatory']
			values = request.values.getlist(rt.get('input_name'))
			if values:
				is_mandatory[rt['addon_type_id']] = 0
				for val in values:
					addon = reg_addons[int(val)]
					if  addon.get("delegate_addon_id") and addon.get("delegate_addon_id") > 0 and addon.get('reg_status') != 2:
						addon_for_pay.append(addon.get("delegate_addon_id"))
						total_amount = addon.get("amount",0) + total_amount
					else:
						add_data = {
									 "addon_id"         : val,
									 "amount"           : request.form['addon_amount_'+val] or addon.get("amount",0),
									 "original_amount"  : request.form['addon_amount_'+val] or addon.get("amount",0),
									 "reg_status"       : 0      
						}
						insert_del_addons.append(add_data)
						total_amount = addon.get("amount",0) + total_amount



		if len(insert_del_addons) > 0 or len(addon_for_pay)> 0:
			UserModel().save_delegates_addons(delegate_ids,insert_del_addons,delete_del_addons,now)

			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     = app_name
			unique_id       = app_key+"_"+unique_id
			# delegate_ids    = (",".join(delegate_ids))
			app_type   		= Helper.AppType
			if submit_btn == "Pay Now":
				is_generate     = 0
				is_generate_link_payment = 0
				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)
				if usp_del_generate_payement :
					return redirect(url_for('user.GeneratePostPayment',conf_id=conf_id,conf_key=conf_key,delegate_ids=delegate_ids,full_name=full_name,email=email,mobile=mobile,is_generate_link_payment=is_generate_link_payment))
				else :
					flash("Please select atleast one delegate to proceed further","Payerror")
					return redirect(url_for('back_office.BoRegister',conf_id=conf_id,conf_key=conf_key))        
			else:
				is_generate     = 1
				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,society_id,app_type,conf_id)    
				if usp_del_generate_payement :
					for delegate in usp_del_generate_payement:
						payment_id  = delegate['payment_id']
					return redirect(url_for('user.GenerateDelegateMail',conf_id=conf_id,conf_key=conf_key,payment_id=payment_id,unique_id=unique_id,full_name=full_name,email=email,is_generate_link_payment=is_generate_link_payment,show_msg=show_msg))
				else:
					flash("Please select atleast one delegate to proceed further","Payerror")
					return redirect(url_for('back_office.BoDelegate',conf_id=conf_id,conf_key=conf_key))
		else:
			flash("Please select addons to proceed further","Payerror")			
			return redirect(url_for('back_office.Index_user',conf_id=conf_id,conf_key=conf_key))
	else :
		flash("Please select atleast one delegate to proceed further","Payerror")
		return redirect(url_for('back_office.BoDelegate',conf_id=conf_id,conf_key=conf_key))


@app.route('/<int:conf_id>/<conf_key>/bo_generate_delegate_no_and_receipt_no', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoGenerateDelegateNoAndReceiptNo(conf_id,conf_key):
	conf       = UserModel().get_confUserModel(conf_id,conf_key)
	unique_id  = request.values.get('unique_id')
	confirmation_mail = request.values.get('confirm_mail' or None ) or None
	receipt_mail      = request.values.get('reciept_mail'or None ) or None
	role              = None
	receipt_data       = BOModel().bo_generate_delegate_no_and_receipt_no(unique_id,conf_id,role)
	if confirmation_mail == "confirmation_mail" and receipt_mail == "reciept_mail":
		if receipt_data:
			receipt_data = receipt_data[0]
			delegate_ids  = receipt_data['delegate_ids']
			delegate_nos = receipt_data['delegate_nos']
# 		BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,1,None)
		dele_id = delegate_ids.split(",")
		for i in dele_id:
			delegate_id = i
			BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,1,None)
# 			if confirmation_mail == "confirmation_mail" :
# 				BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1,None)
# 			else:
# 				BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,0,None)
				
# 				BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1,None)	
	elif confirmation_mail == "confirmation_mail" and receipt_mail == "None":
		if receipt_data:
			receipt_data = receipt_data[0]
			delegate_ids  = receipt_data['delegate_ids']
			delegate_nos = receipt_data['delegate_nos']
		BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,0,None)
		dele_id = delegate_ids.split(",")
		for i in dele_id:
			delegate_id = i
			if confirmation_mail == "confirmation_mail" :
				BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1,None)
			else:
				BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,0,None)	
	elif receipt_mail =="reciept_mail" and confirmation_mail =="None":
		if receipt_data:
			receipt_data = receipt_data[0]
			delegate_ids  = receipt_data['delegate_ids']
			delegate_nos = receipt_data['delegate_nos']
		BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,1,None)
	else:
		if receipt_data:
			receipt_data = receipt_data[0]
			delegate_ids  = receipt_data['delegate_ids']
			delegate_nos = receipt_data['delegate_nos']
		BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,0,None)	


	if receipt_data:
		email        = receipt_data['email']
		# email          = 'sai@numerotec.com'  
		receipt_no   = receipt_data['receipt_no']
		amount       = receipt_data['amount']
		conf_name    = receipt_data['conf_name']
		ref_nos      = receipt_data['ref_nos']

		if str(amount) == "0.00":
			amount = "Free"
		else:
			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 = amount
		else:
			amount = "Rs."+amount+"/-"

		########### Ganesan Nov 25 ,2022
		# add kit counter for session map
# 		del_table_name  = conf["del_table_name"]
# 		del_nos = delegate_nos.split(",")
# 		is_kit = 1
# 		if del_nos and  del_table_name :
# 			for d_no in del_nos:
# 				delegate_no = d_no
# 				kc_del_sess_table = conf["kc_del_session_table_name"]
# 				fc_del_sess_table = conf["fc_del_session_table_name"]
# 				if is_kit and int(is_kit)  > 0 :
# 					session_table = "del_table_name.kc_sessions"
# 					del_ses_table = kc_del_sess_table
# 				else : 
# 					session_table = "del_table_name.fc_sessions"
# 					del_ses_table = fc_del_sess_table
				
# 				del_id_int = int(delegate_no)
# 				insert_session = BOModel().sessionMapSpotReg(conf_id,del_id_int,del_table_name,kc_del_sess_table,fc_del_sess_table)	
# 		else :
# 			pass
	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),"succ_msg")
	else:
		if conf['is_gen_number'] == 'ref_number':
			flash("An amount of {} has been made towards {} registration.<br/>The receipt has been email to {}.<br/>A delegate registration confirmation email has been sent to the email id of the delegate(s).<br/><br/>Receipt no. {} .Reference no(s). {}".format(amount,conf_name,email,receipt_no,ref_nos),"succ_msg")
		else:
			flash("An amount of {} has been made towards {} registration.<br/>The receipt has been email 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,delegate_nos),"succ_msg")
	return redirect (url_for('back_office.BoGetParentWaitingCompletedDelegates',conf_id=conf_id,conf_key=conf_key))


@app.route('/<int:conf_id>/<conf_key>/bo_view_waiting_for_generate_dele_no', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.bo_trade_login_required
def BoViewWaitingForGenerateDeleNo(conf_id,conf_key):
	conf         = UserModel().get_confUserModel(conf_id,conf_key)
	unique_id    = request.values.get('unique_id')
	delegate     = BOModel().usp_del_bo_view_waiting_gen_del_no_and_receipt_no(unique_id,conf_id)
	if delegate :
		delegate_id  = delegate[0]['delegate_id']
		delegate_ids = delegate[0]['delegate_ids']
		prefix       = delegate[0]['prefix']
		name         = delegate[0]['full_name']
		full_name    = prefix + " " + name if prefix else name
		email        = delegate[0]['email']
		return render_template('backoffice_user/view_waiting_for_generate_delegate_no.html',delegate=delegate,delegate_id=delegate_id,delegate_ids=delegate_ids,conf=conf,unique_id=unique_id,full_name=full_name,email=email)
	else:
		return "<h4>No data</h4>"

# UTR SEARCH START
@app.route('/<int:conf_id>/<conf_key>/bo_get_parent_waiting_completed_delegates', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.bo_trade_login_required
def BoGetParentWaitingCompletedDelegates(conf_id,conf_key):
	del_html_data = ""
	conf            = UserModel().get_confUserModel(conf_id,conf_key)
	search_data     = request.values.get('search_txt' or None) or None
	parent_user_id  = None
	# delegateData    = BOModel().bo_get_completed_waiting_delegates_by_parent_user_id(parent_user_id,conf_id)
	delegateData    = BOModel().bo_search_utr_details(parent_user_id,conf_id,search_data)
	if delegateData:
		del_html_data_dev =   render_template('backoffice_user/bo_waiting_for_gen_del_no_table.html' ,user_data = delegateData,conf_id =conf_id,conf_key=conf_key,conf_data=conf,conf=conf,str=str,type=type)
		del_html_data =   render_template('backoffice_user/bo_waiting_for_gen_del_no.html' ,user_data = delegateData,conf_id =conf_id,conf_key=conf_key,conf_data=conf,conf=conf,str=str,type=type,del_html_data_dev=del_html_data_dev)
	else:
		del_html_data = None
		del_html_data_dev =   render_template('backoffice_user/bo_waiting_for_gen_del_no_table.html' ,user_data = delegateData,conf_id =conf_id,conf_key=conf_key,conf_data=conf,conf=conf,str=str,type=type)
		del_html_data = render_template('backoffice_user/bo_waiting_for_gen_del_no.html' ,user_data = delegateData,conf_id =conf_id,conf_key=conf_key,conf_data=conf,conf=conf,str=str,type=type,del_html_data_dev=del_html_data_dev)
	
	return del_html_data

# UTR SEARCH END


@app.route('/<int:conf_id>/<conf_key>/post_reject_payment', methods = ["POST"])
@RouteGroup.conf_required
def postRejectPayment(conf_id,conf_key):
	conf             = Auth.getConf(conf_id,conf_key)
	template_name    = "rejected_payment_mail"
	mailData         = UserModel().get_mail_template(template_name,conf_id)
	now              = datetime.now()
	dt_string        = now.strftime('%Y-%m-%d %H:%M:%S')
	reject_type      = request.values.get('reject_type') or None

	delegate_id      = request.values.get('delegate_id')
	unique_id        = request.values.get('unique_id')
	full_name        = request.values.get('full_name')
	remarks          = request.values.get('remarks')
	email            = request.values.get('email')
	data  = {
		'delegate_id': delegate_id,
		'conf_id'    : conf_id,
		'unique_id'	 : unique_id,
		'is_lock'    : 0,
		'remarks'	 : remarks,
		'created_at' : now
	}
	
	if reject_type == 'proof_mistake' :
		
		del_status_id    = 7
		update_reg_status  = BOModel().bo_update_reg_status_delegates_addons(unique_id,delegate_id,now,del_status_id)
		flash('Rejected Proof',"waiting_msg")
	else :
		flash('Rejected Payment',"waiting_msg")
		update_reg_status  = BOModel().bo_update_reg_status_delegates_addons(unique_id,delegate_id,now)
	
	update = BOModel().bo_update_reject_payment(data)
# 	subject   = "Your "+conf['conf_name']+" delegate registration is NOT APPROVED"
	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,
						'remarks'       : remarks,
						'conf'          : conf
	}   
		
	mail_content = Helper.convert_html_for_mail_screen(m_data)
# 	html      =  render_template('email/upi_transaction_reject_mail.html',conf=conf,remarks=remarks,full_name=full_name)
	html      =  render_template('email/upi_transaction_reject_mail_v1.html',conf=conf,mail_content=mail_content)
	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)	
	
	return redirect(url_for('back_office.BoGetParentWaitingCompletedDelegates',conf_id=conf_id,conf_key=conf_key))
		

# edit all option starts here 2022-12-07
@app.route('/<int:conf_id>/<conf_key>/bo/trade_edit_all_option_delegate', methods = [ "GET","POST"])
@RouteGroup.conf_required
@RouteGroup.bo_trade_login_required
def TradeBoEditAllOptionDelegate(conf_id,conf_key):
	now              = datetime.now()
	curr_dt          = now.strftime("%Y-%m-%d %H:%M:%S")
	conf 			 = Auth.getConf(conf_id,conf_key)
	dt_string        = now.strftime("%Y-%m-%d %H:%M:%S")
	society_id       = conf['society_id']
	parent_user_id   = Auth.user(society_id)['user_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)
	is_custom_addons = 1
	del_status_id    = request.values.get('del_status_id')
	state_id         = UserModel().get_states()  
	country_id       = UserModel().get_country()
	reg_types        = BOModel().get_addon_reg_type(conf_id)
	paymen_details   = BOModel().get_delegate_payment_details(delegate_id,conf_id)
	reg_addon_date   = BOModel().get_reg_addon_date(delegate_id,conf_id)
	date             = reg_addon_date['start_by']
	addons           = BOModel().get_edit_all_addons(delegate_id,date,conf_id,None,is_custom_addons)
	parent_user      = UserModel().get_user(parent_user_id,society_id,conf_id)
	badge_role       = BOModel().get_badge_model(conf_id)
	payment_types    = BOModel().get_payment_types(conf_id)
	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 :
			if user and user["member_type_id"] == Custom.MemberTypeId or user["member_type_id"] == Custom.AssociateMemberTypeId or user["member_type_id"] in Custom.ASIMemberTypeId: # check user is member Custom -
				user   = OfflineModel().get_member_details(user_id,curr_dt)
				if int(str(delegate_id),0) >0:  
					delegate = BOModel().get_delegate_for_edit(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 
					return render_template('trade/index/edit_all_option.html',conf_id=conf_id,conf_key=conf_key, delegate=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,badge_role=badge_role,payment_types=payment_types,paymen_details=paymen_details,register_date=date,del_status_id=del_status_id,dt_string=dt_string)
				else:
					return render_template('trade/index/edit_all_option.html',conf_id=conf_id,conf_key=conf_key,delegate=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,badge_role=badge_role,payment_types=payment_types,paymen_details=paymen_details,register_date=date,del_status_id=del_status_id,dt_string=dt_string)           
	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   = BOModel().get_delegate_for_edit(delegate_id)

	if delegate is None:
		if user:
			delegate = user

	return render_template('trade/index/edit_all_option.html',conf_id=conf_id,conf_key=conf_key,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,badge_role=badge_role,payment_types=payment_types,paymen_details=paymen_details,register_date=date,del_status_id=del_status_id,dt_string=dt_string)



@app.route('/<int:conf_id>/<conf_key>/bo/trade_post_edit_all_option_register', methods = ["GET","POST"])
@RouteGroup.conf_required
def TradePostEditAllOptionRegister(conf_id,conf_key):
	conf             = Auth.getConf(conf_id,conf_key)
	msg              = ""
	pg_cert_path     = None
	pg_cert_name     = None	
	file             = None
	file_upload      = None # For upload certificates in delegates table # Added by Ganesan J
	is_file_upload   = 0
	user_type_id     = None
	addon_id         = None
	status           = 1
	data             = ""
	total_amount     = 0
	delegate_id      = request.form['delegate_id'] or None  
	parent_user_id   = request.form['parent_user_id'] 
	user_id          = request.form['user_id']
	now              = datetime.now()
	conf_id          = request.form['conf_id']
	conf_key         = request.form['conf_key']
	# conf             = BOModel().get_conf(conf_id,conf_key)
	society_id       = conf['society_id']
	dt_string        = now.strftime("%Y-%m-%d %H:%M:%S")
	prefix           = request.form['prefix'] or None
	full_name        = request.form['full_name'] or None
	email            = request.form['email'] 
	mobile           = request.form['mobile']
	date_of_birth    = request.form['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.form['gender'] or None
	address1         = request.form['address1'] or None
	address2         = request.form['address2'] or None
	address3         = request.form['address3'] or None
	city             = request.form['city'] or None
	pincode          = request.form['pincode'] or None
	state_id         = request.form['state_id'] or None
	country_id       = request.form['country_id'] or None
	mc_number        = request.form['mc_number'] or None
	mc_state_id      = request.form['mc_state_id'] or None
	membership_no    = request.form['membership_no'] or None
	receipt_no       = request.form['receipt_no'] or None
	remarks          = request.form['remarks'] or None
	paid_at          = request.form['paid_at'] or None
	payment_method   = request.form['payment_method'] or None
	transaction_id   = request.form['transaction_id'] or None
	tamount          = request.form['tamount'] or None
	balance_amount   = request.form['balance_amount'] or None
	refund_amount    = request.form['refund_amount'] or None
	unique_id   	 = request.form['unique_id'] or None
	role   	         = request.form['role'] or None
	register_date    = request.form['register_date'] or None
	delegate_no   	 = request.form['delegate_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
	designation      = request.values.get('designation') or None
	institution      = request.values.get('institution') or None
	nationality      = request.values.get('nationality') or None
	accom_persons    = request.values.get("accom_persons" or None)
	delegate_remarks = request.form['delegate_remarks'] or None
	is_take_part_bpw = request.values.get('is_take_part_bpw') or None
	mem_applied_at   = request.values.get('mem_applied_at') or None
	mem_is_applied   = request.values.get('mem_is_applied') or None
	mem_year         = request.values.get('mem_year') or None
	food             = request.values.get('food') or None
	age              = request.values.get('age') or None
	district         = request.values.get('district') or None	
	aadhaar_number   = request.values.get('aadhaar_number') or None
	
	# Delegate Image
	image_data           = request.values.get('delegate_image_base64',None) 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
	
	if conf_id in [26,49]:
		if aadhaar_number:
			aadhaar_number = aadhaar_number.replace("-","")
		else:
			aadhaar_number = None
	else:
		aadhaar_number = aadhaar_number

	# BOA 2024
	if int(conf_id)  in [26,49]:
		senior_file  = request.files.get('files_aadhaar',None) or None
		if senior_file:
			image_name     = "aadhaar_proof_"
			foldername     = "aadhaar_proof/"
			is_file_upload = 1
			file           = senior_file

	# TNASICON 2023	
	if conf_id and int(conf_id) in [19] :
		if addon_id:
			if int(addon_id) in [223,377,378,379]:
				file  = request.files.get('files_asi',None)	
				if file:
					image_name  = "tnasicon2023_asipayment_proof_"
					foldername  = ""
					is_file_upload = 1

	# IAP KARNATAKA 2023
	if conf_id and int(conf_id) == 36 :
		if addon_id:
			if int(addon_id) in [538,603,608]:
				file  = request.files.get('files',None)				
				if file:
					image_name     = "certificate_proof_"
					foldername     = ""
					is_file_upload = 1
	
	# MEDITER RETINA CLUB 2023 
	if conf_id and int(conf_id) == 37 :
		if addon_id:
			if int(addon_id) in [553,554,557,559,561,562,565,567,571,573,575,576]:
				file  = request.files.get('files',None)
				if file:
					image_name     = "certificate_proof_"
					foldername     = ""
					is_file_upload = 1
	# IPGS 2023	
	if conf_id and int(conf_id) == 29 :
		if addon_id:
			if int(addon_id) in [365,373,369]:
				file  = request.files.get('files_', None)
				if file:
					image_name     = "certificate_proof_"
					foldername     = ""
					is_file_upload = 1
	
	# SZTNAOI 2023
	if conf_id and int(conf_id) == 32 :
		file  = request.files.get('files',None)				
		if file:
			image_name     = "certificate_proof_"
			foldername     = ""
			is_file_upload = 1
	
	# ROCKENT 2024
	if conf_id and int(conf_id) == 49 :
		pg_file  = request.files.get('files',None)				
		if pg_file:
			image_name     = "certificate_proof_"
			foldername     = "certificats/"
			is_file_upload = 1
			file           = pg_file


	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
		else :
			return file_upload_msg
	
	conference_id     = conf_id
	reg_types         = BOModel().get_addon_reg_type(conf_id)
	addons            = BOModel().get_edit_all_addons_for_post(delegate_id,register_date,conf_id)
	reg_addons        = {} 
	insert_del_addons = []
	delete_del_addons = [] 
	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 = {}
	for rt in reg_types:
		is_mandatory[rt['addon_type_id']]   =  rt['is_mandatory']
		values = request.values.getlist(rt.get('input_name'))
		if values:
			is_mandatory[rt['addon_type_id']] = 0
			for index,val in enumerate(values):
				addon    = reg_addons[int(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
						
				add_data = {
						 "addon_id"         : val,
						 "amount"           : request.form['addon_amount_'+val] or addon.get("amount",0),
						 "original_amount"  : request.form['addon_amount_'+val] or addon.get("amount",0),
						 "reg_status"       : 2,
						 "unique_id"        : addon.get("unique_id") if addon.get("unique_id") else unique_id,
						 "is_bo_update"     : 1
					}
				total_amount = addon.get("amount",0) + total_amount
				insert_del_addons.append(add_data)
		
	reg_Validation = []         
	for key in is_mandatory:
		if is_mandatory[key] == 1:
			reg_Validation.append({'key': key ,'msg': "following field is mandatory."})  
			status = 0;

	del_data = {
				'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,
				'admin_user_id'   : parent_user_id,
				'society_id'      : society_id,
				'role'		      : role,
				'check_in_date'   : check_in_date,
				'check_out_date'  : check_out_date,
				'check_in_time'   : check_in_time,
				'check_out_time'  : check_out_time,
				'designation'	  : designation,
				'institution'	  : institution,
				'nationality'	  : nationality,
				'accom_persons'   : accom_persons,
				'delegate_remarks': delegate_remarks,
				'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,
				'aadhaar_number'  : aadhaar_number
			}

	payment_details_add = {
							'amount'		 : tamount,
							'api_payment_id' : transaction_id,
							'paid_at' 		 : paid_at,
							'updated_at'	 : updated_at,
							'refund_amount'  : refund_amount,
							'balance_amount' : balance_amount,
							'payment_method' : payment_method,
							'remarks'        : remarks,
							'receipt_no'     : receipt_no
						} 		


	cert_proof_deleted    = request.values.get('cert_proof_deleted') or 0
	asi_proof_deleted     = request.values.get('asi_proof_deleted') or 0
	res_proof_deleted     = request.values.get('res_proof_deleted_') or 0
	aadhaar_proof_deleted = request.values.get('aadhaar_proof_deleted_') or 0

	if conf_id and int(conf_id) == 32 :
		if pg_cert_path  or int(cert_proof_deleted) == 1:
			del_data['pg_cert_path'] = pg_cert_path
		if pg_cert_name  or int(cert_proof_deleted) == 1:	
			del_data['pg_cert_name'] = pg_cert_name
			
	# ROCKENT 2024
# 	if conf_id and int(conf_id) == 49 :
# 		if pg_cert_path  or int(cert_proof_deleted) == 1:
# 			del_data['pg_cert_path'] = pg_cert_path
# 		if pg_cert_name  or int(cert_proof_deleted) == 1:	
# 			del_data['pg_cert_name'] = pg_cert_name
	
	if conf_id and int(conf_id) == 19 :
		if addon_id:
			if int(addon_id) in [223,377,378,379]:
				if pg_cert_path  or int(asi_proof_deleted) == 1:
					del_data['pg_cert_path'] = pg_cert_path
				if pg_cert_name  or int(asi_proof_deleted) == 1:	
					del_data['pg_cert_name'] = pg_cert_name
			else:
				del_data['pg_cert_path'] = None
				del_data['pg_cert_name'] = None			
					
	if conf_id and int(conf_id) == 36 :
		if addon_id:
			if int(addon_id) in [538,603,608]:
				if pg_cert_path  or int(cert_proof_deleted) == 1:
					del_data['pg_cert_path'] = pg_cert_path
				if pg_cert_name  or int(cert_proof_deleted) == 1:	
					del_data['pg_cert_name'] = pg_cert_name
			else:
				del_data['pg_cert_path'] = None
				del_data['pg_cert_name'] = None			
					
	if conf_id and int(conf_id) == 37 :
		if addon_id:
			if int(addon_id) in [553,554,557,559,561,562,565,567,571,573,575,576]:
				if pg_cert_path  or int(cert_proof_deleted) == 1:
					del_data['pg_cert_path'] = pg_cert_path
				if pg_cert_name  or int(cert_proof_deleted) == 1:	
					del_data['pg_cert_name'] = pg_cert_name
			else:
				del_data['pg_cert_path'] = None
				del_data['pg_cert_name'] = None				
					
			
	if conf_id and int(conf_id)== 29 :
		if addon_id:
			if int(addon_id) in [365,373,369]:
				if pg_cert_path  or int(res_proof_deleted) == 1:
					del_data['pg_cert_path'] = pg_cert_path
				if pg_cert_name  or int(res_proof_deleted) == 1:	
					del_data['pg_cert_name'] = pg_cert_name
			else:
				del_data['pg_cert_path'] = None
				del_data['pg_cert_name'] = None
				
	# BOA 2024 Aadhaar
	if conf_id and int(conf_id) in [26,49] :
		if pg_cert_path  or int(res_proof_deleted) == 1:
			del_data['pg_cert_path'] = pg_cert_path
		if pg_cert_name  or int(res_proof_deleted) == 1:	
			del_data['pg_cert_name'] = pg_cert_name
	# BOA 2024 Aadhaar			


	if status == 1:
		app_type   = "DELEGATE"
		update        = BOModel().update_delegate(delegate_id,del_data,None,conference_id)
		if image_data:
			AWSUpload().DelegateImageUpload(delegate_id,full_name,image_data,conf_key,image_data_ext)
		else :
			if int(is_remove_del_img) == 1: 
				AWSUpload().DeleteDelegateImage(delegate_id,conf_key)    
		BOModel().save_delegates_addonsBOModel(delegate_id,insert_del_addons,delete_del_addons,now)
# 		BOModel().Update_delegates_addons(delegate_id,unique_id,addon_id,original_amount,amount,now)
		update_payment_details =  BOModel().update_payment_detail(unique_id,conf_id,app_type,payment_details_add)
# 		update_payment_details =  BOModel().update_payment_detail(unique_id,payment_details_add)
		delegate_badge_table = conf['del_table_name']
		if delegate_badge_table:
			if delegate_no:
				if update:
					update_dele_badge = BOModel().update_delegates_in_dele_badge(delegate_no,conf_id,delegate_badge_table,is_update=0) # 0 For Update Both tables only
		

		json = { 
				'msg':'Update completed ...',
				'status':status,
				'reg_validation' :  reg_Validation,

			}
		return jsonify(json)
		
		
		




# -----------------------------------working--------------------------------------------------
# @app.route('/<int:conf_id>/<conf_key>/bo/bo_post_edit_all_option_register', methods = ["GET","POST"])
# @RouteGroup.conf_required
# def BoPostEditAllOptionRegister(conf_id,conf_key):
# 	conf            = Auth.getConf(conf_id,conf_key)
# 	msg             = ""
# 	pg_cert_path    = None
# 	pg_cert_name    = None	
# 	file            = None
# 	file_upload     = None # For upload certificates in delegates table # Added by Ganesan J
# 	status          = 1
# 	data            = ""
# 	total_amount    = 0
# 	delegate_id     = request.form['delegate_id'] or None  
# 	parent_user_id  = request.form['parent_user_id'] 
# 	user_id         = request.form['user_id']
# 	now             = datetime.now()
# 	conf_id         = request.form['conf_id']
# 	conf_key        = request.form['conf_key']
# 	# conf            = BOModel().get_conf(conf_id,conf_key)
# 	society_id      = conf['society_id']
# 	dt_string       = now.strftime("%Y-%m-%d %H:%M:%S")
# 	prefix          = request.form['prefix'] or None
# 	full_name       = request.form['full_name'] or None
# 	email           = request.form['email'] 
# 	mobile          = request.form['mobile']
# 	date_of_birth   = request.form['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.form['gender'] or None
# 	address1        = request.form['address1'] or None
# 	address2        = request.form['address2'] or None
# 	address3        = request.form['address3'] or None
# 	city            = request.form['city'] or None
# 	pincode         = request.form['pincode'] or None
# 	state_id        = request.form['state_id'] or None
# 	country_id      = request.form['country_id'] or None
# 	mc_number       = request.form['mc_number'] or None
# 	mc_state_id     = request.form['mc_state_id'] or None
# 	membership_no   = request.form['membership_no'] or None
# 	receipt_no      = request.form['receipt_no'] or None
# 	remarks         = request.form['remarks'] or None
# 	paid_at         = request.form['paid_at'] or None
# 	payment_method  = request.form['payment_method'] or None
# 	transaction_id  = request.form['transaction_id'] or None
# 	tamount         = request.form['tamount'] or None
# 	balance_amount  = request.form['balance_amount'] or None
# 	refund_amount   = request.form['refund_amount'] or None
# 	unique_id   	= request.form['unique_id'] or None
# 	role   	        = request.form['role'] or None
# 	register_date   = request.form['register_date'] or None
# 	delegate_no   	= request.form['delegate_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

# 	designation     = request.values.get('designation') or None
# 	institution     = request.values.get('institution') or None
# 	nationality     = request.values.get('nationality') or None

# 	accom_persons     = request.values.get("accom_persons" or None)
# 	delegate_remarks  = request.form['delegate_remarks'] or None

# 	is_take_part_bpw = request.values.get('is_take_part_bpw') or None
	
# 	user_type_id     = None
# 	addon_id         = None


# 	# extra input fields

# 	mem_applied_at     = request.values.get('mem_applied_at') or None
# 	mem_is_applied     = request.values.get('mem_is_applied') or None
# 	mem_year           = request.values.get('mem_year') or None
# 	food               = request.values.get('food') or None
# 	age                = request.values.get('age') or None
# 	district           = request.values.get('district') or None
# 	# extra input fields
	
# 	# Start here Aadhaar
# 	aadhaar_number     = request.values.get('aadhaar_number') or None
# 	if conf_id in [26]:
# 		if aadhaar_number:
# 			aadhaar_number = aadhaar_number.replace("-","")
# 		else:
# 			aadhaar_number = None
# 	else:
# 		aadhaar_number = aadhaar_number

# 	if int(conf_id)  in [26]:
# 		file  = request.files.get('files_aadhaar',None) or None

# 	if file:
# 		image_name  = "aadhaar_proof_"
# 		foldername  = "aadhaar_proof/"
# 		file_upload = AWSUpload().AwsFileUpload(user_id,file,image_name,foldername)

# 	# 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
# 		else :
# 			return file_upload_msg
# 	# End here Aadhaar


	
# 	conference_id     = conf_id
# 	reg_types         = BOModel().get_addon_reg_type(conf_id)
# 	addons            = BOModel().get_edit_all_addons_for_post(delegate_id,register_date,conf_id)
# 	reg_addons        = {} 
# 	insert_del_addons = []
# 	delete_del_addons = [] 
# 	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 = {}
# 	for rt in reg_types:
# 		is_mandatory[rt['addon_type_id']]   =  rt['is_mandatory']
# 		values = request.values.getlist(rt.get('input_name'))
# 		if values:
# 			is_mandatory[rt['addon_type_id']] = 0
# 			for index,val in enumerate(values):
# 				addon    = reg_addons[int(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
						
# 				add_data = {
# 						 "addon_id"         : val,
# 						 "amount"           : request.form['addon_amount_'+val] or addon.get("amount",0),
# 						 "original_amount"  : request.form['addon_amount_'+val] or addon.get("amount",0),
# 						 "reg_status"       : 2,
# 						 "unique_id"        : addon.get("unique_id") if addon.get("unique_id") else unique_id,
# 						 "is_bo_update"     : 1
# 					}
# 				total_amount = addon.get("amount",0) + total_amount
# 				insert_del_addons.append(add_data)
				
# 				# addon_id = val
# 				# user_type_id    = addon.get("user_type_id")
# 				# amount          = request.form['addon_amount_'+val] or addon.get("amount",0)
# 				# original_amount = request.form['addon_amount_'+val] or addon.get("amount",0)


# 	# extra input fields
	
# 	if conf_id and int(conf_id) == 19 :
# 		if addon_id:
# 			if int(addon_id) in [223,377,378,379]:
# 				file  = request.files.get('files_asi',None)				
# 				if file:
# 					pg_cert_path = None
# 					pg_cert_name = None
# 					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        = "tnasicon2023_asipayment_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 = ""
# 							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 + 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} 
# 							file_path  = "https://delegateapp.s3.ap-southeast-1.amazonaws.com/"+foldername
			
# 							pg_cert_path = file_path
# 							pg_cert_name = file_str
			
							
# 						except ClientError as e:
# 							print(str(e))
# 							# logging.error(e)
# 							# data_1      = {'msg':'Image upload failed .Please try again.','status':0}        
# 							# json_data   = json.dumps(data_1)
# 							# return json_data
# 							return str(e)
# 							# flash('Something Error .Please Try Again')				

# 	if conf_id and int(conf_id) == 32 :
# 		file  = request.files.get('files',None)				
# 		if file:
# 			pg_cert_path = None
# 			pg_cert_name = None
# 			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        = "certificate_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 = ""
# 					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 + 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} 
# 					file_path  = "https://delegateapp.s3.ap-southeast-1.amazonaws.com/"+foldername
	
# 					pg_cert_path = file_path
# 					pg_cert_name = file_str
	
					
# 				except ClientError as e:
# 					print(str(e))
# 					# logging.error(e)
# 					# data_1      = {'msg':'Image upload failed .Please try again.','status':0}        
# 					# json_data   = json.dumps(data_1)
# 					# return json_data
# 					return str(e)
# 					# flash('Something Error .Please Try Again')
# 		else:
# 			pg_cert_path = None
# 			pg_cert_name = None
				
	
# 	# IAP PEDICON 2023
	
# 	if conf_id and int(conf_id) == 36 :
# 		if addon_id:
# 			if int(addon_id) in [538,603,608]:
# 				file  = request.files.get('files',None)				
# 				if file:
# 					pg_cert_path = None
# 					pg_cert_name = None
	
# 					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        = "certificate_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 = ""
# 							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 + 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} 
# 							file_path  = "https://delegateapp.s3.ap-southeast-1.amazonaws.com/"+foldername
	
# 							pg_cert_path = file_path
# 							pg_cert_name = file_str
	
							
# 						except ClientError as e:
# 							print(str(e))
# 							# logging.error(e)
# 							# data_1      = {'msg':'Image upload failed .Please try again.','status':0}        
# 							# json_data   = json.dumps(data_1)
# 							# return json_data
# 							return str(e)
# 							# flash('Something Error .Please Try Again')
# 				else:
# 					pg_cert_path = None
# 					pg_cert_name = None
				
# 	# MEDITERRETINA 2023
	
# 	if conf_id and int(conf_id) == 37 :
# 		if addon_id:
# 			if int(addon_id) in [553,554,557,559,561,562,565,567,571,573,575,576]:
# 				file  = request.files.get('files',None)				
# 				if file:
# 					pg_cert_path = None
# 					pg_cert_name = None
	
# 					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        = "certificate_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 = ""
# 							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 + 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} 
# 							file_path  = "https://delegateapp.s3.ap-southeast-1.amazonaws.com/"+foldername
	
# 							pg_cert_path = file_path
# 							pg_cert_name = file_str
	
							
# 						except ClientError as e:
# 							print(str(e))
# 							# logging.error(e)
# 							# data_1      = {'msg':'Image upload failed .Please try again.','status':0}        
# 							# json_data   = json.dumps(data_1)
# 							# return json_data
# 							return str(e)
# 							# flash('Something Error .Please Try Again')			
# 				else:
# 					pg_cert_path = None
# 					pg_cert_name = None

# 	if conf_id and int(conf_id) == 29 :
# 		if addon_id:
# 			if int(addon_id) in [365,373,369]:
# 				file  = request.files.get('files_', None)
# 				if file:
# 					pg_cert_path = None
# 					pg_cert_name = None	
	
					
# 					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        = "certificate_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 = ""
# 							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 + 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} 
# 							file_path  = "https://delegateapp.s3.ap-southeast-1.amazonaws.com/"+foldername
		
# 							pg_cert_path = file_path
# 							pg_cert_name = file_str
		
							
# 						except ClientError as e:
# 							print(str(e))
# 							# logging.error(e)
# 							# data_1      = {'msg':'Image upload failed .Please try again.','status':0}        
# 							# json_data   = json.dumps(data_1)
# 							# return json_data
# 							return str(e)
# 							# flash('Something Error .Please Try Again')	
# 				else:
# 					pg_cert_path = None
# 					pg_cert_name = None
# 	# extra input fields

# 	reg_Validation = []         
# 	for key in is_mandatory:
# 		if is_mandatory[key] == 1:
# 			reg_Validation.append({'key': key ,'msg': "following field is mandatory."})  
# 			status = 0;

# 	# return "true"		
# 	del_data = {
# 				'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,
# 				'admin_user_id' : parent_user_id,
# 				'society_id'    : society_id,
# 				'role'		    : role,
# 				'check_in_date' : check_in_date,
# 				'check_out_date': check_out_date,
# 				'check_in_time' : check_in_time,
# 				'check_out_time': check_out_time,
# 				'designation'	: designation,
# 				'institution'	: institution,
# 				'nationality'	: nationality,
# 				'accom_persons' : accom_persons,
# 				'delegate_remarks': delegate_remarks,
# 				'is_take_part_bpw':is_take_part_bpw,
# 				# extra input fields
# 				'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,
# 				# Aadhaar
# 				'aadhaar_number'     : aadhaar_number
# 				# Aadhaar
# 			}

# 	payment_details_add = {
# 							'amount'		 : tamount,
# 							'api_payment_id' : transaction_id,
# 							'paid_at' 		 : paid_at,
# 							'updated_at'	 : updated_at,
# 							'refund_amount'  : refund_amount,
# 							'balance_amount' : balance_amount,
# 							'payment_method' : payment_method,
# 							'remarks'        : remarks,
# 							'receipt_no'     : receipt_no
# 						} 		


# 	cert_proof_deleted = request.values.get('cert_proof_deleted') or 0
# 	asi_proof_deleted = request.values.get('asi_proof_deleted') or 0
# 	res_proof_deleted = request.values.get('res_proof_deleted_') or 0
# 	aadhaar_proof_deleted = request.values.get('aadhaar_proof_deleted_') or 0

# 	if conf_id and int(conf_id) == 32 :
# 		if pg_cert_path  or int(cert_proof_deleted) == 1:
# 			del_data['pg_cert_path'] = pg_cert_path
# 		if pg_cert_name  or int(cert_proof_deleted) == 1:	
# 			del_data['pg_cert_name'] = pg_cert_name
	

	
# 	if conf_id and int(conf_id) == 19 :
# 		if addon_id:
# 			if int(addon_id) in [223,377,378,379]:
# 				if pg_cert_path  or int(asi_proof_deleted) == 1:
# 					del_data['pg_cert_path'] = pg_cert_path
# 				if pg_cert_name  or int(asi_proof_deleted) == 1:	
# 					del_data['pg_cert_name'] = pg_cert_name
# 			else:
# 				del_data['pg_cert_path'] = None
# 				del_data['pg_cert_name'] = None			
					
# 	if conf_id and int(conf_id) == 36 :
# 		if addon_id:
# 			if int(addon_id) in [538,603,608]:
# 				if pg_cert_path  or int(cert_proof_deleted) == 1:
# 					del_data['pg_cert_path'] = pg_cert_path
# 				if pg_cert_name  or int(cert_proof_deleted) == 1:	
# 					del_data['pg_cert_name'] = pg_cert_name
# 			else:
# 				del_data['pg_cert_path'] = None
# 				del_data['pg_cert_name'] = None			
					
# 	if conf_id and int(conf_id) == 37 :
# 		if addon_id:
# 			if int(addon_id) in [553,554,557,559,561,562,565,567,571,573,575,576]:
# 				if pg_cert_path  or int(cert_proof_deleted) == 1:
# 					del_data['pg_cert_path'] = pg_cert_path
# 				if pg_cert_name  or int(cert_proof_deleted) == 1:	
# 					del_data['pg_cert_name'] = pg_cert_name
# 			else:
# 				del_data['pg_cert_path'] = None
# 				del_data['pg_cert_name'] = None				
					
			
# 	if conf_id and int(conf_id)== 29 :
# 		if addon_id:
# 			if int(addon_id) in [365,373,369]:
# 				if pg_cert_path  or int(res_proof_deleted) == 1:
# 					del_data['pg_cert_path'] = pg_cert_path
# 				if pg_cert_name  or int(res_proof_deleted) == 1:	
# 					del_data['pg_cert_name'] = pg_cert_name
# 			else:
# 				del_data['pg_cert_path'] = None
# 				del_data['pg_cert_name'] = None
				
# 	# BOA 2024 Aadhaar
# 	if conf_id and int(conf_id) in [26] :
# 		if pg_cert_path  or int(res_proof_deleted) == 1:
# 			del_data['pg_cert_path'] = pg_cert_path
# 		if pg_cert_name  or int(res_proof_deleted) == 1:	
# 			del_data['pg_cert_name'] = pg_cert_name
# 	# BOA 2024 Aadhaar			


# 	if status == 1:
# 		app_type   = "DELEGATE"
# 		update        = BOModel().update_delegate(delegate_id,del_data,None,conference_id)
# 		BOModel().save_delegates_addonsBOModel(delegate_id,insert_del_addons,delete_del_addons,now)
# # 		BOModel().Update_delegates_addons(delegate_id,unique_id,addon_id,original_amount,amount,now)
# 		update_payment_details =  BOModel().update_payment_detail(unique_id,conf_id,app_type,payment_details_add)
# # 		update_payment_details =  BOModel().update_payment_detail(unique_id,payment_details_add)
# 		delegate_badge_table = conf['del_table_name']
# 		if delegate_badge_table:
# 			if delegate_no:
# 				if update:
# 					update_dele_badge = BOModel().update_delegates_in_dele_badge(delegate_no,conf_id,delegate_badge_table,is_update=0) # 0 For Update Both tables only
		

# 		json = { 
# 				'msg':'Update completed ...',
# 				'status':status,
# 				'reg_validation' :  reg_Validation,

# 			}
# 		return jsonify(json)

# --------------------------- working --------------------------------------

# @app.route('/<int:conf_id>/<conf_key>/bo/bo_post_edit_all_option_register', methods = ["GET","POST"])
# @RouteGroup.conf_required
# def BoPostEditAllOptionRegister(conf_id,conf_key):
# 	conf            = Auth.getConf(conf_id,conf_key)
# 	msg             = ""
# 	status          = 1
# 	data            = ""
# 	delegate_id     = request.form['delegate_id'] or None  
# 	parent_user_id  = request.form['parent_user_id'] 
# 	user_id         = request.form['user_id']
# 	now             = datetime.now()
# 	conf_id         = request.form['conf_id']
# 	conf_key        = request.form['conf_key']
# 	# conf            = BOModel().get_conf(conf_id,conf_key)
# 	society_id      = conf['society_id']
# 	dt_string       = now.strftime("%Y-%m-%d %H:%M:%S")
# 	prefix          = request.form['prefix'] or None
# 	full_name       = request.form['full_name'] or None
# 	email           = request.form['email'] 
# 	mobile          = request.form['mobile']
# 	date_of_birth   = request.form['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.form['gender'] or None
# 	address1        = request.form['address1'] or None
# 	address2        = request.form['address2'] or None
# 	address3        = request.form['address3'] or None
# 	city            = request.form['city'] or None
# 	pincode         = request.form['pincode'] or None
# 	state_id        = request.form['state_id'] or None
# 	country_id      = request.form['country_id'] or None
# 	mc_number       = request.form['mc_number'] or None
# 	mc_state_id     = request.form['mc_state_id'] or None
# 	membership_no   = request.form['membership_no'] or None
# 	receipt_no      = request.form['receipt_no'] or None
# 	remarks         = request.form['remarks'] or None
# 	paid_at         = request.form['paid_at'] or None
# 	payment_method  = request.form['payment_method'] or None
# 	transaction_id  = request.form['transaction_id'] or None
# 	tamount         = request.form['tamount'] or None
# 	balance_amount  = request.form['balance_amount'] or None
# 	refund_amount   = request.form['refund_amount'] or None
# 	unique_id   	= request.form['unique_id'] or None
# 	role   	        = request.form['role'] or None
# 	register_date   = request.form['register_date'] or None
# 	delegate_no   	= request.form['delegate_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

# 	designation     = request.values.get('designation') or None
# 	institution     = request.values.get('institution') or None
# 	nationality     = request.values.get('nationality') or None

# 	accom_persons     = request.values.get("accom_persons" or None)
# 	delegate_remarks  = request.form['delegate_remarks'] or None

# 	is_take_part_bpw = request.values.get('is_take_part_bpw') or None
	
# 	conference_id     = conf_id
# 	reg_types         = BOModel().get_addon_reg_type(conf_id)
# 	addons            = BOModel().get_edit_all_addons(delegate_id,register_date,conf_id)
# 	reg_addons        = {} 
# 	insert_del_addons = []
# 	delete_del_addons = [] 
# 	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 = {}
# 	for rt in reg_types:
# 		is_mandatory[rt['addon_type_id']]   =  rt['is_mandatory']
# 		values = request.values.getlist(rt.get('input_name'))
# 		if values:
# 			is_mandatory[rt['addon_type_id']] = 0
# 			for val in values:
# 				addon = reg_addons[int(val)]
# 				addon_id = val
# 				amount   = request.form['addon_amount_'+val] or addon.get("amount",0)
# 				original_amount = request.form['addon_amount_'+val] or addon.get("amount",0)


# 	reg_Validation = []         
# 	for key in is_mandatory:
# 		if is_mandatory[key] == 1:
# 			reg_Validation.append({'key': key ,'msg': "following list is mandatory."})  
# 			status = 0;

# 	# return "true"		
# 	del_data = {
# 				'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,
# 				'admin_user_id' : parent_user_id,
# 				'society_id'    : society_id,
# 				'role'		    : role,
# 				'check_in_date' : check_in_date,
# 				'check_out_date': check_out_date,
# 				'check_in_time' : check_in_time,
# 				'check_out_time': check_out_time,
# 				'designation'	: designation,
# 				'institution'	: institution,
# 				'nationality'	: nationality,
# 				'accom_persons' : accom_persons,
# 				'delegate_remarks': delegate_remarks,
# 				'is_take_part_bpw':is_take_part_bpw
# 			}

# 	payment_details_add = {
# 							'amount'		 : tamount,
# 							'api_payment_id' : transaction_id,
# 							'paid_at' 		 : paid_at,
# 							'updated_at'	 : updated_at,
# 							'refund_amount'  : refund_amount,
# 							'balance_amount' : balance_amount,
# 							'payment_method' : payment_method,
# 							'remarks'        : remarks,
# 							'receipt_no'     : receipt_no
# 						} 		


# 	if status == 1:
# 		app_type   = "DELEGATE"
# 		update        = BOModel().update_delegate(delegate_id,del_data,None,conference_id)
# 		BOModel().Update_delegates_addons(delegate_id,unique_id,addon_id,original_amount,amount,now)
# 		update_payment_details =  BOModel().update_payment_detail(unique_id,conf_id,app_type,payment_details_add)
# 		delegate_badge_table = conf['del_table_name']
# 		if delegate_badge_table:
# 			if delegate_no:
# 				if update:
# 					update_dele_badge = BOModel().update_delegates_in_dele_badge(delegate_no,conf_id,delegate_badge_table)
		

# 		json = { 
# 				'msg':'Update completed ...',
# 				'status':status,
# 				'reg_validation' :  reg_Validation,

# 			}
# 		return jsonify(json)


@app.route('/bo_sample_confirmation_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoSampleConfirmationDelegateMail(conf_id,conf_key,delegate_id,delegate,is_send,email):
	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 delegate is None:
		delegates   = BOModel().usp_del_get_delegates_by_delegate_id(delegate_id)
		if delegates:
			delegate = delegates[0]
			
	if delegate:
		if email:
			email = email
		else:
			email        = delegate['email']

		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']
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]
		if str(amount) == "0.00":
			amount = "Free"
		else:
			amount = "Rs."+str(amount)

		is_gen_number = conf['is_gen_number']
		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)
		tricon_subject = "Book your Accommodation for TRICON now!"
		tricon_tnoa_23_html = render_template('email/tricon_tnoa_23_accommodation_mail.html',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),
					'is_offline'  : 0
					}
					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)
			if conf_id == 17:
				EMAIL.MailTemplateSendMail(tricon_subject,tricon_tnoa_23_html,email,mailData,conf)		
		else:   
			return html     
	else :
		return None

# 17-01-2023(ramya)
# Purpose : Searching Email,Mobile,Transaction Id already registered or not
# Whatsapp option
@app.route('/bo_send_confirmation_delegate_whatsapp/<int:conf_id>/<conf_key>/<delegate_id>',methods = ["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.bo_trade_login_required
def BoSendConfirmationDelegateWhatsapp(conf_id,conf_key,delegate_id):
	conf          = Auth.getConf(conf_id,conf_key)
	society_id    = conf['society_id']
	mobile_no     = request.values.get('mobile_no',None)
	msg_content   = "*"+conf['conf_title']+" Confirmation*%0a"
	whatsappdata  = BOModel().usp_del_get_delegates_by_delegate_id(delegate_id)
	whatsapp_data = whatsappdata[0]
	amount       = whatsapp_data['total_amount']
	prefix       = whatsapp_data["prefix"]
	if prefix:
			name = whatsapp_data["prefix"] +" "+ whatsapp_data["full_name"]
	else:
		name = whatsapp_data["full_name"]
	if str(amount) == "0.00":
		amount = "Free"
	else:
		amount = "Rs."+str(amount)
	if mobile_no:
		last_char = mobile_no[-1:]
		# check last character is commma 
		if "," ==  last_char :
			mobile_no = re.sub(r".$", "", mobile_no)
		# check white spance in given inputs ,if exist then replace as empty
		if " " in mobile_no :
			mobile_no = mobile_no.replace(" " ,"")
		# msg_content = "*DELEGATE REGISTRATION CONFROMATION * %0a%0a" 
		# msg_content = msg_content +"%0a*mobile_no : "+ str(mobile_no)+"*"
		msg_content_1 = render_template('backoffice_user/delegate_registration/delegate_whatsapp.html',whatsappdata=whatsappdata,name=name,amount=amount,conf=conf)
# 		safe_string = urllib.parse.quote_plus(msg_content)
		msg_content   = msg_content+msg_content_1
		safe_string_1 = "https://wa.me/91"+str(mobile_no)+"?text="+msg_content

		return flask.redirect(safe_string_1)
		webbrowser.open(safe_string_1) # to send whatsapp via new tab
		return "success"
		flash("Confirmation mail sent Successful to " +str(mobile_no),"whatsapp_success")
		return redirect(url_for('back_office.BoViewConfirmationDelegateMail',conf_id=conf_id,conf_key=conf_key,delegate_id=	delegate_id))
		# return msg
	else:	
		flash("Please enter the whatsapp number .","whatsapp_failed")		
		# flash("Confirmation mail sent Successful to " +str(mobile_no),"whatsapp_success")
		return redirect(url_for('back_office.BoViewConfirmationDelegateMail',conf_id=conf_id,conf_key=conf_key,delegate_id=delegate_id))



@app.route('/all_conference_daily_count_delegate_mail', methods = ["GET", "POST"])
def AllConferenceDailyCountDelegateMail():
	send_manual    = request.values.get('send_manual',None)
	date_1         = request.values.get("date",None)
	current_tm     = datetime.now()
	reg_end_on     = current_tm + timedelta(days=2)
	dt_string      = current_tm.strftime("%Y-%m-%d %I:%M %p")
	# print("CRON JOB Executed at " + dt_string)
	next_day       = reg_end_on + timedelta(days=2)
	# next_day       = "2021-05-30"
	# next_day     = datetime.strptime(next_day, '%Y-%m-%d').date()
	if send_manual and int(send_manual) > 0  :
		tmp =  AllConferenceDelegateReportSendMail(date_1)
		return tmp
		# return "Mail sent Successful."
	else :
		if next_day > current_tm :
			if (current_tm.hour == 5 and current_tm.minute > 45) or (current_tm.hour == 6 and current_tm.minute < 25):
				print("Time match - " + dt_string)
# 			if ( current_tm.hour == 11 or current_tm.hour == 12 ):
				AllConferenceDelegateReportSendMail(date_1)
				return "Mail sent Successful."
			else:
				print("Time not match - " + dt_string)
				return ( dt_string +" Time not match ")  
		else:
			return "Registration closed"    

		   

def AllConferenceDelegateReportSendMail(date_1):
	row_val           = []
	today_count       = 0
	total_count       = 0
	today_paid_amount = 0
	total_paid_amount = 0
	today_del_count   = 0
	total_del_count   = 0
	current_dt        = datetime.now() - timedelta(1)
	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
	if date_1 :
		previous_date = date_1
	else :
		yesterday     = datetime.now() - timedelta(1)
		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
		previous_date = yesterday
	
	users             = BOModel().get_all_conference_daily_count_send_mail()
	conferences_db    = BOModel().get_conference()
	conferences       = {}
	for conference in conferences_db:
		conferences[conference['conf_id']] = conference	
   
	dt_string         = datetime.now().strftime("%d-%m-%Y %I:%M %p")


	in_conf_id  = []
	sender_mail = []
	if users :
		for row in users:
			html        = []
			email       = ""
			full_name   = ""
			mobile      = ""
			email       = row['email']
			full_name   = row['full_name']
			mobile      = row['mobile']
			str_conf_id = row['conf_id']
			lst_conf_id = str_conf_id.split(",")
			html.clear()
			for x in lst_conf_id:
				conf = conferences.get(int(x),None)
				if conf:
					reg_data = BOModel().GetRegDataForMail(previous_date,x)
					today_count       = 0
					total_count       = 0
					today_paid_amount = 0
					total_paid_amount = 0
					today_del_count   = 0
					total_del_count   = 0
					for index, value in enumerate(reg_data):
						addon_type_id       = value["addon_type_id"]
						today_count         = today_count+value['today_count']
						total_count         = total_count+value['total_count']
						today_paid_amount   = today_paid_amount+value['today_paid_amount']
						total_paid_amount   = total_paid_amount+value['total_paid_amount']
						if addon_type_id == 1:
							today_del_count         = today_del_count+value['today_count']
							total_del_count         = total_del_count+value['total_count']
					
					if int(x) == 46:
						base_url 	      = request.host_url
						if "https" in base_url :
							pass
						else :
							base_url = base_url.replace("http" ,"https")
						
						yesterday_dt         = datetime.strftime(current_dt, '%Y-%m-%d')		
						previous_reg_count = SurgicalUserModel().get_total_previous_reg_count(x,yesterday_dt)
						current_reg_count  = SurgicalUserModel().get_total__current_reg_count(x,yesterday_dt)
						if previous_reg_count:
							previous_reg_count = previous_reg_count['total_previous_count']
						else:
							previous_reg_count = 0
		
						if current_reg_count:
							current_reg_count = current_reg_count['total_current_count']
						else:
							current_reg_count = 0
									
						dt_string     = datetime.now().strftime("%d-%m-%Y %I:%M %p")
						html_data     = render_template('email/ss_daily_count_mail.html',conf=conf,date=dt_string,previous_reg_count=previous_reg_count,current_reg_count=current_reg_count,previous_date=previous_date,base_url=base_url)		
					else:
						html_data    = render_template('email/all_conference_dail_mail_count.html',previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count)	
					
					htmls        = html_data.replace("\n", "")
					html.append(htmls)

			html_datas   = str(html).replace("['", " ").replace("']", " ").replace(",", "").replace("' '", "")
			html_tmp     = render_template('email/reg_report_email_all.html',html=html_datas)
			
			subject = "All Delegate Registration Count as on {}".format(dt_string)
			receiver_email      = email
			receiver_mobile     = mobile
			receiver_name       = full_name
			created_at = datetime.now()
			# call here send mail function
			
			# Commented for testing purpose start
			EMAIL.allconfcountsendMail(subject,html_tmp,email)
			# Commented for testing purpose end
			
			is_send_backup    = 1
			if is_send_backup == 1 :
				email   = "ntecBackup@gmail.com"
				subject = "Backup mail of All Delegate Registration Count as on {} to {}".format(dt_string,receiver_email)
				EMAIL.allconfcountsendMail(subject,html_tmp,email)
			
			stmt_1              =('''INSERT INTO send_mail_index (conf_id,receiver_name,receiver_email,receiver_mobile,mail_send_at,created_at) VALUES ''')
			row_val.append(('(' + ''''{}','{}',"{}",'{}','{}','{}' ''' +')').format(x,receiver_name,receiver_email,receiver_mobile,created_at,created_at))
			
			stmt_1 = stmt_1 +  ",".join(row_val)
			stmt_1 = stmt_1 + ';'   

			BOModel().save_delegate_report_sendmail(stmt_1)
			sender_mail.append(email) 
		return jsonify(sender_mail)	
	else : 
		return "Report data is not available."




@app.route('bo_all_reg_report_view', methods = ["GET", "POST"])
def BOAllRegReportView():
	today_count       = 0
	total_count       = 0
	today_paid_amount = 0
	total_paid_amount = 0
	today_del_count   = 0
	total_del_count   = 0 
	dt_string         = datetime.now().strftime("%d-%m-%Y %I:%M %p")
	current_dt        = datetime.now() - timedelta(1)
	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
	date_1            = request.values.get("date",None)
	if date_1 :
		previous_date = date_1
	else :
		yesterday     = datetime.now() - timedelta(1)
		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
		previous_date = yesterday

	
	conferences_db    = BOModel().get_conference()
	conferences       = {}
	html =[]
	for conference in conferences_db:
		conferences[conference['conf_id']] = conference
	
	for x in conferences:
		conf = conferences.get(int(x),None)
		if conf:
			reg_data = BOModel().GetRegDataForMail(previous_date,x)	
			today_count       = 0
			total_count       = 0
			today_paid_amount = 0
			total_paid_amount = 0
			today_del_count   = 0
			total_del_count   = 0
			for index, value in enumerate(reg_data):
				addon_type_id       = value["addon_type_id"]
				today_count         = today_count+value['today_count']
				total_count         = total_count+value['total_count']
				today_paid_amount   = today_paid_amount+value['today_paid_amount']
				total_paid_amount   = total_paid_amount+value['total_paid_amount']
				if addon_type_id == 1:
					today_del_count         = today_del_count+value['today_count']
					total_del_count         = total_del_count+value['total_count']
			
			if int(x) == 46:
				base_url 	      = request.host_url
				if "https" in base_url :
					pass
				else :
					base_url = base_url.replace("http" ,"https")
				
				yesterday_dt         = datetime.strftime(current_dt, '%Y-%m-%d')		
				previous_reg_count = SurgicalUserModel().get_total_previous_reg_count(x,yesterday_dt)
				current_reg_count  = SurgicalUserModel().get_total__current_reg_count(x,yesterday_dt)
				if previous_reg_count:
					previous_reg_count = previous_reg_count['total_previous_count']
				else:
					previous_reg_count = 0

				if current_reg_count:
					current_reg_count = current_reg_count['total_current_count']
				else:
					current_reg_count = 0
							
				dt_string     = datetime.now().strftime("%d-%m-%Y %I:%M %p")
				html_data     = render_template('email/ss_daily_count_mail.html',conf=conf,date=dt_string,previous_reg_count=previous_reg_count,current_reg_count=current_reg_count,previous_date=previous_date,base_url=base_url)		
			else:
				html_data    = render_template('email/all_conference_dail_mail_count.html',previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count)	
			
			htmls        = html_data.replace("\n", "")
			html.append(htmls)

	html_datas   = str(html).replace("['", " ").replace("']", " ").replace(",", "").replace("' '", "")
	html_tmp     = render_template('email/reg_report_email_all.html',html=html_datas)

	return html_tmp
	
	
# Whatsapp Receipt option
			
@app.route('/bo_send_receipt_delegate_whatsapp/<int:conf_id>/<conf_key>/<unique_id>',methods = ["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.bo_trade_login_required
def BoSendReceiptDelegateWhatsapp(conf_id,conf_key,unique_id):
	conf           = Auth.getConf(conf_id,conf_key)
	mobile_no      = request.values.get('mobile_no',None)
	msg_content    = "*"+conf['conf_title']+" Receipt*%0a"
	receipt_datas  = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
	receipt_data   = receipt_datas[0]
	receipt_no     = receipt_data['receipt_no']
	r_amount       = receipt_data['amount']
	full_name      = receipt_data['full_name']

	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+"/-"
	
	if mobile_no:
		last_char = mobile_no[-1:]
		last_letter = full_name[-1:]
		# check last character is commma 
		if "," ==  last_char :
			mobile_no = re.sub(r".$", "", mobile_no)
		# check white spance in given inputs ,if exist then replace as empty
		if " " in mobile_no :
			mobile_no = mobile_no.replace(" " ,"")
		# msg_content = "*DELEGATE REGISTRATION CONFROMATION * %0a%0a" 
		# msg_content = msg_content +"%0a*mobile_no : "+ str(mobile_no)+"*"
		msg_content_1 = render_template('backoffice_user/delegate_registration/delegate_receipt_whatsapp.html',receipt_datas=receipt_datas,amount=r_amount,conf=conf,amount_in_words=amount_in_words,amount_with_commas=amount_with_commas)
		msg_content   = msg_content+msg_content_1
		safe_string_1 = "https://wa.me/91"+str(mobile_no)+"?text="+msg_content
		return flask.redirect(safe_string_1)
		webbrowser.open(safe_string_1) # to send whatsapp via new tab
		return "success"
	else:	
		flash("Please enter the whatsapp number .","whatsapp_failed")		
		# flash("Confirmation mail sent Successful to " +str(mobile_no),"whatsapp_success")
		return redirect(url_for('back_office.BoViewReceiptDelegagteMail',conf_id=conf_id,conf_key=conf_key,unique_id=unique_id))
		
		
@app.route('/bo_send_confirmation_and_receipt_delegate_mail_whatsapp/<int:conf_id>/<conf_key>/<delegate_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoSendConfirmationAndReceiptDelegagteMailWhatsApp(conf_id,conf_key,delegate_id,unique_id):
	conf          = Auth.getConf(conf_id,conf_key)
	mobile_no     = request.values.get('mobile_no',None)
	confimation_mail = request.values.get('confimation_mail',None)
	receipt_mail     = request.values.get('receipt_mail',None)
	whatsappdata  = BOModel().usp_del_get_delegates_by_delegate_id(delegate_id)
	whatsapp_data = whatsappdata[0]
	amount        = whatsapp_data['total_amount']
	prefix        = whatsapp_data["prefix"]
	if prefix:
			name = whatsapp_data["prefix"] +" "+ whatsapp_data["full_name"]
	else:
		name = whatsapp_data["full_name"]
	if str(amount) == "0.00":
		amount = "Free"
	else:
		amount = "Rs."+str(amount)

	if mobile_no:
		mobile_no = mobile_no
	else:
		mobile_no = whatsapp_data['mobile']			

	if confimation_mail and receipt_mail:
		msg_content = "*"+conf['conf_title']+" Confirmation and Receipt*%0a"	
	elif confimation_mail:
		msg_content = "*"+conf['conf_title']+" Confirmation*%0a"
	else:
		msg_content = "*"+conf['conf_title']+" Receipt*%0a"

	if confimation_mail:
		safe_string_1  = render_template('backoffice_user/delegate_registration/delegate_whatsapp.html',whatsappdata=whatsappdata,name=name,amount=amount,conf=conf)
		msg_content    = msg_content+safe_string_1
	
	if receipt_mail:	
		receipt_datas  = BOModel().BOreceipt_no_generate_and_get(unique_id,conf_id)
		receipt_data   = receipt_datas[0]

		receipt_no     = receipt_data['receipt_no']
		r_amount       = receipt_data['amount'] or 0.00
		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'] or '0')
		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+"/-"

		safe_string_2 = render_template('backoffice_user/delegate_registration/delegate_receipt_whatsapp.html',receipt_datas=receipt_datas,amount=r_amount,conf=conf,amount_in_words=amount_in_words,amount_with_commas=amount_with_commas)
		msg_content  = msg_content+safe_string_2	
	
	if mobile_no:
		last_char = mobile_no[-1:]
		# check last character is commma 
		if "," ==  last_char :
			mobile_no = re.sub(r".$", "", mobile_no)
		# check white spance in given inputs ,if exist then replace as empty
		if " " in mobile_no :
			mobile_no = mobile_no.replace(" " ,"")

		
		msg_content = "https://wa.me/91"+str(mobile_no)+"?text="+msg_content
		return flask.redirect(msg_content)
		webbrowser.open(msg_content) # to send whatsapp via new tab
		return "success"
	return "mobile not entered"		
		


@app.route('/bo_view_confirmation_delegate_no_mail/<int:conf_id>/<conf_key>/<int:delegate_no>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoViewConfirmationDelegateMailNo(conf_id,conf_key,delegate_no):
	delegate        = None
	conf            = Auth.getConf(conf_id,conf_key)
	conf_id         = conf['conf_id']
	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)
	delegates       = BOModel().usp_del_get_delegates_by_delegate_no(delegate_no,conf_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']
		delegate_id  = delegate['delegate_id']
		ref_no       = delegate['ref_no']
		title        = "View Confimation Mail"
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]
		if str(amount) == "0.00":
			amount = "Free"
		else:
			amount = "Rs."+str(amount)
			
			
		is_gen_number = conf['is_gen_number']
		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_data    = render_template('email/confirmation_mail_v1.html',mail_content=mail_content,conf=conf)
		html         = render_template('email/view_confirmation_email.html',delegate=delegate,conf_id=conf_id,conf_key=conf_key,delegate_id=delegate_id,conf=conf,subject=subject,html_data=html_data,title=title)  
		return html     
	else :
		return "Records does not exist."
		
		
# --------  start --- Addons and conference Closing Alert mail before one day   



#  test start
@app.route('/<int:conf_id>/<conf_key>/daily_count_wetlab_and_drylab_mail', methods = ["GET", "POST"])
@RouteGroup.conf_required
def DailyCountWetlabAndDrylabMail(conf_id,conf_key):
	conf   = Auth.getConf(conf_id,conf_key)
	if conf :
		send_manual    = request.values.get('send_manual',None)
		date_1         = request.values.get("date",None)
		reg_end_on     = datetime(2023, 6, 30, 23,59,59)
		current_tm     = datetime.now()
		dt_string      = current_tm.strftime("%Y-%m-%d %I:%M %p")
		# print("CRON JOB Executed at " + dt_string)
		next_day       = reg_end_on + timedelta(days=1)
		if send_manual and int(send_manual) > 0  :
			BOWetDryLab(conf_id,conf_key,date_1)
			return "Mail sent Successful."
		else :
			if reg_end_on <= next_day :
				if (current_tm.hour == 9 and current_tm.minute > 45) or (current_tm.hour == 10 and current_tm.minute < 22) :
					print("Time match - " + dt_string)
					BOWetDryLab(conf_id,conf_key,date_1)
					return "Mail sent Successful."
				elif (current_tm.hour == 17 and current_tm.minute > 45) or (current_tm.hour == 18 and current_tm.minute < 22): 
					BOWetDryLab(conf_id,conf_key,date_1)
					return "Mail sent Successful."  
				else:
					print("Time not match - " + dt_string)
					return ( dt_string +" Time not match ")  
			else:
				return "Registration closed"    
	else :
		return "Invalid  conf-id or conf-key"  



def BOWetDryLab(conf_id,conf_key,date_1):
	send_manual    = request.values.get('send_manual',None)
	conf              = Auth.getConf(conf_id,conf_key)
	today_count       = 0
	mailData          = None
	total_count       = 0
	today_paid_amount = 0
	total_paid_amount = 0
	today_del_count   = 0
	total_del_count   = 0 
	dt_string         = datetime.now().strftime("%d-%m-%Y ")
	date_1            = request.values.get("date",None)
	current_dt        = datetime.now() - timedelta(1)
	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
	base_url          = request.host_url
	if "https" in base_url :
		pass
	else :
		base_url = base_url.replace("http" ,"https")
	if date_1 :
		previous_date = date_1
	else :
		yesterday     = datetime.now() - timedelta(1)
		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
		previous_date = yesterday

	final_total = 0
	reg_datas = BOModel().GetWetDryReportForMail(date_1,conf_id)
	for index,value in enumerate(reg_datas):
		if index == 0:
			reg_data = value
		if index == 1:
			total_count_data = value
	if reg_data :
		for index, value in enumerate(reg_data):
			addon_type_id       = value["addon_type_id"]
			success_count         = value['success_count']
			waiting_count         = value['waiting_count']
			user_type             = value["user_type"]
			value['success_waiting_total'] =  success_count+waiting_count
			for ind , val in enumerate(total_count_data) :
				reg_type = val["reg_type"]
				head_count = val["head_count"]
				if user_type in reg_type :
					value["total_head_count"] = head_count
					break

		html = render_template('email/daily_count_mail_wetlab_and_drylab.html',previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count,base_url=base_url)
		subject = conf['conf_name']+"- Wet Lab and Dry Lab Registration Count as on {}".format(dt_string)
# 		email = ['drswarnauday@gmail.com','sci.com.tricon23@gmail.com','drsriramgopal@gmail.com','karthick@numerotec.com','aravinth@numerotec.com','ramya@numerotec.com','santhosh@numerotec.com','dp@numerotec.com','manjula@numerotec.com','ganesan@numerotec.com','sridharan.r@numerotec.com','sai@numerotec.com']
		email = ['karthick@numerotec.com','aravinth@numerotec.com','ramya@numerotec.com','santhosh@numerotec.com']
		for i in email:
			pass
			# EMAIL.MailTemplateSendMail(subject,html,i,mailData,conf)

		return "mail sent Successful..."     
	else :
		return "Registration record not exists." 

@app.route('/<int:conf_id>/<conf_key>/bo_view_wetdry_lab', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BOViewWetDryLab(conf_id,conf_key):
	conf              = Auth.getConf(conf_id,conf_key)
	today_count       = 0
	total_count       = 0
	today_paid_amount = 0
	total_paid_amount = 0
	today_del_count   = 0
	total_del_count   = 0 
	dt_string         = datetime.now().strftime("%d-%m-%Y ")
	date_1            = request.values.get("date",None)
	current_dt        = datetime.now() - timedelta(1)
	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
	base_url          = request.host_url
	if "https" in base_url :
		pass
	else :
		base_url = base_url.replace("http" ,"https")
	if date_1 :
		previous_date = date_1
	else :
		yesterday     = datetime.now() - timedelta(1)
		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
		previous_date = yesterday

	final_total = 0
	reg_datas = BOModel().GetWetDryReportForMail(date_1,conf_id)
	for index,value in enumerate(reg_datas):
		if index == 0:
			reg_data = value
		if index == 1:
			total_count_data = value
	
	if reg_data :
		for index, value in enumerate(reg_data):
			addon_type_id       = value["addon_type_id"]
			success_count         = value['success_count']
			waiting_count         = value['waiting_count']
			user_type             = value["user_type"]
			value['success_waiting_total'] =  success_count+waiting_count
			for ind , val in enumerate(total_count_data) :
				reg_type = val["reg_type"]
				head_count = val["head_count"]
				if user_type in reg_type :
					value["total_head_count"] = head_count
					break

		html = render_template('email/daily_count_mail_wetlab_and_drylab.html',previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count,base_url=base_url)
		return html    
	else :
		return "Registration record not exists."         
# test end

# June 1 2023

@app.route('/<int:conf_id>/<conf_key>/bo_view_waiting_for_payment_proof', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.bo_trade_login_required
def BoViewWaitingForPaymentProof(conf_id,conf_key):
	conf         = UserModel().get_confUserModel(conf_id,conf_key)
	# unique_id    = request.values.get('unique_id')
	delegate     = BOReportModel().uspWaitingPaymentProofApproval(conf_id)
	return render_template('backoffice_user/bo_waiting_for_pg_pay_approval.html',user_data=delegate,conf=conf,conf_id=conf_id ,conf_key=conf_key)



@app.route('/<int:conf_id>/<conf_key>/bo_view_waiting_forpayment_proof_generate_dele_no', methods = ["GET", "POST"])
@RouteGroup.conf_required
@RouteGroup.bo_trade_login_required
def BoViewWaitingForPaymentProofGenerateDeleNo(conf_id,conf_key):
	conf         = UserModel().get_confUserModel(conf_id,conf_key)
	unique_id    = request.values.get('unique_id')
	delegate_id  = request.values.get('delegate_id')
	delegate     = BOModel().usp_del_bo_view_waiting_gen_del_no_and_receipt_no_only_pg(unique_id,conf_id,delegate_id)
	if delegate:
	
		delegate_ids = delegate[0]['delegate_ids']
		prefix       = delegate[0]['prefix']
		name         = delegate[0]['full_name']
		full_name    = prefix + " " + name if prefix else name
		email        = delegate[0]['email']
		return render_template('backoffice_user/view_waiting_for_payment_proof_generate_delegate_no.html',delegate=delegate,delegate_id=delegate_id,delegate_ids=delegate_ids,conf=conf,unique_id=unique_id,full_name=full_name,email=email)
	else :
		return "<h4>No Data</h4>"

@app.route('/<int:conf_id>/<conf_key>/bo_generate_payment_proof_delegate_no_and_receipt_no', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoGeneratePaymentProofDelegateNoAndReceiptNo(conf_id,conf_key):
	conf              = UserModel().get_confUserModel(conf_id,conf_key)
	unique_id         = request.values.get('unique_id')
	delegate_id       = request.values.get('delegate_id')
	confirmation_mail = request.values.get('confirm_mail' or None ) or None
	receipt_mail      = request.values.get('reciept_mail'or None ) or None
	role              = None
	conf_name         = conf['conf_name']
	receipt_data      = BOModel().bo_generate_delegate_no_and_receipt_no_only_pg(unique_id,conf_id,role,delegate_id)
	if receipt_data:
		receipt_data = receipt_data[0]
		delegate_id = receipt_data['delegate_id']
		
		delegate_nos = receipt_data['delegate_no']
		email        = receipt_data['email']
	if confirmation_mail == "confirmation_mail" and receipt_mail == "None":
		if confirmation_mail == "confirmation_mail" :
			BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1,None)
		else:
			BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,0,None)
	flash("Bonafide Proof verified successfully.","succ_msg")
	return redirect (url_for('back_office.BoViewWaitingForPaymentProof',conf_id=conf_id,conf_key=conf_key))


@app.route('/<int:conf_id>/<conf_key>/post_reject_payment_for_asi', methods = ["POST"])
@RouteGroup.conf_required
def postRejectPaymentForASI(conf_id,conf_key):
	conf             = Auth.getConf(conf_id,conf_key)
	now              = datetime.now()
	dt_string        = now.strftime('%Y-%m-%d %H:%M:%S')
	delegate_id      = request.values.get('delegate_id')
	delegate_ids      = request.values.get('delegate_ids')
	unique_id        = request.values.get('unique_id')
	full_name        = request.values.get('full_name')
	remarks          = request.values.get('remarks')
	email            = request.values.get('email')
	data  = {
		'delegate_id': delegate_id,
		'conf_id'    : conf_id,
		'unique_id'	 : unique_id,
		'is_lock'    : 0,
		'remarks'	 : remarks,
		'created_at' : now
	}
	
	url_data = BOModel().get_auto_login_url_by_delegate_id(delegate_id,conf_id)
	if url_data :
		auto_login_url = url_data['auto_login_url']
	else :
		auto_login_url = conf['app_url']

	# update_reg_status  = BOModel().bo_update_reg_status_delegates_addons(unique_id,delegate_id,now)  
	# pg_added
	update = BOModel().bo_update_reject_payment(data)
	del_status_id    = 7
	update_reg_status  = BOModel().bo_update_reg_status_delegates_addons_for_pg_proof_reject(unique_id,delegate_id,now,del_status_id)
	# pg_added
	
	mailData  = None
	subject   = "Your "+conf['conf_name']+" delegate registration is NOT APPROVED"
	html      =  render_template('email/upi_transaction_reject_mail.html',conf=conf,remarks=remarks,full_name=full_name,auto_login_url=auto_login_url)
	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('Rejected Proof',"waiting_msg")
	return redirect(url_for('back_office.BoViewWaitingForPaymentProof',conf_id=conf_id,conf_key=conf_key))

# start bulk mail here
# created by : Karthick
# Usage      : Back office confirmation and receipt mail bulk mail send purpose
# Date       : 2023-07-06

@app.route('/bo_delegate_bulk_mail/<int:conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoDelegateBulkMail(conf_id,conf_key):
	now              = datetime.now()
	sent_at          = now.strftime("%Y-%m-%d %H:%M:%S")
	conf             = Auth.getConf(conf_id,conf_key)
	conf_mail        = request.values.get('conf_mail',None )# confirm mail check box value
	rec_mail         = request.values.get('rec_mail', None )# recipt mail check box value
	sample           = request.values.get('sample', None )
	sample_mail      = request.values.get('sample_mail',None ) 
	del_nos          = request.form.getlist('del_nos',None)
	
	if conf_mail == "conf_mail" and rec_mail == "rec_mail" :
		data = BoViewConfirmationAndReceiptDelegagteBulkMail(conf_id,conf_key,del_nos)
		return data
	elif conf_mail == "conf_mail"  and rec_mail == None :
		data = BoViewConfirmationDelegateBulkMail(conf_id,conf_key,del_nos)
		return data	
	elif conf_mail == None and rec_mail == "rec_mail" :
		data = BoViewReceiptDelegagteBulkMail(conf_id,conf_key,del_nos)
		return data	
	
	else :
		return redirect (url_for('back_office.Index_user',conf_id=conf_id,conf_key=conf_key))



@app.route('/bo_view_confirmation_and_receipt_delegate_bulk_mail/<int:conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoViewConfirmationAndReceiptDelegagteBulkMail(conf_id,conf_key,del_nos):
	conf = Auth.getConf(conf_id,conf_key)
	del_table_name = None
	otp_1 = None
	if conf :
		del_table_name = conf["del_table_name"]
	now              = datetime.now()
	sent_at          = now.strftime("%Y-%m-%d %H:%M:%S")
	delegate_nos     = request.values.get('del_nos') or None
	mail_type        = 'Confirmation Mail and Recipt Mail'
	sample_mail      = request.values.get('sample_mail')
	sample           = request.values.get('sample_value'or None ) or None
	template_name    = "confirmation_and_receipt_mail"
	mailData         = UserModel().get_mail_template(template_name,conf_id)
	row_val          = []
	html_data        = []
	mail_send_list       = []
	mail_not_send_list   = []
	html                 = []

	all_datas        = BOModel().receipt_no_generate_and_get_delegate_no_bulk(delegate_nos,conf_id)
	for index,value in enumerate(all_datas):
			if index == 0:
				delegates = value
			if index == 1:
				receipt_datas = value


	receipt_data = {}
	for item in receipt_datas:
		receipt_data[item['delegate_no']] = item
		r_amount = int(item['amount'])
		if r_amount == "Free" :
			r_amount = r_amount[item['amount']]
		else:
			r_amount = "Rs."+str(r_amount)+"/-"


		amount = f"{int(item['amount']):,}"
		amount_with_commas = amount
		amount_for_convertion = int(item['amount'])
		amount_in_words =  Helper.amountTowords(amount_for_convertion)
		amount_in_words = amount_in_words.title()

		update_data = {
				'amount_with_commas':amount_with_commas,
				'amount_in_words':amount_in_words

		}
		receipt_data[item['delegate_no']].update(update_data)


	for delegate in delegates:
		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']
		ref_no       = delegate['ref_no']
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]
		if str(c_amount) == "0.00":
			c_amount = "Free"
		else:
			c_amount = "Rs."+str(c_amount)
		# Code updated by Ganesan on Dec 09 ,2022 for karavali 2022 pedicon conference
# 		if del_table_name and conf_id == 12 :
# 			otp_1 = BOModel().getOTPforConfirmationMail(del_no,conf_id,del_table_name)
# 		else :
# 			pass	
		
		if otp_1 :
			otp = otp_1["otp"]
			
		else:
			otp = None

		sub_data         = {'delegate_no' : str(delegate_no),'name':name}


		subject          = Helper.merge_tags(mailData['subject'],sub_data)
		
		receipt_data_by_del_no = receipt_data[delegate_no]

		payment_method = receipt_data_by_del_no['payment_method']

		# Add status
		if payment_method and payment_method.lower() != "free":
			is_gen_number = conf['is_gen_number']
			if is_gen_number == 'ref_number':
				subject = "Confirmation of registration - "+str(ref_no)
			else:
				subject = Helper.merge_tags(mailData['subject'],sub_data)	
		else:
			# Reference number added here
			is_gen_number = conf['is_gen_number']
			if is_gen_number == 'ref_number':
				subject = "Confirmation of registration - "+str(ref_no)
			else:	
				subject = "Confirmation of registration - {}".format(delegate_no)	


		data = {
			'mail_content' : mailData['mail_content'],
			'receipt_data' : receipt_data_by_del_no,
			'amount_with_commas':amount_with_commas,
			'amount_in_words':amount_in_words,
			'delegate':delegate,
			'otp' : otp

		}


		mail_content = Helper.convert_html_for_mail_screen(data)
		html          = render_template('email/confirmation_and_receipt_mail.html',delegate=delegate,receipt_data=receipt_data_by_del_no,conf_id=conf_id,conf_key=conf_key ,amount_in_words=amount_in_words,amount_with_commas=amount_with_commas,conf=conf,otp=otp)
		
		htmls        = html.replace("\n", "")
		html_data.append(htmls)
		
		if is_gen_number == 'ref_number':
			delegate_no = ref_no
		else:
			delegate_no = delegate_no
		
		stmt_1              =('''INSERT INTO mail_logs (conf_id,delegate_no,to_email,mail_type,subject,sent_at,sample_mail) VALUES ''')
		row_val.append(('(' + ''''{}','{}','{}','{}','{}','{}','{}' ''' +')').format(conf_id,delegate_no,email,mail_type,subject,sent_at,sample_mail))
		try:					
			if sample == "1" and sample :
				email = sample_mail	
				if conf['is_email_enable'] == 1:
					email_list = list(email.split(","))
					for i in email_list:	
						email = i
						# EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
						EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
			else :
				if email :
					if conf['is_email_enable'] == 1:
						email_list = list(email.split(","))
						for i in email_list:	
							email = i
							# EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
							EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
							

		except Exception as e:
			pass


	stmt_1 = stmt_1 +  ",".join(row_val)
	stmt_1 = stmt_1 + ';'   

	BOModel().save_delegate_report_sendmail(stmt_1)
	html_datas   = str(html_data).replace("['", " ").replace("']", " ").replace(",", "").replace("' '", "")
	if sample == "1" and sample:
		mail_contant       = "<h4 style= 'color:green' ; >Sample Confirmation Mail and Recipt Mail Successfully Send  to  "+ sample_mail+" .</h4>"
		
	else:					
		mail_contant       = "<h4 style= 'color:green' ; >Confirmation Mail and Recipt Mail Send Successfully . </h4>"

	return mail_contant


@app.route('/bo_view_confirmation_delegate_no_bulk_mail/<int:conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoViewConfirmationDelegateBulkMail(conf_id,conf_key,del_nos):
	conf          = Auth.getConf(conf_id,conf_key)
	now           = datetime.now()
	sent_at       = now.strftime("%Y-%m-%d %H:%M:%S")
	mail_type     = 'Confirmation Mail'
	delegate_nos  = request.form['del_nos'] or None
	sample_mail   = request.values.get('sample_mail')
	sample        = request.values.get('sample_value'or None ) or None
	template_name = "confirmation_mail"
	mailData      = UserModel().get_mail_template(template_name,conf_id)
	mail_send_list       = []
	mail_not_send_list   = []
	html_data            = []
	row_val              = []

	all_datas    = BOModel().receipt_no_generate_and_get_delegate_no_bulk(delegate_nos,conf_id)
	for index,value in enumerate(all_datas):
		if index == 0:
			delegates = value

	for delegate in delegates:		
		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']
		delegate_id  = delegate['delegate_id']
		ref_no       = delegate['ref_no']
		title        = "View Confimation Mail"
		if prefix:
			name = delegate["prefix"] +" "+ delegate["full_name"]
		else:
			name = delegate["full_name"]
		if str(amount) == "0.00":
			amount = "Free"
		else:
			amount = "Rs."+str(amount)
		
		# Reference number added here
		is_gen_number = conf['is_gen_number']
		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)
		htmls              = html.replace("\n", "")
		html_data.append(htmls)
		
		if is_gen_number == 'ref_number':
			delegate_no = ref_no
		else:
			delegate_no = delegate_no
		
		stmt_1             =('''INSERT INTO mail_logs (conf_id,delegate_no,to_email,mail_type,subject,sent_at,sample_mail) VALUES ''')
	
		row_val.append(('(' + ''''{}','{}','{}','{}','{}','{}','{}' ''' +')').format(conf_id,delegate_no,email,mail_type,subject,sent_at,sample_mail))
		try:
			if sample == "1" and sample:
				email = sample_mail	
				if conf['is_email_enable'] == 1:
					email_list = list(email.split(","))
					for i in email_list:	
						email = i
						EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
			else :
				if email :
					if conf['is_email_enable'] == 1:
						EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
						# pass
		except Exception as e:
			print(e)
			pass
	stmt_1 = stmt_1 +  ",".join(row_val)
	stmt_1 = stmt_1 + ';'   

	BOModel().save_delegate_report_sendmail(stmt_1)		
	html_datas   = str(html_data).replace("['", " ").replace("']", " ").replace(",", "").replace("' '", "")
	if sample == "1" and sample:
		mail_contant       = "<h4 style= 'color:green' ; > Sample Confirmation Mail Successfully Send  to  "+ sample_mail+" . </h4>" 
	else:
		mail_contant       =  "<h4 style= 'color:green' ; > Confirmation Mail Send Successfully  .</h4>"
	return mail_contant


@app.route('/bo_view_receipl_delegate_mail/<int:conf_id>/<conf_key>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoViewReceiptDelegagteBulkMail(conf_id,conf_key,del_nos):
	conf             = Auth.getConf(conf_id,conf_key)
	now              = datetime.now()
	sent_at          = now.strftime("%Y-%m-%d %H:%M:%S")
	delegate_nos     = request.form['del_nos'] or None
	mail_type        = 'Receipt Mail'
	sample_mail      = request.values.get('sample_mail')
	sample           = request.values.get('sample_value'or None ) or None
	template_name    = "receipt_mail"
	mailData         = UserModel().get_mail_template(template_name,conf_id)
	row_val          = []
	mail_send_list       = []
	mail_not_send_list   = []
	html_data            = []
	
	all_datas    = BOModel().receipt_no_generate_and_get_delegate_no_bulk(delegate_nos,conf_id)
	for index,value in enumerate(all_datas):
		if index == 1:
			receipt_datas = value
	

	for receipt_data in receipt_datas:
		# Add status
		payment_method  = receipt_data['payment_method']
		if payment_method and payment_method.lower() != "free":
			email        = receipt_data['email']
			delegate_no  = receipt_data['delegate_no']
			# email          = 'karthiashokan23@gmail.com'  
			receipt_no   = receipt_data['receipt_no']
			amount       = receipt_data['amount']
			# return amount
			conf_name    = receipt_data['conf_name']
			delegate_nos = receipt_data['delegate_nos']
			title        = "View Receipt Mail"
			if str(amount) == "0.00":
				amount = "Free"
			else:
				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 = amount
			else:
				amount = "Rs."+amount+"/-"

			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)
			htmls           = html.replace("\n", "")
			html_data.append(htmls)
			stmt_1              = ('''INSERT INTO mail_logs (conf_id,delegate_no,to_email,mail_type,subject,sent_at,sample_mail) VALUES ''')
			row_val.append(('(' + ''''{}','{}','{}','{}','{}','{}','{}' ''' +')').format(conf_id,delegate_no,email,mail_type,subject,sent_at,sample_mail))
			try:
				if sample == "1" and sample :
					email = sample_mail	
					if conf['is_email_enable'] == 1:
						email_list = list(email.split(","))
						for i in email_list:	
							email = i
							EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
				else :
					if email :
						if conf['is_email_enable'] == 1:
							email_list = list(email.split(","))
							for i in email_list:	
								email = i
								EMAIL.MailTemplateSendMail(subject,html,email,mailData,conf)
			except Exception as e:
				pass
		
		else:
			pass		
	stmt_1 = stmt_1 +  ",".join(row_val)
	stmt_1 = stmt_1 + ';'   
	BOModel().save_delegate_report_sendmail(stmt_1)
	html_datas   = str(html_data).replace("['", " ").replace("']", " ").replace(",", "").replace("' '", "")
	if sample == "1" and sample:
		mail_contant       = "<h4 style= 'color:green' ; >Sample Recipt Mail Successfully Send  to  "+ sample_mail+" . </h4>"
	else:
		mail_contant       =  "<h4 style= 'color:green' ; > Recipt Mail Send Successfully . </h4>"
	return mail_contant

# end bulk mail	here

@app.route('/<int:conf_id>/<conf_key>/bo_make_payment_wet_dry_lab', methods = ["GET","POST"])
@RouteGroup.conf_required
@RouteGroup.login_required
def BoMakePaymentWetDryLab(conf_id,conf_key):
	conf              = Auth.getConf(conf_id,conf_key)
	society_id        = conf['society_id']
	now               = datetime.now()
	delegate_id       = request.values.get('delegate_id')
	payment_method    = request.values.get('methods')
	remarks           = request.values.get('remarks')
	receipt_mail      = request.values.get('receipt_mails')
	confimation_mail  = request.values.get('confimation_mails')
	txn_id            = request.values.get('txn_ids')
	custom_email      = request.values.get('custom_emails')

	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)
		
	
	Auth_user       = Auth.user(society_id)
	prefix          = Auth_user['prefix'] or None
	name            = Auth_user['full_name'] or None
	email           = Auth_user['email']
	mobile          = Auth_user['mobile']
	user_id         = Auth_user['user_id']
	full_name       = prefix + " " + name if prefix else name
	if delegate_id:
		delegate_id = delegate_id
		delegate 	= UserModel().get_delegate(delegate_id)
		name         = delegate['full_name']
		prefix       = delegate['prefix']
		full_name    = prefix + " " + name if prefix else name
		# full_name   = delegate['full_name']
		email       = delegate['email']
		mobile      = delegate['mobile']

	if len(custom_email) > 0 and custom_email is not None: 
		full_name    = None
		email        = custom_email
		mobile       = None
		receipt_mail = 'receipt_mail'

	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

	payment_for     = "Payment for TRICON 2023 Wet and Dry Lab Registration"
	if conf_id == 36:
		unique_id     = app_key+unique_id
	else:
		unique_id     = app_key+"_"+unique_id
	
	delegate_ids    = delegate_id
	app_type        = Helper.AppType
	is_generate     = 1

	if payment_method == "Free": # return "free" 
		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)
	else: # return "cash"
		generate_payement = BOModel().usp_del_generate_cash_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)
	
	if generate_payement :
		return redirect(url_for('back_office.BoPaymentServerResponse',user_id=user_id,unique_id=unique_id,payment_method=payment_method,receipt_mail=receipt_mail,confimation_mail=confimation_mail,conf_id=conf_id,conf_key=conf_key))     
	
	else:
		data ={ 'msg':'following field is mandatory.','status':0,'data':''}	
		return jsonify(data)
		
		
# Purpose : To View Acknowledge Mail
# Created on 2023-11-02 10:12 by Ramya

@app.route('/bo_view_acknowledge_delegate_mail/<int:conf_id>/<conf_key>/<delegate_id>/<unique_id>', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoViewAcknowledgementDelegateMail(conf_id,conf_key,delegate_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  = "payement_acknowledgement_mail"
	title          = "View Acknowledgement Mail"
	mailData       = UserModel().get_mail_template(template_name,conf_id)
	delegate_data  = BOModel().get_user_payment_data(conf_id,delegate_id,unique_id)
	full_name      = delegate_data['full_name']
	utr_number     = delegate_data['utr_number']
	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)
	sub_data 	   = {'conf_name':conf['conf_name']}
	subject        = Helper.merge_tags(mailData['subject'],sub_data)    
	html     	   = render_template('email/waiting_confirmation_mail_v1.html',conf=conf,mail_content= mail_content)
	html_data      = render_template('email/view_waiting_confirmation_mail.html',conf_id=conf_id,conf_key=conf_key,delegate_id=delegate_id,conf=conf,subject=subject,html=html,title=title)  
	return html_data

# Purpose : To check In Progress data registered or not
# Created on 2023-12-12 14:57:00 by ramya
@app.route('/<int:conf_id>/<conf_key>/bo_check_registered_or_not',methods =["GET","POST"])
@RouteGroup.conf_required
def BoCheckRegisteredorNot(conf_id,conf_key):
	try:
		delegate_id     = request.values.get('delegate_id')
		mobile          = request.values.get('mobile') or None
		email           = request.values.get('email') or None
		if mobile or email :
			check_data      = BOModel().bo_check_registered_or_not_data(conf_id,email,mobile)
			if check_data :
				html_data   = render_template('backoffice_user/delegate_registration/bo_inprogress_check_registered_or_not.html',user_data=check_data,conf_id=conf_id,conf_key=conf_key)
				data        = {"data":html_data, "msg":"Already registered.","status" :1,"delegate_id":delegate_id }
				json_data   = json.dumps(data,default=str)
			else:
				msg         = "Email - '"+email +"' and Mobile - "+mobile+" is Not Registered"
				data        = {"msg":msg,"status" :2 }
				json_data   = json.dumps(data,default=str)
		else:
			data        = {"msg":"Invalid 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

	
# Purpose : To Delete In Progress data by delegate_id
# Created on 2023-12-13 10:44:00 by ramya	
@app.route('/<int:conf_id>/<conf_key>/bo_delete_inprogress_record',methods =["GET","POST"])
@RouteGroup.conf_required
def BoDeleteInprogressRecord(conf_id,conf_key):
	try:
		delegate_id              = request.values.get('delegate_id')
		delete_inprogress_record = BOModel().bo_delete_inprogress_data(conf_id,delegate_id)
		del_status_id            = 0 # add to cart add del_status_id
		if delete_inprogress_record == "success" :
			flash("Deleted Successfully","successMsg")
			return redirect(url_for('back_office.Index_user',conf_id=conf_id,conf_key=conf_key,del_status_id=del_status_id))
		else:
			flash(str(delete_inprogress_record),"Payerror")
			return redirect(url_for('back_office.Index_user',conf_id=conf_id,conf_key=conf_key,del_status_id=del_status_id))
		
	except Exception as e:
		flash(str(e),"Payerror")
		return redirect(url_for('back_office.Index_user',conf_id=conf_id,conf_key=conf_key,del_status_id=del_status_id))
		
@app.route('/<int:conf_id>/<conf_key>/post_bulk_confirm_upi_reg', methods = ["GET", "POST"])
@RouteGroup.conf_required
def postBulkConfirmUPIReg(conf_id,conf_key):
	confirm_mail     = None
	reciept_mail     = None
	msg              = ""
	conf             = UserModel().get_confUserModel(conf_id,conf_key)
	unique_id        = request.values.get('unique_id')
	confirm_mail     = request.values.get('confimation_mail' or None ) or None
	receipt_mail     = request.values.get('receipt_mail'or None ) or None
	transaction_ids  = request.values.get('transaction_ids'or None ) or None
	unique_id = unique_id.replace(","," ")
	unique_id = unique_id.split()
	for row in unique_id:
		success_msg  = BoGenerateDelegateNoAndReceiptNoByUniqueId(conf_id,conf_key,row,confirm_mail,receipt_mail)
		msg          = msg + success_msg

	if transaction_ids:
		status                   = 2
		payment_msg              = "Payment successful."
		reg_transaction_data     = VerifyPaymentModel().getRegTranscationDetailsByitsIds(conf_id,transaction_ids)
		not_reg_transaction_data = VerifyPaymentModel().getNotTranscationDetailsByitsIds(conf_id,transaction_ids)
		html      	             = render_template('verifyPayment/searched_transaction_details_table.html',reg_transaction_data=reg_transaction_data,not_reg_transaction_data=not_reg_transaction_data,conf=conf,conf_id=conf_id,conf_key= conf_key,str=str,int=int,type=type)
	else:
		html        = None
		payment_msg = ''
		msg         = msg +'No records found'
		status      = 1	
	
	data ={ "payment_msg":payment_msg,'msg':msg,'status':status,'html':html}	
	return jsonify(data)	



@app.route('/<int:conf_id>/<conf_key>/bo_generate_delegate_no_and_receipt_no_by_unique_id', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BoGenerateDelegateNoAndReceiptNoByUniqueId(conf_id,conf_key,unique_id,confirm_mail,receipt_mail):
	conf              = UserModel().get_confUserModel(conf_id,conf_key)
	msg               = ''
	confirmation_mail = confirm_mail
	receipt_mail      = receipt_mail
	role              = None
	receipt_data       = BOModel().bo_generate_delegate_no_and_receipt_no(unique_id,conf_id,role)
	if confirmation_mail == "confimation_mail" and receipt_mail == "receipt_mail":
		if receipt_data:
			receipt_data = receipt_data[0]
			delegate_ids  = receipt_data['delegate_ids']
			delegate_nos = receipt_data['delegate_nos']
		dele_id = delegate_ids.split(",")
		for i in dele_id:
			delegate_id = i
			BoConfirmationAndReceiptDelegagteMail(conf_id,conf_key,delegate_id,unique_id,None,1,None)

	elif confirmation_mail == "confimation_mail" and receipt_mail == None:
		if receipt_data:
			receipt_data = receipt_data[0]
			delegate_ids  = receipt_data['delegate_ids']
			delegate_nos = receipt_data['delegate_nos']
		dele_id = delegate_ids.split(",")
		for i in dele_id:
			delegate_id = i
			if confirmation_mail == "confimation_mail" :
				BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,1,None)
			else:
				BoConfirmationDelegateMail(conf_id,conf_key,delegate_id,None,0,None)	
	elif receipt_mail =="receipt_mail" and confirmation_mail ==None:
		if receipt_data:

			receipt_data = receipt_data[0]
			delegate_ids  = receipt_data['delegate_ids']
			delegate_nos = receipt_data['delegate_nos']
		BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,1,None)
	else:
		if receipt_data:
			receipt_data = receipt_data[0]
			delegate_ids  = receipt_data['delegate_ids']
			delegate_nos = receipt_data['delegate_nos']
		BoReceiptDelegagteMail(conf_id,conf_key,unique_id,None,0,None)
		
	# Reference number added here
	is_gen_number = conf['is_gen_number']
	if is_gen_number == 'ref_number':
		msg   = msg + "<br/><br/>An amount of {} has been made towards {} registration.<br>The receipt has been email to {}.A delegate registration confirmation email has been sent to the email id of the delegate(s).<br><b>Receipt no. {} . Reference no(s). {}</b>".format(receipt_data['amount'],conf['conf_name'],receipt_data['email'],receipt_data['receipt_no'],receipt_data['ref_nos'])
	else:    
		msg   = msg + "<br/><br/>An amount of {} has been made towards {} registration.<br>The receipt has been email to {}.A delegate registration confirmation email has been sent to the email id of the delegate(s).<br><b>Receipt no. {} . Delegate no(s). {}</b>".format(receipt_data['amount'],conf['conf_name'],receipt_data['email'],receipt_data['receipt_no'],receipt_data['delegate_nos'])
	return msg
	
	
	

def DelegateReportSendMail(conf_id,conf_key,date_1):
	conf              = Auth.getConf(conf_id,conf_key)
	mailData          = None
	row_val           = []
	today_count       = 0
	total_count       = 0
	today_paid_amount = 0
	total_paid_amount = 0
	today_del_count   = 0
	total_del_count   = 0
	current_dt        = datetime.now() - timedelta(1)
	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
	base_url 	      = request.host_url
	if "https" in base_url :
		pass
	else :
		base_url = base_url.replace("http" ,"https")
	
	if date_1 :
		previous_date = date_1
	else :
		yesterday     = datetime.now() - timedelta(1)
		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
		previous_date = yesterday
	
	users             = BOModel().get_daily_count_send_mail(conf_id,conf_key)   
	dt_string         = datetime.now().strftime("%d-%m-%Y %I:%M %p")

	bcc_mail = []
	to_mail  = []

	if users :
		reg_data = BOModel().GetRegDataForMail(previous_date,conf_id)
		for index, value in enumerate(reg_data):
			addon_type_id       = value["addon_type_id"]
			today_count         = today_count+value['today_count']
			total_count         = total_count+value['total_count']
			today_paid_amount   = today_paid_amount+value['today_paid_amount']
			total_paid_amount   = total_paid_amount+value['total_paid_amount']
			if addon_type_id == 1:
				today_del_count         = today_del_count+value['today_count']
				total_del_count         = total_del_count+value['total_count']
		if reg_data :
			for index,value in enumerate(users):
				if "@numerotec.com" in value['email']:
					bcc_mail.append(value['email'])
				else :
					to_mail.append(value['email'])

			if to_mail :
				to_str  = str(to_mail).replace('[','').replace(']','').replace("'",'').replace(",",' / ')
			else :
				to_mail  = ['karthick@numerotec.com','ramya@numerotec.com','aravinth@numerotec.com','santhosh@numerotec.com','sridharan.r@numerotec.com','sai@numerotec.com','dp@numerotec.com','manjula@numerotec.com']
				bcc_mail = None
				to_str   = None

			html    = render_template('email/reg_report_email.html',previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count,base_url=base_url,to_mail=to_str)
			subject = conf['conf_name']+"- Delegate Registration Count as on {}".format(dt_string)
			EMAIL.MailTemplateSendMail_v2(subject,html,to_mail,bcc_mail,mailData,conf)
			return "success"
	else : 
		return "Report data is not available."      
		 

# updated on 06 Oct 2022
# @app.route('/<int:conf_id>/<conf_key>/bo_reg_report_view', methods = ["GET", "POST"])
# @RouteGroup.conf_required
# def BORegReportView(conf_id,conf_key):
# 	conf              = Auth.getConf(conf_id,conf_key)
# 	today_count       = 0
# 	total_count       = 0
# 	today_paid_amount = 0
# 	total_paid_amount = 0
# 	today_del_count   = 0
# 	total_del_count   = 0 
# 	bcc_mail          = []
# 	to_mail           = []
# 	dt_string         = datetime.now().strftime("%d-%m-%Y %I:%M %p")
# 	date_1            = request.values.get("date",None)
# 	current_dt        = datetime.now() - timedelta(1)
# 	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
# 	base_url 	      = request.host_url
# 	if "https" in base_url :
# 		pass
# 	else :
# 		base_url = base_url.replace("http" ,"https")
# 	if date_1 :
# 		previous_date = date_1
# 	else :
# 		yesterday     = datetime.now() - timedelta(1)
# 		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
# 		previous_date = yesterday
	
# 	users    = BOModel().get_daily_count_send_mail(conf_id,conf_key)
# 	for index,value in enumerate(users):
# 		if "@numerotec.com"  in  value['email'] :
# 			bcc_mail.append(value['email'])
# 		else :
# 			to_mail.append(value['email'])
# 	if to_mail :
# 		to_str  = str(to_mail).replace('[','').replace(']','').replace("'",'').replace(",",' / ')
# 	else :
# 		# to_mail = ['sai@numerotec.com','manjula@numerotec.com','dp@numerotec.com','sridharan.r@numerotec.com']
# 		# Testing Purpose
# 		to_mail  = ['karthick@numerotec.com','ramya@numerotec.com','aravinth@numerotec.com','santhosh@numerotec.com']
# 		to_str  = None
# 	reg_data = BOModel().GetRegDataForMail(previous_date,conf_id)
# 	if reg_data :
# 		for index, value in enumerate(reg_data):
# 			addon_type_id       = value["addon_type_id"]
# 			today_count         = today_count+value['today_count']
# 			total_count         = total_count+value['total_count']
# 			today_paid_amount   = today_paid_amount+value['today_paid_amount']
# 			total_paid_amount   = total_paid_amount+value['total_paid_amount']
# 			if addon_type_id == 1:
# 				today_del_count         = today_del_count+value['today_count']
# 				total_del_count         = total_del_count+value['total_count']

# 		return render_template('email/reg_report_email.html',previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count,base_url=base_url,to_mail=to_str)
# 	else :
# 		return "Registration record not exists." 
		
@app.route('/<int:conf_id>/<conf_key>/bo_reg_report_view', methods = ["GET", "POST"])
@RouteGroup.conf_required
def BORegReportView(conf_id,conf_key):
	conf              = Auth.getConf(conf_id,conf_key)
	today_count       = 0
	total_count       = 0
	today_paid_amount = 0
	total_paid_amount = 0
	today_del_count   = 0
	total_del_count   = 0 
	bcc_mail          = []
	to_mail           = []
	dt_string         = datetime.now().strftime("%d-%m-%Y %I:%M %p")
	date_1            = request.values.get("date",None)
	current_dt        = datetime.now() - timedelta(1)
	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
	base_url 	      = request.host_url
	if "https" in base_url :
		pass
	else :
		base_url = base_url.replace("http" ,"https")
	if date_1 :
		previous_date = date_1
	else :
		yesterday     = datetime.now() - timedelta(1)
		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
		previous_date = yesterday
	
	users    = BOModel().get_daily_count_send_mail(conf_id,conf_key)
	for index,value in enumerate(users):
		if "@numerotec.com"  in  value['email'] :
			bcc_mail.append(value['email'])
		else :
			to_mail.append(value['email'])
	if to_mail :
		to_str  = str(to_mail).replace('[','').replace(']','').replace("'",'').replace(",",' / ')
	else :
		# to_mail = ['sai@numerotec.com','manjula@numerotec.com','dp@numerotec.com','sridharan.r@numerotec.com']
		# Testing Purpose
		to_mail  = ['karthick@numerotec.com','ramya@numerotec.com','aravinth@numerotec.com','santhosh@numerotec.com']
		to_str  = None
	# reg_data = BOModel().GetRegDataForMail(previous_date,conf_id)
	reg_data     = BOModel().GetRegDataForMail_v2(previous_date,conf_id)
	for index,value in enumerate(reg_data):
		if index == 0:
			reg_data   = value
		if index == 1:
			conf_db    = value[0]
		if index == 2:
			waiting_for_approval_data = value

	waiting_count = {}
	if waiting_for_approval_data :
		waiting_total_count = waiting_for_approval_data[0]['total_waiting_count']
		if int(waiting_total_count) == 0 :
			is_show_waiting_count = 0
		else:
			today_waiting_count         = 0
			total_waiting_count         = 0
			today_waiting_paid_amount   = 0
			total_waiting_paid_amount   = 0
			is_show_waiting_count       = 1
			today_waiting_count         = today_waiting_count + waiting_for_approval_data[0]['today_waiting_count']
			total_waiting_count         = total_waiting_count + waiting_for_approval_data[0]['total_waiting_count']
			today_waiting_paid_amount   = today_waiting_paid_amount + waiting_for_approval_data[0]['today_waiting_paid_amount']
			total_waiting_paid_amount   = total_waiting_paid_amount + waiting_for_approval_data[0]['total_waiting_paid_amount']
			waiting_count               = {'today_waiting_count':today_waiting_count,'total_waiting_count':total_waiting_count,'today_waiting_paid_amount':today_waiting_paid_amount,'total_waiting_paid_amount':total_waiting_paid_amount}
	else :
		is_show_waiting_count = 0



	if reg_data :
		for index, value in enumerate(reg_data):
			addon_type_id       = value["addon_type_id"]
			today_count         = today_count+value['today_count']
			total_count         = total_count+value['total_count']
			today_paid_amount   = today_paid_amount+value['today_paid_amount']
			total_paid_amount   = total_paid_amount+value['total_paid_amount']
			if addon_type_id == 1:
				today_del_count         = today_del_count+value['today_count']
				total_del_count         = total_del_count+value['total_count']

		return render_template('email/reg_report_email.html',waiting_count = waiting_count,is_show_waiting_count = is_show_waiting_count,previous_date =yester_dt,reg_data = reg_data,conf=conf_db,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count,base_url=base_url,to_mail=to_str)
	else :
		return "Registration record not exists." 
		

# Purpose : Separate conference mail version 2 start
# Created on 2024-04-13 12:00 
@app.route('/daily_count_delegate_mail_v2', methods = ["GET", "POST"])
def DailyCountDelegateMail_v2():
	send_manual    = request.values.get('send_manual',None)
	date_1         = request.values.get("date",None)
	current_tm     = datetime.now()
	reg_end_on     = current_tm + timedelta(days=2)
	dt_string      = current_tm.strftime("%Y-%m-%d %I:%M %p")
	next_day       = reg_end_on + timedelta(days=2)
	if send_manual and int(send_manual) > 0  :
		DelegateReportSendMail_v2(date_1)
		return "Mail sent Successful."
	else :
		if next_day > current_tm :
			if (current_tm.hour == 5 and current_tm.minute > 45) or (current_tm.hour == 6 and current_tm.minute < 25):
				DelegateReportSendMail_v2(date_1)
				return "Mail sent Successful."
			else:
				return ( dt_string +" Time not match ")  
		else:
			return "Registration closed"

def DelegateReportSendMail_v2(date_1):
	dt_string 	  	  = datetime.now().strftime("%d-%m-%Y %I:%M %p")
	reg_data_list 	  = defaultdict(list)
	conf_list     	  = defaultdict(list)
	waiting_list   	  = defaultdict(list)
	current_dt        = datetime.now() - timedelta(1)
	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
	base_url 	      = request.host_url
	if "https" in base_url :
		pass
	else :
		base_url = base_url.replace("http" ,"https")
	
	if date_1 :
		previous_date = date_1
	else :
		yesterday     = datetime.now() - timedelta(1)
		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
		previous_date = yesterday


	data 		  = BOModel().GetRegDataForMail_v2(previous_date,None)
	for index,value in enumerate(data):
		if index == 0:
			reg_data   = value
		if index == 1:
			conf_db = value
		if index == 2:
			waiting_data_db = value

	active_conf_list = []
	for r in reg_data:
		reg_data_list[r["conf_id"]].append(r)


	for r in waiting_data_db:
		waiting_list[r["conf_id"]].append(r)
	
	for r in conf_db:
		active_conf_list.append(r['conf_id'])
		conf_list[r["conf_id"]].append(r)

	if active_conf_list :
		for conf_id in active_conf_list:
			today_count       = 0
			total_count       = 0
			today_paid_amount = 0
			total_paid_amount = 0
			today_del_count   = 0
			total_del_count   = 0
			reg_data  		  = reg_data_list[conf_id]
			conf      		  = conf_list[conf_id][0]
			conf_name 		  = conf['conf_name']
			to_mail   		  = conf['to_mail_id']
			bcc_mail  		  = conf['bcc_mail_id']
			if to_mail :
				to_str  = str(to_mail).replace(",",' / ')
			else :
				to_mail  = 'karthick@numerotec.com,ramya@numerotec.com,aravinth@numerotec.com,santhosh@numerotec.com,sridharan.r@numerotec.com,sai@numerotec.com,dp@numerotec.com,manjula@numerotec.com'
				bcc_mail = None
				to_str   = None
			
			for value in reg_data_list[conf_id]:
				addon_type_id       = value["addon_type_id"]
				today_count         = today_count+value['today_count']
				total_count         = total_count+value['total_count']
				today_paid_amount   = today_paid_amount+value['today_paid_amount']
				total_paid_amount   = total_paid_amount+value['total_paid_amount']
				if addon_type_id == 1:
					today_del_count = today_del_count+value['today_count']
					total_del_count = total_del_count+value['total_count']

			waiting_count = {}
			waiting_for_approval_data = waiting_list[conf_id]
			

			if waiting_for_approval_data :
				waiting_total_count = waiting_for_approval_data[0]['total_waiting_count']
				if int(waiting_total_count) == 0 :
					is_show_waiting_count = 0
				else:
					today_waiting_count         = 0
					total_waiting_count         = 0
					today_waiting_paid_amount   = 0
					total_waiting_paid_amount   = 0
					is_show_waiting_count       = 1
					today_waiting_count         = today_waiting_count + waiting_for_approval_data[0]['today_waiting_count']
					total_waiting_count         = total_waiting_count + waiting_for_approval_data[0]['total_waiting_count']
					today_waiting_paid_amount   = today_waiting_paid_amount + waiting_for_approval_data[0]['today_waiting_paid_amount']
					total_waiting_paid_amount   = total_waiting_paid_amount + waiting_for_approval_data[0]['total_waiting_paid_amount']
					waiting_count               = {'today_waiting_count':today_waiting_count,'total_waiting_count':total_waiting_count,'today_waiting_paid_amount':today_waiting_paid_amount,'total_waiting_paid_amount':total_waiting_paid_amount}
			else :
				is_show_waiting_count = 0

			html     = render_template('email/reg_report_email.html',waiting_count = waiting_count,is_show_waiting_count = is_show_waiting_count,previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count,base_url=base_url,to_mail=to_str)
			subject  = conf_name +"- Delegate Registration Count as on {}".format(dt_string)
			
			# to_mail  = "ramya@numerotec.com"
			# bcc_mail = "karthick@numerotec.com"
# 			bcc_mail = None
			EMAIL.MailTemplateSendMail_v2(subject,html,to_mail,bcc_mail,None,conf)

		return "success"
	else : 
		return "Report data is not available."  

# def DelegateReportSendMail_v2(date_1):
# 	dt_string 	  	  = datetime.now().strftime("%d-%m-%Y %I:%M %p")
# 	reg_data_list 	  = defaultdict(list)
# 	conf_list     	  = defaultdict(list)
# 	current_dt        = datetime.now() - timedelta(1)
# 	yester_dt         = datetime.strftime(current_dt, '%d-%m-%Y')
# 	base_url 	      = request.host_url
# 	if "https" in base_url :
# 		pass
# 	else :
# 		base_url = base_url.replace("http" ,"https")
	
# 	if date_1 :
# 		previous_date = date_1
# 	else :
# 		yesterday     = datetime.now() - timedelta(1)
# 		yesterday     = datetime.strftime(yesterday, '%Y-%m-%d')
# 		previous_date = yesterday

# 	data 		  = BOModel().GetRegDataForMail_v2(previous_date)
# 	for index,value in enumerate(data):
# 		if index == 0:
# 			reg_data   = value
# 		if index == 1:
# 			conf_db = value

# 	active_conf_list = []
# 	for r in reg_data:
# 		reg_data_list[r["conf_id"]].append(r)

# 	for r in conf_db:
# 		active_conf_list.append(r['conf_id'])
# 		conf_list[r["conf_id"]].append(r)

# 	if active_conf_list :
# 		for conf_id in active_conf_list:
# 			today_count       = 0
# 			total_count       = 0
# 			today_paid_amount = 0
# 			total_paid_amount = 0
# 			today_del_count   = 0
# 			total_del_count   = 0
# 			reg_data  		  = reg_data_list[conf_id]
# 			conf      		  = conf_list[conf_id][0]
# 			conf_name 		  = conf['conf_name']
# 			to_mail   		  = conf['to_mail_id']
# 			bcc_mail  		  = conf['bcc_mail_id']
# 			if to_mail :
# 				to_str  = str(to_mail).replace(",",' / ')
# 			else :
# 				to_mail  = 'karthick@numerotec.com,ramya@numerotec.com,aravinth@numerotec.com,santhosh@numerotec.com,sridharan.r@numerotec.com,sai@numerotec.com,dp@numerotec.com,manjula@numerotec.com'
# 				bcc_mail = None
# 				to_str   = None
			
# # 			to_mail  = "aravinth@numerotec.com,santhosh@numerotec.com"
# # 			bcc_mail = "karthick@numerotec.com"
# 			for value in reg_data_list[conf_id]:
# 				addon_type_id       = value["addon_type_id"]
# 				today_count         = today_count+value['today_count']
# 				total_count         = total_count+value['total_count']
# 				today_paid_amount   = today_paid_amount+value['today_paid_amount']
# 				total_paid_amount   = total_paid_amount+value['total_paid_amount']
# 				if addon_type_id == 1:
# 					today_del_count = today_del_count+value['today_count']
# 					total_del_count = total_del_count+value['total_count']

# 			html     = render_template('email/reg_report_email.html',previous_date =yester_dt,reg_data = reg_data,conf=conf,date=dt_string,today_count=today_count,total_count=total_count,today_paid_amount=today_paid_amount,total_paid_amount=total_paid_amount,today_del_count=today_del_count,total_del_count=total_del_count,base_url=base_url,to_mail=to_str)
# 			subject  = conf_name +"- Delegate Registration Count as on {}".format(dt_string)
# 			EMAIL.MailTemplateSendMail_v2(subject,html,to_mail,bcc_mail,None,conf)


# 		return "success"
# 	else : 
# 		return "Report data is not available."      

# Separate conference mail version 2 ends		

# UTR SEARCH START

@app.route('/<int:conf_id>/<conf_key>/bo/bo_search_upi_details', methods = ["POST","GET"])
def BoSearchUpiDetails(conf_id,conf_key):
	delegateData = ""
	try:
		conf        = Auth.getConf(conf_id,conf_key)
		search_data = request.values.get("search_data")
		if search_data:
			parent_user_id = None
			delegateData         = BOModel().bo_search_utr_details(parent_user_id,conf_id,search_data)
			del_html_data_dev    = render_template('backoffice_user/bo_waiting_for_gen_del_no_table.html' ,user_data = delegateData,conf_id =conf_id,conf_key=conf_key,conf_data=conf,conf=conf,str=str,type=type)
			data                 = {"del_html_data_dev":del_html_data_dev,"msg":"","status" :1 }
		else:
			del_html_data_dev    = render_template('backoffice_user/bo_waiting_for_gen_del_no_table.html' ,user_data = delegateData,conf_id =conf_id,conf_key=conf_key,conf_data=conf,conf=conf,str=str,type=type)
			data                 = {"del_html_data_dev":"","msg":"Please enter UTR number","status" :2 }
		return json.dumps(data ,default=str)
	except Exception as e:
		data        = {"del_html_data_dev":"","msg" : str(e) ,"status" : 401}
		return json.dumps(data ,default=str)


# UTR SEARCH END


#----------------offline registration start ------------------------------------------------


'''------------------------ Offine Registartion in Back Office Start ----------------------------------------'''
@app.route('/<int:conf_id>/<conf_key>/bo/trade_offline_registration', methods = [ "GET","POST"])
@RouteGroup.conf_required
@RouteGroup.bo_trade_login_required
def TradeBoDelegate(conf_id,conf_key):
	now             = datetime.now()
	curr_dt       	= now.strftime("%Y-%m-%d %H:%M:%S")
	conf 			= Auth.getConf(conf_id,conf_key)
	reg_option 		= request.values.get('reg_option') or None 		
				
	society_id       = conf['society_id']
	parent_user_id   = Auth.user(society_id)['user_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)
	is_custom_addons = 1
	state_id         = UserModel().get_states()  
	country_id       = UserModel().get_country()
	reg_types        = BOModel().get_addon_reg_type(conf_id)
	addons           = TradeModel().get_addonsTradeBOModel(delegate_id,curr_dt,conf_id,None,is_custom_addons,parent_user_id,reg_option)
	parent_user      = UserModel().get_user(parent_user_id,society_id,conf_id)
	badge_role       = BOModel().get_badge_model(conf_id)
	
	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

	incompleted_template    = TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
	return render_template('trade/offline/register_page.html',reg_option=reg_option,conf_id=conf_id,conf_key=conf_key,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,incompleted_template=incompleted_template,badge_role=badge_role)
		

@app.route('/bo/check_self_reg', methods = [ "GET","POST"])
def check_self_reg():
	user_id         = request.values.get('user_id',0)
	society_id      = request.values.get('society_id')
	check_user_del  = BOModel().check_user_delegate(user_id,society_id)
	return str(check_user_del)


@app.route('/<int:conf_id>/<conf_key>/bo/trade_selected_member', methods = [ "POST"])
def TradeBoSelectedMember(conf_id,conf_key):
	now              = datetime.now()
	curr_dt       = now.strftime("%Y-%m-%d %H:%M:%S")
	conf             = Auth.getConf(conf_id,conf_key)
	
	# conf            = BOModel().get_conf(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)
	reg_option 		 = 'Member' 	
	data             = UserModel().get_state_country_users_type(user_id,society_id,delegate_id,conf_id,parent_user_id,now)
	is_custom_addons = 1
	addons           = TradeModel().get_addonsTradeBOModel(delegate_id,curr_dt,conf_id,None,is_custom_addons,parent_user_id,reg_option)
	badge_role       = BOModel().get_badge_model(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(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    = OfflineModel().get_member_details(user_id,curr_dt)
			html_data =  render_template('trade/offline/register_page_content.html',delegate=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,badge_role=badge_role)
			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('back_office.BoRegister',conf_id=conf_id,conf_key=conf_key))
		

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

	conf = Auth.getConf(conf_id,conf_key)
	if request.method == 'POST':
		conf             = BOModel().get_conf(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)
		update           = request.values.get('update',0)
		reg_option 		 = request.values.get('reg_option') or None
		print("reg_option")
		print(reg_option)
		data             = UserModel().get_state_country_users_type(user_id,society_id,delegate_id,conf_id,parent_user_id,now)
		is_custom_addons = 1
		addons           = TradeModel().get_addonsTradeBOModel(delegate_id,curr_dt,conf_id,None,is_custom_addons,parent_user_id,reg_option)
		badge_role       = BOModel().get_badge_model(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(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   = OfflineModel().get_member_details(user_id,curr_dt)
				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 
					return render_template('trade/offline/register_page_content.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,badge_role=badge_role)
				else:
					return render_template('trade/offline/register_page_content.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,badge_role=badge_role)          
				
		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         
		return render_template('trade/offline/register_page_content.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,badge_role=badge_role)
	else :
		return redirect(url_for('back_office.BoRegister',conf_id=conf_id,conf_key=conf_key))
		
@app.route('/<int:conf_id>/<conf_key>/bo/edit_delegate', methods = [ "GET","POST"])
@RouteGroup.conf_required
def BoEditDelegate(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            = BOModel().get_conf(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)
	del_status_id    = request.values.get('del_status_id')
	reg_option 		 = request.values.get('reg_option') or None
	data             = UserModel().get_state_country_users_type(user_id,society_id,delegate_id,conf_id,parent_user_id,now)
	is_custom_addons = 1
	addons           = TradeModel().get_addonsTradeBOModel(delegate_id,curr_dt,conf_id,None,is_custom_addons,parent_user_id,reg_option)
	badge_role       = BOModel().get_badge_model(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(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   = OfflineModel().get_member_details(user_id,curr_dt)
			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 
				return render_template('backoffice_user/delegate_registration/edit_index_page_member.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,del_status_id=del_status_id,badge_role=badge_role)
			else:
				return render_template('backoffice_user/delegate_registration/edit_index_page_member.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,del_status_id=del_status_id,badge_role=badge_role)            

	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
	return render_template('backoffice_user/delegate_registration/edit_index_page_member.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,del_status_id=del_status_id,badge_role=badge_role)


@app.route('/<int:conf_id>/<conf_key>/bo/delete_delegate', methods = [ "GET","POST"])
@RouteGroup.conf_required
def BoDeleteDelegate(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)
	if int(str(delegate_id)) > 0:
		BOModel().delete_delegate(delegate_id)
		incompleted_template =  TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)

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



@app.route('/<int:conf_id>/<conf_key>/bo/trade_search_user', methods = ["GET", "POST"])
@RouteGroup.conf_required
def TradeBoGetSearchUser(conf_id,conf_key):
	conf = Auth.getConf(conf_id,conf_key)
	if request.method == 'POST':
		conf       = BOModel().get_conf(conf_id,conf_key)
		society_id = conf['society_id']
		search     = request.values.get('search')
		user_id    = request.form['user_id']
		user       = UserModel().get_search_user(search,society_id,conf_id)
		if user == None:
			html = None
		else:   
			html = render_template('trade/offline/search_table.html' , user_data= user,conf_id=conf_id,conf_key=conf_key)
		return json.dumps(html ,default=str)
	else:
		return redirect(url_for('back_office.BoRegister',conf_id=conf_id,conf_key=conf_key))    


@app.route('/<int:conf_id>/<conf_key>/bo/trade_post_add_register', methods = ["POST"])
@RouteGroup.conf_required
def TradeBoPostAddRegister(conf_id,conf_key):
	now             = datetime.now()
	curr_dt         = now.strftime("%Y-%m-%d %H:%M:%S")
	conf            = Auth.getConf(conf_id,conf_key)
	pg_cert_path    = None
	pg_cert_name    = None	
	file            = None
	file_upload     = None # For upload certificates in delegates table # Added by Ganesan J
	is_file_upload  = 0
	msg             = ""
	status          = 1
	data            = ""
	delegate_id     = request.form['delegate_id'] or None
	conf_id         = request.form['conf_id']
	conf_key        = request.form['conf_key']
	society_id      = conf['society_id']
	email           = request.form['email'] 
	mobile          = request.form['mobile']
	parent_user_id  = request.form['parent_user_id']
	user_id         = request.form['user_id']




	if int(user_id) > 0 :
		output      = UserModel().get_user(user_id,society_id,conf_id)
		email       = output['email']
		mobile 		= output['mobile']
	else:
		email  = email
		mobile = mobile
	
	# conf          = BOModel().get_conf(conf_id,conf_key)
	dt_string       = now.strftime("%Y-%m-%d %H:%M:%S")
	prefix          = request.form['prefix'] or None
	full_name       = request.form['full_name'] or None
	
	date_of_birth   = request.form['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.form['gender'] or None
	address1        = request.form['address1'] or None
	address2        = request.form['address2'] or None
	address3        = request.form['address3'] or None
	city            = request.form['city'] or None
	pincode         = request.form['pincode'] or None
	state_id        = request.form['state_id'] or None
	country_id      = request.form['country_id'] or None
	mc_number       = request.form['mc_number'] or None
	mc_state_id     = request.form['mc_state_id'] or None
	membership_no   = request.form['membership_no'] or None
	role   	        = request.form['role'] or None
	
	if role :
		if "_" in  role :
			role_1	= role.split("_")
			role    = role_1[0]
			range_1 = role_1[1]
		else :
			role = "DELEGATE"
			range_1 = 1

	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
	designation     = request.values.get('designation') or None
	institution     = request.values.get('institution') or None
	nationality     = request.values.get('nationality') or None
	accom_persons   = request.values.get("accom_persons" or None)
	delegate_remarks= request.form['delegate_remarks'] or None
	is_take_part_bpw= request.values.get('is_take_part_bpw') or None
	mem_applied_at  = request.values.get('mem_applied_at') or None
	mem_is_applied  = request.values.get('mem_is_applied') or None
	mem_year        = request.values.get('mem_year') or None
	food            = request.values.get('food') or None
	age             = request.values.get('age') or None
	user_type_id    = None
	district        = request.values.get('district') or None
	# Delegate Image
	image_data           = request.values.get('delegate_image_base64',None) 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
	
	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
	conf_id           = conf_id
	reg_types         = BOModel().get_addon_reg_type(conf_id)
	addons            = BOModel().get_addonsBOModel(delegate_id,curr_dt,conf_id)
	reg_addons        = {} 
	insert_del_addons = []
	delete_del_addons = [] 

	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 = {}

	for rt in reg_types:
		is_mandatory[rt['addon_type_id']]   =  rt['is_mandatory']
		values = request.values.getlist(rt.get('input_name'))

		if values:
			is_mandatory[rt['addon_type_id']] = 0
			for val in values:
				addon_id     = val
				addon        = reg_addons[int(val)]
				user_type_id = addon.get("user_type_id")



				if  addon.get("delegate_addon_id") and addon.get("delegate_addon_id") > 0 and request.form['addon_amount_'+val] == addon.get("amount"):
					#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"           : request.form['addon_amount_'+val] or addon.get("amount",0),
								 "original_amount"  : request.form['addon_amount_'+val] or addon.get("amount",0),
								 "reg_status"       : 0      
					}
					insert_del_addons.append(add_data)

	# TNASICON 2023	
	if conf_id and int(conf_id) in [19] :
		if addon_id:
			if int(addon_id) in [223,377,378,379]:
				file  = request.files.get('files_asi',None)	
				if file:
					image_name  = "tnasicon2023_asipayment_proof_"
					foldername  = ""
					is_file_upload = 1
	
	# IAP KARNATAKA 2023,SZTNAOI 2023
	if conf_id and int(conf_id) in [32,36,8] :
		file  = request.files.get('files',None)	
		if file:
			image_name     = "certificate_proof_"
			foldername     = ""
			is_file_upload = 1	

	 # MEDITER RETINA CLUB 2023 
	if conf_id and int(conf_id) == 37 :
		if addon_id:
			if int(addon_id) in [553,554,557,559,561,562,565,567,571,573,575,576]:
				file  = request.files.get('files',None)
				if file:
					image_name     = "certificate_proof_"
					foldername     = ""
					is_file_upload = 1	

	# IPGS 2023	
	if conf_id and int(conf_id) == 29 :
		if addon_id:
			if int(addon_id) in [365,373,369]:
				file  = request.files.get('files_', None)
				if file:
					image_name     = "certificate_proof_"
					foldername     = ""
					is_file_upload = 1


	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
		else :
			return file_upload_msg					


	reg_Validation = []
	for key in is_mandatory:
		if is_mandatory[key] == 1:
			reg_Validation.append({'key': key ,'msg': "following field is mandatory."})  
			status = 0;

	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,
				'admin_user_id' : parent_user_id,
				'society_id'    : society_id,
				'is_offline'    : 1,
				'd_is_kit'      : 1,
				'role'		    : role,
				'check_in_date' : check_in_date,
				'check_out_date': check_out_date,
				'check_in_time' : check_in_time,
				'check_out_time': check_out_time,
				'designation'	: designation,
				'institution'	: institution,
				'nationality'	: nationality,
				'accom_persons' : accom_persons,
				'delegate_remarks': delegate_remarks,
				'is_take_part_bpw':is_take_part_bpw,
				'district'        : district,
				# extra input fields
				'mem_is_applied'  : mem_is_applied,
				'mem_applied_at'  : mem_applied_at,
				'mem_year' 		  : mem_year,
				'age'      		  : age,
				'food'     		  : food,
				'reg_type_id'     : user_type_id,
				'del_status_id'	  : 0  
			}
	
	cert_proof_deleted = request.values.get('cert_proof_deleted') or 0
	asi_proof_deleted = request.values.get('asi_proof_deleted') or 0
	res_proof_deleted = request.values.get('res_proof_deleted_') or 0

	if conf_id and int(conf_id) in [32,36,8] :
		if pg_cert_path  or int(cert_proof_deleted) == 1:
			del_data['pg_cert_path'] = pg_cert_path
		if pg_cert_name  or int(cert_proof_deleted) == 1:	
			del_data['pg_cert_name'] = pg_cert_name
	
	if conf_id and int(conf_id) == 19 :
		if addon_id:
			if int(addon_id) in [223,377,378,379]:
				if pg_cert_path  or int(asi_proof_deleted) == 1:
					del_data['pg_cert_path'] = pg_cert_path
				if pg_cert_name  or int(asi_proof_deleted) == 1:	
					del_data['pg_cert_name'] = pg_cert_name		
					
			
	if conf_id and int(conf_id)== 29 :
		if addon_id:
			if int(addon_id) in [365,373,369]:
				if pg_cert_path  or int(res_proof_deleted) == 1:
					del_data['pg_cert_path'] = pg_cert_path
				if pg_cert_name  or int(res_proof_deleted) == 1:	
					del_data['pg_cert_name'] = pg_cert_name
			else:
				del_data['pg_cert_path'] = None
				del_data['pg_cert_name'] = None	
				
	if conf_id and int(conf_id) == 37 :
		if addon_id:
			if int(addon_id) in [553,554,557,559,561,562,565,567,571,573,575,576]:
				if pg_cert_path  or int(cert_proof_deleted) == 1:
					del_data['pg_cert_path'] = pg_cert_path
				if pg_cert_name  or int(cert_proof_deleted) == 1:	
					del_data['pg_cert_name'] = pg_cert_name
			else:
				del_data['pg_cert_path'] = None
				del_data['pg_cert_name'] = None				
	
	if int(time_set) == 0:
		del_data.update(created_at_date)
	else:
		del_data.update(updated_at_date) 

	
	trade_by_limit   = Auth.user(society_id)['trade_by_limit']
	
	if user_type_id :
		if trade_by_limit and int(trade_by_limit) == 1 :
			get_trade_limit = TradeModel().get_trade_by_limit(parent_user_id,user_type_id,conf_id,delegate_id)
			get_trade_del_count = TradeModel().get_total_trade_del_count(parent_user_id,conf_id)

			# Reg. type limit check
			reg_limit            = get_trade_limit['reg_limit']
			total_reg_limit_count = get_trade_limit['total_delegate_count']
			
			# Total limit check
			trade_access_limit   = get_trade_limit['trade_access_limit'] or 0 
			total_trade_del_count = get_trade_del_count['total_trade_del_count'] or 0

			trade_error_msg = get_trade_limit['user_type']

			if int(trade_access_limit) >= int(total_trade_del_count) :
				if int(total_reg_limit_count) == 0 :
					pass
				elif int(reg_limit) <= int(total_reg_limit_count) :
					incompleted_template = TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
					data={ 'msg':trade_error_msg +' Limit reached','status':0,'incompleted_template':incompleted_template}
					return jsonify(data)
			else:
				incompleted_template = TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
				data={ 'msg':'Total limit reached','status':0,'incompleted_template':incompleted_template}
				return jsonify(data)


		else :

			get_trade_limit = TradeModel().get_trade_limit(parent_user_id,user_type_id,conf_id,delegate_id)

			total_reg_limit_count = get_trade_limit['total_delegate_count']
			trade_access_limit   = get_trade_limit['trade_access_limit'] or 0

			trade_error_msg = ""
			if int(total_reg_limit_count) < int(trade_access_limit):
				pass
			else:
				incompleted_template = TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
				data={ 'msg':trade_error_msg +' Total Limit reached','status':0,'incompleted_template':incompleted_template}
				return jsonify(data)	


	if int(delegate_id) > 0:
		delegate     = UserModel().get_delegate(delegate_id)
		if delegate:
			if delegate['delegate_no'] and delegate['delegate_no'] >0:
				delegate_id     = BOModel().insert_delegate(del_data)
				if image_data:
					AWSUpload().DelegateImageUpload(delegate_id,full_name,image_data,conf_key,image_data_ext)
				else :
					if int(is_remove_del_img) == 1: 
						AWSUpload().DeleteDelegateImage(delegate_id,conf_key)
				BOModel().save_delegates_addons(delegate_id,insert_del_addons,delete_del_addons,now)

				incompleted_template = TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
				data={ 'msg':'Add Successfully','status':1,'incompleted_template':incompleted_template}
				return jsonify(data)
		else:
			status = 0
			msg    = "your request cannot be processed. click here to try after some time"


		if status == 1:
			update        = BOModel().update_delegate(delegate_id,del_data,None,conf_id)
			if image_data:
				AWSUpload().DelegateImageUpload(delegate_id,full_name,image_data,conf_key,image_data_ext)
			else :
				if int(is_remove_del_img) == 1: 
					AWSUpload().DeleteDelegateImage(delegate_id,conf_key)
			BOModel().save_delegates_addons(delegate_id,insert_del_addons,delete_del_addons,now)
		json = { 
				'msg':'Update completed ...',
				'status':status,
				'incompleted_template' : TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key),
				 'reg_validation' :  reg_Validation
			}
		return jsonify(json)    
	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 :
				delegate_id     = BOModel().insert_delegate(del_data)
				if image_data:
					AWSUpload().DelegateImageUpload(delegate_id,full_name,image_data,conf_key,image_data_ext)
				else :
					if int(is_remove_del_img) == 1: 
						AWSUpload().DeleteDelegateImage(delegate_id,conf_key)
				BOModel().save_delegates_addons(delegate_id,insert_del_addons,delete_del_addons,now)

				incompleted_template = TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
				data={ 'msg':'Add Successfully','status':1,'incompleted_template':incompleted_template}
				return jsonify(data)
				
			else:
				# Already registered block .So is_mandatory is removed.
				delegate_id     = BOModel().insert_delegate(del_data)
				if image_data:
					AWSUpload().DelegateImageUpload(delegate_id,full_name,image_data,conf_key,image_data_ext)
				else :
					if int(is_remove_del_img) == 1: 
						AWSUpload().DeleteDelegateImage(delegate_id,conf_key)
				BOModel().save_delegates_addons(delegate_id,insert_del_addons,delete_del_addons,now)

				incompleted_template = TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
				data={ 'msg':'Add Successfully','status':1,'incompleted_template':incompleted_template}
				return jsonify(data)
		else:   
			if status == 1:
				delegate_id     = BOModel().insert_delegate(del_data)
				if image_data:
					AWSUpload().DelegateImageUpload(delegate_id,full_name,image_data,conf_key,image_data_ext)
				else :
					if int(is_remove_del_img) == 1: 
						AWSUpload().DeleteDelegateImage(delegate_id,conf_key)
				BOModel().save_delegates_addons(delegate_id,insert_del_addons,delete_del_addons,now)

				incompleted_template = TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
				data={ 'msg':'Add Successfully','status':1,'incompleted_template':incompleted_template}
				return jsonify(data)
			else:
				data= { 'msg':'','status':0,'data':'','reg_validation' :  reg_Validation}
				return jsonify(data)
					

'''-----------landing page  end-----------'''
@app.route('/<int:conf_id>/<conf_key>/<parent_user_id>/trade_offline_get_parent_incompleted_delegates', methods = ["GET", "POST"])
def TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key):
	conf          = Auth.getConf(conf_id,conf_key)
	unique_id     = None
	society_id    = conf['society_id']
	payment_types = BOModel().get_payment_types(conf_id)
	delegateData  = TradeModel().get_incompleted_delegates_by_parent_user_id(parent_user_id,unique_id,conf_id,reg_mode=1)
	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)
		del_html_data = render_template('trade/offline/incomplete_table.html' ,user_data = delegateData,user_id = parent_user_id,conf_id =conf_id,conf_key=conf_key,total_amount=total_amount,conf=conf,payment_types=payment_types)
	else:
		del_html_data = ""
	return del_html_data
	

@app.route('/<int:conf_id>/<conf_key>/<parent_user_id>/get_parent_incompleted_delegates_table', methods = ["GET", "POST"])
def get_parent_incompleted_delegates_table(parent_user_id,conf_id,conf_key):
	conf          = Auth.getConf(conf_id,conf_key)
	unique_id     = None
	society_id    = conf['society_id']
	payment_types = BOModel().get_payment_types(conf_id)
	delegateData  = BOModel().get_incompleted_delegates_by_parent_user_id(parent_user_id,unique_id,conf_id,reg_mode=1)
	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)
		del_html_data = render_template('trade/offline/incomplete_table_content.html' ,user_data = delegateData,user_id = parent_user_id,conf=conf,conf_id =conf_id,conf_key=conf_key,total_amount=total_amount,payment_types=payment_types)
	else:
		del_html_data = ""
	return del_html_data            


@app.route('/<int:conf_id>/<conf_key>/get_total', methods = ["GET","POST"])
def GetTotal(conf_id,conf_key):
	conf                 = Auth.getConf(conf_id,conf_key)
	delegate_ids         = request.form.getlist('delegate[]')
	parent_user_id       = request.values.get('parent_user_id')
	incompleted_template =  TradeOfflineget_parent_incompleted_delegates(parent_user_id,conf_id,conf_key)
	if len(delegate_ids)> 0 :
		if delegate_ids:
			delegate_ids    = str(delegate_ids)
			delegate_ids     = delegate_ids.replace("[" ,"").replace("]","").replace("'","")
			total_amount = BOModel().get_dele(delegate_ids)
			json={ 'status':1,'incompleted_template':incompleted_template,'total_amount':total_amount}
	else:   
		json={ 'status':1,'incompleted_template':incompleted_template,'total_amount':''}
	return jsonify(json)
	


@app.route('/<int:conf_id>/<conf_key>/get_addons_total', methods = ["GET","POST"])
def GetAddonsTotal(conf_id,conf_key):
	conf         = Auth.getConf(conf_id,conf_key)
	addon_ids    = request.form.getlist('addon_id[]')
	delegate_id  = request.form['delegate_id']
	if len(addon_ids)> 0 :
		addon_ids    = str(addon_ids)
		addon_ids     = addon_ids.replace("[" ,"").replace("]","").replace("'","")
		total_amount = BOModel().get_addons_total_amount(addon_ids,delegate_id)
		json={ 'status':1,'total_amount':total_amount}
	else:   
		json={ 'status':1,'total_amount':''}
	return jsonify(json)



#------------------offline registration end----------------------

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