Sindbad~EG File Manager

Current Path : /home/numerotech/membership.numerotech.com/CommonMembershipApp/core/controller/
Upload File :
Current File : //home/numerotech/membership.numerotech.com/CommonMembershipApp/core/controller/BOController.py

from fileinput import filename
from os import listdir
from os.path import join, dirname, realpath
from sqlalchemy import null
from werkzeug.utils import secure_filename
import os
from flask import Flask, request, Blueprint, jsonify, redirect, url_for,flash, render_template,session,json,Response
import datetime
from datetime import timedelta,date,datetime
from flask import session, app
from .. import Cryptography,Auth,RouteGroup,Helper
from core.model.Users import Users
from core.model.UserQualification import UserQualification
from core.model.States import States
from core.model.Society import Society
from core.model.Countries import Countries
from core.model.ExportFilterCols import ExportFilterCols
from core.model.Reference import Reference
from core.model.MMemberType import MMemberType
from core.model.MWorkType import MWorkType
from core.model.MStatus import MStatus
from core.model.MAttachmentType import MAttachmentType
from core.model.MPaymentType import MPaymentType
from core.model.MembershipMailTemplates import MembershipMailTemplates
from core.model.UserAttachments import UserAttachments
from core.model.UserPayment import UserPayment
from core.model.UserPublication import Userpublication
from core.model.UserWork import UserWork
from core.model.UserStatusLogs import UserStatusLogs
from core.library.email import EMAIL
import boto3, botocore
from botocore.exceptions import ClientError
import logging
import requests
from urllib.parse import unquote
import math
import urllib
import io,ast
import csv
from io import StringIO
import string

app = Blueprint('backoffice', __name__)

@app.route('/', methods = ["GET"])
def BoHome():
	app_host = request.host
	society      = Society().setSociety(app_host)
	if society:
		return redirect (url_for('backoffice.getLogin',society_id=society['society_id'],society_key=society['society_key']))
	else:
		session.pop('_flashes', None)
		flash("Invalid URL","errorMsg")
		return render_template('back_office/display_msg.html')  

@app.route('/<society_id>/<society_key>',methods = ["GET", "POST"])
def Backoffice(society_id,society_key):
	Auth.checkSocietybyIdKey(society_id,society_key)
	if Auth.bocheck(society_id):
		return redirect (url_for('backoffice.ApprovalPage',society_id=society_id,society_key=society_key))
	else:
		return redirect (url_for('backoffice.getLogin',society_id=society_id,society_key=society_key))

@app.route('/login/<society_id>/<society_key>',methods = ["GET"])
@RouteGroup.society_required
def getLogin(society_id,society_key):
	if Auth.bocheck(society_id):
		return redirect (url_for('backoffice.ApprovalPage',society_id=society_id,society_key=society_key))
	else:
		return render_template('back_office/bo_login.html',society_id=society_id,society_key=society_key)

@app.route('/login/<society_id>/<society_key>', methods = ["POST"])
def postLogin(society_id,society_key):
	if request.method == "POST":
		email       = request.form['email']
		password    = request.form['password']
		is_admin_access     = Users().check_bo_access(email,1,society_id,None)
		is_admin    = is_admin_access['is_admin']
		output      = Users().check_email_password(email,password,is_admin,society_id)
		if  output and int(is_admin) == 1 :
			output = dict(output, **is_admin_access)
			Auth.bologin(output,society_id)
			if int(society_id) == 12:
				return redirect (url_for('backoffice.MembersPage',society_id=society_id,society_key=society_key))
			else:
				return redirect (url_for('backoffice.ApprovalPage',society_id=society_id,society_key=society_key))
		else:
			flash("Please enter correct Email id and password","errorMsg")
		
		return render_template('back_office/bo_login.html',society_id=society_id,society_key=society_key)
	else:
		flash("Please, Try again.","errorMsg")
		return redirect (url_for('backoffice.getLogin',society_id=society_id,society_key=society_key))

@app.route('/logout/<society_id>/<society_key>', methods = ["GET", "POST"])
def Logout(society_id,society_key):
	Auth.logout(society_id)
	return redirect(url_for('backoffice.getLogin',society_id=society_id,society_key=society_key))

@app.route('/approval_page/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ApprovalPage(society_id,society_key):
	societyData          = Auth.getSociety(society_id)
	page                 = int(request.values.get('page',1)) #default page 1   
	limit                = int(request.values.get('limit', 50)) #default page size 10     
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	search_member_type   = None
	from_memno           = None
	end_memno            = None
	approved_from        = None
	approved_to          = None
	order_type           = request.values.get('order_type',"desc") or None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None
	filter_visible       = request.values.get('filter_visible',None)
	search_data          = {'name' : search_name,'email' : search_email,'mobile' : search_mobile}
	offset               =  int((page-1)*limit)

	if societyData['member_approve_type'] == "before payment":
		# status_id     = 11,13,16
		status_id       = str(societyData['ms_waiting_approval_status_id'])+","+str(societyData['ms_reupdated_status_id'])+","+str(societyData['ms_waiting_approval_withoutpay_status_id'])
	else:
		status_id       = str(societyData['ms_waiting_approval_status_id'])+","+str(societyData['ms_reupdated_status_id'])
	user_id         = None  
	btn_page        = request.values.get('form_submit',None) # search or filter button

	if btn_page =="Search" :
		page    = 1
		limit   = 50
		offset  =  int((page-1)*limit)
		filter_visible = 1
	elif btn_page == "Search Everywhere":
		page   = 1
		limit  = 50
		status_id = None
		filter_visible = 1

	data  =  Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type) # searching members
	if int(society_id) == 18:
		status_id           = societyData['ms_approved_status_id']
		member_type_id      = Helper.AssociateMemberId
		attach_type_id      = Helper.FellowshipAttachId1.get(society_key,None)
		conv_life_data      = Users().usp_mem_converting_assmem_lifemem(society_id,member_type_id,attach_type_id,status_id,offset,limit)
		print(conv_life_data)
	else:
		conv_life_data = None

	for index,value in enumerate(data) :
		if index == 0:
			if btn_page == "Search" and len(value) == 0 :
				flash("User not found","errorMsg")
				return redirect(url_for('backoffice.ApprovalPage',society_id=society_id,society_key=society_key))
			elif len(value) ==0:
				flash("There is no members for waiting membership approval ","errorMsg")
				return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
			else:
				data = value
		if index == 1 :
			total_count = value[0]
			total = total_count['count(user_id)']
					
	return render_template('back_office/bo_waiting_approval.html',user_profile=data,offset=offset,page=page,total=int(total),limit=limit,search_data=search_data,filter_visible=filter_visible,society_id=society_id,society_key=society_key,btn_page=btn_page)

@app.route('/approved_awaiting_payment/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ApprovedAwaitingPayment(society_id,society_key):
	societyData          = Auth.getSociety(society_id)
	page                 = int(request.values.get('page',1)) #default page 1   
	limit                = int(request.values.get('limit', 50)) #default page size 10    
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	search_member_type   = request.values.get('search_member_type',None) or None
	filter_visible       = request.values.get('filter_visible',None)
	search_data          = { 'name' : search_name,'email' : search_email,'mobile' : search_mobile,'member_type' : search_member_type}
	offset               = int((page-1)*limit)
	status_id            = societyData['ms_approved_awaitingpayment_status_id']
	user_id              = None
	from_memno           = None
	end_memno            = None
	approved_from        = None
	approved_to          = None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None
	order_type           = request.values.get('order_type',"desc") or None
	btn_page             = request.values.get('form_submit',None)
	
	if btn_page == "Search" :
		page     = 1
		limit    = 50
		offset   =  int((page-1)*limit)
		filter_visible = 1
	elif btn_page == "Search Everywhere":
		page   = 1
		limit  = 50
		status_id = None
		filter_visible = 1

	data            = Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type)
	for index,value in enumerate(data) :
		if index == 0:
			if btn_page == "Search" and len(value) == 0 :
				flash("User not found","errorMsg")
				return redirect(url_for('backoffice.ApprovedAwaitingPayment',society_id=society_id,society_key=society_key))
			elif len(value) ==0:
				flash("No Data","errorMsg")
				return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
			else:
				data = value
		if index == 1 :
			total_count = value[0]
			total = total_count['count(user_id)']

	member_types = MMemberType().get_member_type_approved(society_id)
	return render_template('back_office/bo_approved_awaiting_payment.html',user_profile=data,offset=offset,page=page,total=int(total),limit=limit,search_data=search_data,filter_visible=filter_visible,society_id=society_id,society_key=society_key,btn_page=btn_page,societyData=societyData,member_types=member_types)

@app.route('/members_page/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MembersPage(society_id,society_key):
	# application approvel status type
	societyData          = Auth.getSociety(society_id)
	status_id            = societyData['ms_approved_status_id']
	btn_page             = request.values.get('form_submit',None)
	user_id              = None
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	search_member_type   = request.values.get('search_member_type',None) or None
	filter_visible       = request.values.get('filter_visible',None)
	from_memnos          = request.values.get('from_memno',None) or None
	end_memnos           = request.values.get('end_memno',None) or None
	approved_from        = request.values.get('approved_from',None) or None
	approved_to          = request.values.get('approved_to',None) or None
	order_type           = request.values.get('order_type',"desc") or None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None

	if from_memnos:
		from_memno = ''.join([i for i in from_memnos if  i.isdigit()])
	else:
		from_memno = None

	if end_memnos:
		end_memno = ''.join([i for i in end_memnos if  i.isdigit()])
	else:
		end_memno = None

	#passing to tempalte for set filter form values
	search_data          = {
		'name'           : search_name,
		'email'          : search_email,
		'mobile'         : search_mobile,
		'member_type'    : search_member_type,
		'from_memno'     : from_memnos,
		'end_memno'      : end_memnos,
		'approved_from'  : approved_from,
		'approved_to'    : approved_to,
		'order_type'     : order_type,
		'sort_by'        : sort_by
	}
	is_export = False

	if btn_page == "Export Members Records":
		is_export            = True
		page                 = 1
		limit                = 5000000
		search_name          =  None
		search_email         =  None
		search_mobile        =  None
		search_member_type   =  None
		search_membership_no =  None
	elif btn_page == "Export Filter Records":
		is_export    = True
		page         = 1
		limit        = 5000000
	elif btn_page =="Search" :
		page   = 1
		limit  = 50
		filter_visible = 1
	elif btn_page == "Search Everywhere":
		page   = 1
		limit  = 50
		status_id = None
		filter_visible = 1
	else:
		page         = int(request.values.get('page',1)) #default page 1
		limit        = int(request.values.get('limit', 50)) 

	offset  = int((page-1)*limit)  
	data    = Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type)    
	for index,value in enumerate(data) :
		if index == 0:
			if btn_page == "Search" and len(value) == 0 :
				flash("User not found","errorMsg")
				return redirect(url_for('backoffice.MembersPage',society_id=society_id,society_key=society_key))
			elif len(value) == 0:
				flash("There is no members for  membership approved list","errorMsg")
				return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
			else:
				data = value
		if index == 1 :
			total_count = value[0]
			total       = total_count['count(user_id)']
	if is_export == True:
		now    = datetime.now()
		date   = now.strftime("%Y-%m-%d %H:%M")
		output = io.StringIO()
		writer = csv.writer(output)
		line   = ['S.No', 'Membership No','Membership Type', 'Name', 'Email','Mobile' ,'Address', 'City','State','Ratified Year']
		writer.writerow(line)
		sno_val = 0
		for row in data:
			sno_val = sno_val +1
			line = [sno_val ,row['membership_no'],row['member_type'] , row['full_name'], row['email'],row['mobile'],row['address'],row['city'],row['state_name'], row['ratified_year']]
			writer.writerow(line)
		output.seek(0)
		return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+societyData['society_intial']+"_Member_Approved_Record_"+str(date)+".csv"})
	member_types = MMemberType().get_member_type_approved(society_id)   
	return render_template('back_office/bo_members_page.html',user_profile=data,offset=offset,societyData=societyData,page=page,total=int(total),limit=limit,search_data=search_data,filter_visible=filter_visible,society_id=society_id,society_key=society_key,btn_page=btn_page,member_types=member_types)

@app.route('/incomplete_form/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def IncompleteForm(society_id,society_key):
	societyData     = Auth.getSociety(society_id)
	page            = int(request.values.get('page',1)) #default page 1   
	limit           = int(request.values.get('limit', 50)) #default page size 10    
	search_name     = request.values.get('search_name',None) or None
	search_email    = request.values.get('search_email',None) or None
	search_mobile   = request.values.get('search_mobile',None) or None
	filter_visible  =  request.values.get('filter_visible',None)
	search_data     = {'name' : search_name,'email'  : search_email,'mobile' : search_mobile}
	offset          = int((page-1)*limit)
	status_id       = 10
	user_id         = None
	btn_page        = request.values.get('form_submit',None)
	is_export       = False

	if btn_page =="Search" :
		page  = 1
		limit = 50
		offset   =  int((page-1)*limit)
		filter_visible = 1
	elif btn_page == "Search Everywhere":
		page   = 1
		limit  = 50
		offset =  int((page-1)*limit)
		status_id = None
		filter_visible = 1

	data = Users().usp_get_incomplete_member(search_name,search_email,search_mobile,status_id,offset,limit,user_id,society_id)
	for index,value in enumerate(data) :
		if index == 0:
			if btn_page=="Search" and len(value) == 0 :
				flash("User not found","errorMsg")
				return redirect(url_for('backoffice.IncompleteForm',society_id=society_id,society_key=society_key))
			elif len(value) ==0:
				flash("No data","errorMsg")
				return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
			else:
				data = value
		if index == 1 :
			total_count = value[0]
			total = total_count['count(user_id)']

	if is_export == True:
		now    = datetime.now()
		date   = now.strftime("%Y-%m-%d %H:%M")
		output = io.StringIO()
		writer = csv.writer(output)
		line   = ['S.No','Membership Type', 'Name', 'Email','Mobile' ,'Address', 'City','State']
		writer.writerow(line)
		sno_val = 0
		for row in data:
			sno_val = sno_val +1
			line = [sno_val ,row['member_type'],row['full_name'], row['email'],row['mobile'],row['address'],row['city'],row['state_name']]
			writer.writerow(line)
		output.seek(0)
		return Response(output, mimetype="text/csv", headers={"Content-Disposition":"attachment;filename="+societyData['society_intial']+"Non_Member_Record_"+str(date)+".csv"})    
						
	return render_template('back_office/bo_incomplete_page.html',user_profile=data,offset=offset,page=page,total=int(total),limit=limit,search_data=search_data,filter_visible=filter_visible,society_id=society_id,society_key=society_key,btn_page=btn_page,societyData=societyData)

@app.route('/waiting_proposer_seconder/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def WaitingProposerSeconder(society_id,society_key):
	societyData          = Auth.getSociety(society_id)
	page                 = int(request.values.get('page',1)) #default page 1   
	limit                = int(request.values.get('limit', 50)) #default page size 10    
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	search_member_type   = request.values.get('search_member_type',None) or None
	filter_visible       = request.values.get('filter_visible',None)
	sort_by              = request.values.get('sort_by',"membership_no_only") or None
	order_type           = request.values.get('order_type',"desc") or None
	search_data          = {'name'  : search_name,'email' : search_email,'mobile'   : search_mobile,'member_type'   : search_member_type }
	offset               = int((page-1)*limit)
	status_id            = societyData['ms_submitted_status_id']

	if status_id is None:
		flash("Waiting for Proposer and Seconder this page not configuration in this society.Please contact to support team.","errorMsg")
		return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
	user_id         = None
	from_memno      = None
	end_memno       = None
	approved_from   = None
	approved_to     = None
	# data          = Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,search_membership_no,society_id)
	btn_page        = request.values.get('form_submit',None)

	if btn_page == "Search" :
		page     = 1
		limit    = 50
		offset   =  int((page-1)*limit)
		filter_visible = 1
	elif btn_page == "Search Everywhere":
		page   = 1
		limit  = 50
		status_id = None
		filter_visible = 1

	data = Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type)
	for index,value in enumerate(data) :
		if index == 0:
			if btn_page == "Search" and len(value) == 0 :
				flash("User not found","errorMsg")
				return redirect(url_for('backoffice.WaitingProposerSeconder',society_id=society_id,society_key=society_key))
			elif len(value) ==0:
				flash("No Data","errorMsg")
				return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
			else:
				data = value
		if index == 1 :
			total_count = value[0]
			total = total_count['count(user_id)']

	return render_template('back_office/bo_waiting_proposer_seconder.html',user_profile=data,offset=offset,page=page,total=int(total),limit=limit,search_data=search_data,filter_visible=filter_visible,society_id=society_id,society_key=society_key,btn_page=btn_page)

@app.route('/rejected_page/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def RejectedPage(society_id,society_key):
	societyData          = Auth.getSociety(society_id)
	page                 = int(request.values.get('page',1)) #default page 1   
	limit                = int(request.values.get('limit', 50)) #default page size 10     
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	filter_visible       = request.values.get('filter_visible',None)
	search_member_type   = None
	from_memno           = None
	end_memno            = None
	approved_from        = None
	approved_to          = None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None
	order_type           = request.values.get('order_type',"desc") or None
	search_data          = {'name' : search_name,'email' : search_email,'mobile' : search_mobile }
	offset               = int((page-1)*limit)
	status_id            = societyData['ms_rejected_status_id']
	user_id              = None
	data                 = Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type) # searching members   
	btn_page             = request.values.get('form_submit',None) # search or filter button
	
	if btn_page == "Search" :
		page  = 1
		limit = 50
		offset   =  int((page-1)*limit)
		filter_visible = 1

	for index,value in enumerate(data) :
		if index == 0:
			if btn_page=="Search" and len(value) == 0 :
				flash("User not found","errorMsg")
				return redirect(url_for('backoffice.RejectedPage',society_id=society_id,society_key=society_key))
			elif len(value) ==0:
				flash("No data","errorMsg")
				return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
			else:
				data = value
		if index == 1 :
			total_count = value[0]
			total = total_count['count(user_id)']   
		if index == 8 :
			reject_remarks = value[0]

	return render_template('back_office/bo_rejected_page.html',user_profile=data,offset=offset,page=page,total=int(total),limit=limit,search_data=search_data,filter_visible=filter_visible,reject_remarks=reject_remarks,society_id=society_id,society_key=society_key)

@app.route('/view_for_approval/<user_id>/<society_id>/<society_key>', methods = ["GET"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ViewForApproval(user_id,society_id,society_key):
	user_id          = unquote(user_id)
	user_id          = int(Cryptography.decrypt(user_id))
	users            = Users().get_member(user_id)
	encrypt_user_id  = Cryptography.encrypt(int(user_id))
	return View(encrypt_user_id,users.status_id,society_id,society_key,1)

@app.route('/view_existing_member/<user_id>/<society_id>/<society_key>', methods = ["GET"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ViewExistingMember(user_id,society_id,society_key):
	user_id          = unquote(user_id)
	user_id          = int(Cryptography.decrypt(user_id))
	users            = Users().get_member(user_id)
	encrypt_user_id  = Cryptography.encrypt(int(user_id))
	return View(encrypt_user_id,users.status_id,society_id,society_key,0)

@app.route('/view/<user_id>/<int:status_id>/<society_id>/<society_key>/<int:is_approval>', methods = ["GET"])
@app.route('/view/<user_id>/<int:status_id>/<society_id>/<society_key>', methods = ["GET"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def View(user_id,status_id,society_id,society_key,is_approval = 0):
	user_id     = unquote(user_id)
	try:
		user_id     = int(Cryptography.decrypt(user_id))
	except:
		flash("Invalid URL","errorMsg")
		return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
	societyData          = Auth.getSociety(society_id)
	page                 = int(request.values.get('page',1)) #default page 1   
	limit                = int(request.values.get('limit', 10)) #default page size 10    
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None
	order_type           = request.values.get('order_type',"desc") or None
	offset               = int((page-1)*limit)
	search_member_type   = None
	from_memno           = None
	end_memno            = None
	approved_from        = None
	approved_to          = None
	
	data                 = Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type)
	for index,value in enumerate(data):
		if index == 0:
			userData = value[0]
		if index == 2:
			user_profile = value[0] 
		if index == 3:
			user_qualification = value
		if index == 4:
			user_work = value
		if index == 5:
			user_attachments = value
		if index == 6:
			prosec = value
		if index == 9:
			user_other_society = value
		if index == 10:
			user_training = value
		if index == 11:
			user_additional = value
	
	member_type         = MMemberType().get_member_type_approved(society_id)
	if  int(society_id)==1 or int(society_id) == 9:
		attach_type_id      = Helper.FellowshipAttachId1.get(society_key,None)
		attach_images       = MAttachmentType().get_fellowship_attach_id(attach_type_id,user_id,society_id)
	else:
		attach_images=None  
	payment_method      = user_profile['payment_method']
	if payment_method is None:
		pay_method = None
	else: 
		pay_method = urllib.parse.unquote(payment_method)
	encrypt_user_id = Cryptography.encrypt(int(user_id))
	return render_template('back_office/bo_view.html',user_id=user_id,encrypt_user_id=encrypt_user_id,member=userData,datas=user_qualification,data=user_work,user=user_profile,image=user_attachments,prosec_data=prosec,member_type=member_type,is_approval=is_approval,pay_method=pay_method,society_id=society_id,society_key=society_key,societyData=societyData,user_other_society=user_other_society,user_training=user_training,attach_images=attach_images,user_additional=user_additional)

# after approval the view the mail  sent to member in bo- manually
@app.route('/membership_approved_mail_view/<user_id>/<society_id>/<society_key>',methods=["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MembershipApprovedMailView(user_id,society_id,society_key):
	user_id         = unquote(user_id)
	user_id         = int(Cryptography.decrypt(user_id))    
	user            = Users().usp_approved_mail_data(user_id,society_id)
	user_profile    = user[0]
	# subject_1       = user_profile['prefix']+user_profile['full_name'] if user_profile['prefix'] else user_profile['full_name']
	template_name   = "approved_mail"
	mailData        = MembershipMailTemplates().get_mail_template(society_id,template_name)
	societyData     = Auth.getSociety(society_id)
	society         = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail']
	}
	s_data = {
		'mail_content' : mailData.subject,
		'userData'     : user_profile,
		'society'      : society
	}
	m_data = {
		'mail_content' : mailData.mail_content,
		'userData'     : user_profile,
		'society'      : society
	}
	subject         = Helper.convert_html_for_mail_screen(s_data)
	mail_content    = Helper.convert_html_for_mail_screen(m_data)
	encrypt_user_id = Cryptography.encrypt(int(user_id))
	return render_template('back_office/membership_approved_mail_view.html',encrypt_user_id=encrypt_user_id,users=user_profile,mail_content=mail_content,subject=subject,society_id=society_id,society_key=society_key,societyData=societyData)

# in members page - membership approved mail-manually
@app.route('/membership_approved_mail/<user_id>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MembershipApprovedMail(user_id,society_id,society_key):
	user_id        = unquote(user_id)
	user_id        = int(Cryptography.decrypt(user_id))
	societyData    = Auth.getSociety(society_id)    
	user           = Users().usp_approved_mail_data(user_id,society_id)
	user_profile   = user[0]
	# full_name      = user_profile['prefix']+user_profile['full_name'] if user_profile['prefix'] else user_profile['full_name']
	template_name  = "approved_mail"
	mailData       = MembershipMailTemplates().get_mail_template(society_id,template_name)
	society        = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail']
	}
	s_data = {
		'mail_content': mailData.subject,
		'userData'    : user_profile,
		'society'     : society
	}
	subject          = Helper.convert_html_for_mail_screen(s_data)
	if request.method == "POST" :
		email   = request.form['sample_email']
		subject = "SAMPLE : " + subject 
		flash("Successfully sent sample mail","successMsg")
	else:   
		email   = user_profile['email']
		flash("Successfully sent mail to Applicant","successMsg")
	m_data = {
		'mail_content': mailData.mail_content,
		'userData'    : user_profile,
		'society'     : society
	}
	mail_content     = Helper.convert_html_for_mail_screen(m_data)
	html  = render_template('back_office/email/bo_mail_template.html',mail_content=mail_content,societyData=societyData)
	EMAIL.sendMail(subject,html,email,mailData,societyData)
	encrypt_user_id = Cryptography.encrypt(int(user_id))
	return redirect(url_for('backoffice.MembershipApprovedMailView',user_id=encrypt_user_id,society_id=society_id,society_key=society_key))

# in view page secretariat to approve or rejected membership 
@app.route('/approved_rejected_membership/<user_id>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ApprovedRejectedMembership(user_id,society_id,society_key):
	user_id     = unquote(user_id)
	user_id     = int(Cryptography.decrypt(user_id))
	societyData = Auth.getSociety(society_id)
	if request.method == "POST":
		status              = request.values["approved_rejected"]
		if status == "Approve":
			status_db = "Approved, Awaiting for payment"
		
		elif status == "Approve & generate membership number":
			status_db = "Approved. Membership number generated"
			
		else:
			status_db = status
		status_id_1         = MStatus().get_status_id_from_display_name(status_db,society_id)
		status_id           = status_id_1['status_id']
		member_type_id      = request.values.get('member_type')
		next_reminder_date  = None
		if status_id == societyData['ms_rejected_status_id'] : # 14 is approved
			member_type_id = 2
			approved_member_type_id = None
			next_reminder_date = datetime.now() + timedelta(days=3)
		elif status_id == societyData['ms_approved_awaitingpayment_status_id'] :
			approved_member_type_id = member_type_id
			member_type_id          = 2
			
			
		else:
			approved_member_type_id = None
			if status == "Approve & generate membership number":
				Users().usp_generate_membership_number(user_id,member_type_id,society_id)

		boadmindata = Auth.bouser(society_id)
		if boadmindata:
			approved_user_id = boadmindata['user_id']
		else:
			return redirect (url_for('backoffice.getLogin',society_id=society_id,society_key=society_key))

		data      = {'approved_user_id':approved_user_id,'approved_member_type_id':approved_member_type_id,'member_type_id':member_type_id,'status_id':status_id,'updated_at': datetime.now(),'secretary_approved_on':datetime.now()}
		Users().update_member(user_id,data)
		remarks   = request.form['remarks']
		userData    = Users().get_member(user_id)
		member_type_id = userData.member_type_id
		datas     = {'user_id':user_id,'society_id':society_id,'status_id':status_id,'status':status,'member_type_id':member_type_id,'remarks':remarks,'created_at':datetime.now(),'next_reminder_date':next_reminder_date}
		UserStatusLogs().insert_status_remarks(datas)
		encrypt_user_id  = Cryptography.encrypt(int(user_id))
		return redirect(url_for('backoffice.MembershipApprovedRejectedMailView',user_id=encrypt_user_id,society_id=society_id,society_key=society_key))
	else:
		flash("Please, Try again.","errorMsg")
		return redirect (url_for('backoffice.getLogin',society_id=society_id,society_key=society_key))

@app.route('/membership_approved_rejected_mail_view/<user_id>/<society_id>/<society_key>',methods=["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MembershipApprovedRejectedMailView(user_id,society_id,society_key):
	user_id        = unquote(user_id)
	user_id        = int(Cryptography.decrypt(user_id)) 
	societyData    = Auth.getSociety(society_id)
	user           = Users().usp_approved_mail_data(user_id,society_id)
	user_profile   = user[0]
	msg            = user_profile['display_name']
	if msg == "Rejected":
		template_name = "rejected_mail"
		flash(msg,"errorMsg")
	else:
		if user_profile['status_id'] == societyData['ms_approved_status_id']:
			template_name = "approved_mail"
			flash(msg,"successMsg")
		else :
			template_name    = "approved_rejected_mail"
			flash("Application approved","successMsg")
	encrypt_user_id  = Cryptography.encrypt(int(user_id))
	mailData         = MembershipMailTemplates().get_mail_template(society_id,template_name)

	society         = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail'],
		'staticsitelink'      : societyData['static_site_url'],
		'navigate_link'       : societyData['navigate_link'],
		'navigate_link_name'  : societyData['navigate_link_name'],
		'rejected_status_id'  : societyData['ms_rejected_status_id'],
		'approved_status_id'  : societyData['ms_approved_status_id'],
		'base_url'            : Helper.base_url()
	}
	s_data ={
		'mail_content'  : mailData.subject,
		'userData'      : user_profile,
		'society'       : society
	}
	m_data ={
		'mail_content': mailData.mail_content,
		'userData'    : user_profile,
		'society'     : society
	}
	subject         = Helper.convert_html_for_mail_screen(s_data)
	mail_content    = Helper.convert_html_for_mail_screen(m_data)
	return render_template('back_office/membership_approved_rejected_mail_view.html',encrypt_user_id=encrypt_user_id,user=user_profile,society_id=society_id,society_key=society_key,mail_content=mail_content,subject=subject,societyData=societyData)

@app.route('/membership_approved_rejected_mail/<user_id>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MembershipApprovedRejectedMail(user_id,society_id,society_key):
	user_id         = unquote(user_id)
	user_id         = int(Cryptography.decrypt(user_id))    
	societyData     = Auth.getSociety(society_id)
	user            = Users().usp_approved_mail_data(user_id,society_id)
	user_profile    = user[0]
	full_name       = user_profile['prefix']+user_profile['full_name'] if user_profile['prefix'] else user_profile['full_name']
	if user_profile['status_id'] == societyData['ms_rejected_status_id']:
		template_name = "rejected_mail"
	elif user_profile['status_id'] == societyData['ms_approved_status_id']:
		template_name = "approved_mail"
	else:
		template_name = "approved_rejected_mail"
	society         = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail'],
		'staticsitelink'      : societyData['static_site_url'],
		'navigate_link'       : societyData['navigate_link'],
		'navigate_link_name'  : societyData['navigate_link_name'],
		'rejected_status_id'  : societyData['ms_rejected_status_id'],
		'approved_status_id'  : societyData['ms_approved_status_id'],
		'base_url'            : Helper.base_url()
	}
	mailData        = MembershipMailTemplates().get_mail_template(society_id,template_name)
	s_data ={
		'mail_content'  : mailData.subject,
		'userData'      : user_profile,
		'society'       : society
	}
	m_data ={
		'mail_content'  : mailData.mail_content,
		'userData'      : user_profile,
		'society'       : society
	}
	subject         = Helper.convert_html_for_mail_screen(s_data)
	mail_content    = Helper.convert_html_for_mail_screen(m_data)
	email           = user_profile['email']
	encrypt_user_id = Cryptography.encrypt(int(user_id))
	html            = render_template('back_office/email/bo_mail_template.html',mail_content=mail_content,societyData=societyData)
	EMAIL.sendMail(subject,html,email,mailData,societyData)
	flash("Sent mail to Applicant","successMsg")
	return redirect(url_for('backoffice.MembershipApprovedRejectedMailView',user_id=encrypt_user_id,society_id=society_id,society_key=society_key))

# sent payment mail in awaiting approved page manually
@app.route('/membership_approved_payment_mail_view/<user_id>/<society_id>/<society_key>',methods=["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MembershipApprovedPaymentMailView(user_id,society_id,society_key):
	user_id          = unquote(user_id)
	user_id          = int(Cryptography.decrypt(user_id))   
	societyData      = Auth.getSociety(society_id)
	if societyData['paymentgateway_appmaster_id'] is not None:
		user             = Users().usp_approved_mail_data(user_id,society_id)
		user_profile     = user[0]
		full_name        = user_profile['prefix']+user_profile['full_name'] if user_profile['prefix'] else user_profile['full_name']
		template_name    = "payment_mail"   
		mailData         = MembershipMailTemplates().get_mail_template(society_id,template_name)
		if mailData is None:
			return "No mail data content"
		else:
			sub_data         = {'full_name' : full_name,'society_name' : societyData['society_intial']}
			society          = {
				'society_id'          : society_id,
				'society_key'         : society_key,
				'society_name'        : societyData['society_intial'],
				'support_mail'        : societyData['e_support_mail'],
				'base_url'            : Helper.base_url()
			}
			m_data ={
				'mail_content'  : mailData.mail_content,
				'userData'      : user_profile,
				'society'       : society
			}
			subject          = Helper.merge_tags(mailData.subject,sub_data)
			mail_content     = Helper.convert_html_for_mail_screen(m_data)
			encrypt_user_id  = Cryptography.encrypt(int(user_id))
			return render_template('back_office/membership_approved_payment_mail_view.html',encrypt_user_id=encrypt_user_id,mail_content=mail_content,subject=subject,society_id=society_id,society_key=society_key,societyData=societyData)
	else:
		return "No Online Payment"

@app.route('/membership_payment_mail/<user_id>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MembershipPaymentMail(user_id,society_id,society_key):
	user_id        = unquote(user_id)
	user_id        = int(Cryptography.decrypt(user_id)) 
	societyData    = Auth.getSociety(society_id)
	user           = Users().usp_approved_mail_data(user_id,society_id)
	user_profile   = user[0]
	full_name      = user_profile['prefix']+user_profile['full_name'] if user_profile['prefix'] else user_profile['full_name']
	template_name  = "payment_mail" 
	mailData       = MembershipMailTemplates().get_mail_template(society_id,template_name)
	sub_data       = {'full_name'  : full_name,'society_name' : societyData['society_intial']}
	society        = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail'],
		'base_url'            : Helper.base_url()
	}
	subject = Helper.merge_tags(mailData.subject,sub_data)
	if request.method =="POST":
		email   = request.form['sample_email']
		subject = "SAMPLE : " + subject 
		flash("Successfully sent sample mail","successMsg")
	else:   
		email   = user_profile['email']
		flash("Successfully sent mail to Applicant","successMsg")
	m_data ={
		'mail_content'  : mailData.mail_content,
		'userData'      : user_profile,
		'society'       : society
	}
	mail_content     = Helper.convert_html_for_mail_screen(m_data)
	html             = render_template('back_office/email/bo_mail_template.html',mail_content=mail_content,societyData=societyData)
	EMAIL.sendMail(subject,html,email,mailData,societyData)
	encrypt_user_id  = Cryptography.encrypt(int(user_id))
	return redirect(url_for('backoffice.MembershipApprovedPaymentMailView',user_id=encrypt_user_id,society_id=society_id,society_key=society_key))

@app.route('/reminder_proposer_seconder_mail_view/<user_uuid>/<reference_user_uuid>/<society_id>/<society_key>',methods=["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ReminderProposerSeconderMailView(user_uuid,reference_user_uuid,society_id,society_key):
	societyData     = Auth.getSociety(society_id)
	user_reference  = Reference().usp_get_reference_v1(user_uuid,reference_user_uuid)
	userData        = user_reference[0]
	full_name       = userData['user_prefix']+userData['user_name'] if userData['user_prefix'] else userData['user_name']   
	encrypt_user_id = Cryptography.encrypt(int(userData['user_id']))
	template_name   = "bo_prosec_mail"  
	society   = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail'],
		'society_full_form'   : societyData['society_title'],
		'backup_mail'         : societyData['e_backup_mails'],
		'base_url'            : Helper.base_url()
	}
	mailData  = MembershipMailTemplates().get_mail_template(society_id,template_name)
	sub_data  = {'full_name'  : full_name,'society_name' : societyData['society_intial']}
	m_data = {
		'mail_content'  : mailData.mail_content,
		'userData'      : userData,
		'society'       : society
	}
	subject       = Helper.merge_tags(mailData.subject,sub_data)
	mail_content  = Helper.convert_html_for_mail_screen(m_data)
	return render_template('back_office/bo_reminder_proposer_seconder_mail_view.html',user=userData,encrypt_user_id=encrypt_user_id,society=society,societyData=societyData,reference_user_uuid=reference_user_uuid,mail_content=mail_content,subject=subject,society_id=society_id,society_key=society_key)

@app.route('/reminder_proposer_seconder_mail/<user_uuid>/<reference_user_uuid>/<society_id>/<society_key>',methods=["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ReminderProposerSeconderMail(user_uuid,reference_user_uuid,society_id,society_key):
	societyData     = Auth.getSociety(society_id)
	user_reference  = Reference().usp_get_reference_v1(user_uuid,reference_user_uuid)
	user_profile    = user_reference[0]
	full_name       = user_profile['user_prefix']+user_profile['user_name'] if user_profile['user_prefix'] else user_profile['user_name']   
	template_name   = "bo_prosec_mail"  
	mailData        = MembershipMailTemplates().get_mail_template(society_id,template_name)
	sub_data        = {'full_name'    : full_name,'society_name' : societyData['society_intial']}
	society         = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail'],
		'society_full_form'   : societyData['society_title'],
		'base_url'            : Helper.base_url()
	}
	subject = Helper.merge_tags(mailData.subject,sub_data)
	if request.method == "POST":
		email   = request.form['sample_email']
		subject = "SAMPLE : " + subject 
		flash("Successfully sent sample mail","successMsg")
	else:   
		email   = user_profile['refer_email']
		flash("Successfully sent mail","successMsg")
	m_data ={
		'mail_content': mailData.mail_content,
		'userData'    : user_profile,
		'society'     : society
	}
	mail_content     = Helper.convert_html_for_mail_screen(m_data)
	html             = render_template('back_office/email/bo_mail_template.html',mail_content=mail_content,societyData=societyData)
	EMAIL.sendMail(subject,html,email,mailData,societyData)
	return redirect(url_for('backoffice.ReminderProposerSeconderMailView',user_uuid=user_profile['user_uuid'],reference_user_uuid=user_profile['refer_uuid'],society_id=society_id,society_key=society_key))

@app.route('post_payment_check/<society_id>/<society_key>/<unique_id>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def PostPaymentCheck(society_id,society_key,unique_id):
	user_payment  = UserPayment().get_payment_unique(society_id,unique_id)
#   print(user_payment)
	from_date = user_payment['created_at']
	to_date   = user_payment['created_at']
	api_payment_id  =       Society().society_application(society_id)
	am_id  =       api_payment_id['paymentgateway_appmaster_id']
	params_1 = "order_no="+unique_id+""
	if  int(society_id) in [18]:
		if society_id and int(society_id) == 18:
			url = "https://ksos.in/paymentapi_mem/status_api_new_ksos_mem_2.php?"+params_1+""
		response_1   = requests.get(url)    
		response_1   = response_1.text
		if response_1 :
			response_data = ast.literal_eval(response_1)
			response_data = response_data["Order_Status_Result"]
			api_data_status = response_data["status"]
			if int(api_data_status) == 0 :
				pg_fullname   = response_data["order_bill_name"] 
				pg_unique_id  = response_data["order_no"]
				pg_email      = response_data["order_bill_email"]
				pg_mobile     = response_data["order_bill_tel"]
				pg_amount     = response_data["order_amt"]
				pg_status     = response_data["order_status"]
				pg_payment_id = response_data["reference_no"]
				pg_created_at = response_data["order_status_date_time"]
				pg_mode       = response_data["order_card_name"]
				data = {
					'fullname'        : pg_fullname,
					'unique_id'       : pg_unique_id,
					'email'           : pg_email,
					'mobile'          : pg_mobile,
					'amount'          : pg_amount,
					'status'          : pg_status,
					'payment_id'      : pg_payment_id,
					'created_at'      : pg_created_at,
					'payment_mode'    : pg_mode
					}
				msg = "success"
				status = 1
			else:
				status = 3
				msg    = "Records does not match with payment gateway."
		else:
			msg     =  "Record Not Found in payment gateway"
			status  = 2
	elif int(society_id) in [1,17]:
		url_1 = "https://conf-payments.numerotech.com/payumoney_trans.php?am_id="+str(am_id)+"&unique_id="+unique_id+"&from_date="+str(from_date)+"&to_date="+str(to_date)+""
#       print(url_1)
		response = requests.get(url_1)
		response = response.text
		result = response
		res = json.loads(result)
		if res:
			result_status = res["status"] 
			result_msg    = res["msg"] 
			payment_data   = res["Transaction_details"] 
			if result_status == 1:
				for index,value in enumerate(payment_data):
					pg_unique_id = value["udf2"]
					if pg_unique_id and pg_unique_id == unique_id :
						pg_status    = value["status"]  
						if pg_status == "null" or not pg_status :
							pg_status     = value["action"]
						pg_amount     = value["amount"] 
						pg_created_at = value["addedon"] 
						pg_payment_id = value["id"]                     
						pg_mode       = value["mode"] 
						pg_fullname   = value["firstname"] 
						pg_email      = value["email"]  
						pg_mobile     = value["phone"]
						if pg_status and pg_status == "SUCCESS":
							pg_status = "success"
						else:   
							pg_status = pg_status
						data = {
									'fullname'        : pg_fullname,
									'unique_id'       : pg_unique_id,
									'email'           : pg_email,
									'mobile'          : pg_mobile,
									'amount'          : pg_amount,
									'status'          : pg_status,
									'payment_id'      : pg_payment_id,
									'created_at'      : pg_created_at,
									'payment_mode'    : pg_mode
							}
						msg = "success"
						status = 1
						break
					else :
						status = 3
						msg    = "Records does not match with payment gateway."
			else :
				status = 4
				msg = result_msg
		else:
			msg     =  "Record Not Found in payment gateway"
			status  = 2
	else:
		status = 5
		msg = "NO Data"
	if status == 1:
		return render_template('back_office/bo_payment_generate.html',data=data,user=user_payment,society_id=society_id,society_key=society_key)
	else:
		flash(msg,"errorMsg")
		return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key)

@app.route('make_payment_success/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MakePaymentSuccess(society_id,society_key):
	unique_id      = request.values['unique_id'] 
	api_payment_id = request.values['payment_id']
	payment_method = request.values['payment_mode']
	paid_on        = request.values['created_at']
	amount         = request.values['amount']
	data    =   {
				'api_payment_id':api_payment_id,
				'payment_method':payment_method,
				'paid_at':paid_on,
				'amount':amount,
				'status':"success",
				'remarks': society_key + " membership registration"
				}
	UserPayment().updatePayment(unique_id,data)
	flash("Updated successfully","successMsg")
	return redirect(url_for('backoffice.PaymentVerification',society_id=society_id,society_key=society_key))



@app.route('/payment_verification/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def PaymentVerification(society_id,society_key):
	cur_date_time       =   datetime.now()
	cur_date_time_plus  =   cur_date_time-timedelta(hours=3)
	app_type            =   Helper.AppType
	payment_verification_data = UserPayment().get_payment_verification_data(society_id,app_type)
	if payment_verification_data == None:
		flash("No data","errorMsg")
		return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key)
	else:
		return render_template('back_office/bo_payment_verification.html',data=payment_verification_data,society_id=society_id,society_key=society_key)

@app.route('/view_verification/<user_id>/<payment_id>/<int:status_id>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ViewVerification(user_id,payment_id,status_id,society_id,society_key):
	user_id        = unquote(user_id)
	user_id        = int(Cryptography.decrypt(user_id))
	user           = Users().get_member(user_id)
	payment         = UserPayment().get_payment(payment_id) 
	return render_template('back_office/bo_view_payment_verification.html',payment=payment,user=user,society_id=society_id,society_key=society_key)


@app.route('payment_status/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def PaymentStatus(society_id,society_key):
	PaymentStatus   = request.values['PaymentStatus']
	payment_id      =       request.values['payment_id']
	api_payment_id  =       request.values['api_payment_id']
	payment_method  =       request.values['payment_method']
	paid_on         =       request.values['paid_on']
	amount          =       request.values.get('amount')
	unique_id       =       request.values.get('unique_id')
	remark          =       request.values['remark']
	app_type        =       Helper.AppType
	if PaymentStatus == '1':
		remark          =       request.values['reject_remark']
		data        =       {'status':"rejected",'remarks':remark}
		UserPayment().updatePayment(unique_id,data)
		flash("Rejected successfully","errorMsg")
		
	else:
		data        =       {'api_payment_id':api_payment_id,'payment_method':payment_method,'paid_at':paid_on,'amount':amount,'status':"success",'remarks':remark}
		UserPayment().updatePayment(unique_id,data)
		flash("Updated successfully","successMsg")
	return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key)

# @app.route('payment_rejected/<society_id>/<society_key>', methods = ["GET","POST"])
# def PaymentRejected(society_id,society_key):
#   payment_id  =       request.values['payment_id']
#   unique_id   =       request.values.get('unique_id')
#   app_type    =       Helper.AppType
#   data        =       {'status':"rejected"}
#   output      =       UserPayment().updatePayment(unique_id,data)
#   html_data   =       render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key)
#   data1={'msg':'Rejected successfully','status':1}
#   return json.dumps(data1)

@app.route('/state/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def State(society_id,society_key):
	country_id  = request.values['country_id']
	data        = States().get_states_of_india(country_id)
	return json.dumps(data)

@app.route('/new_member/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def NewMember(society_id,society_key):
	data = {
		'created_at'             : datetime.now(),
		'status_id'              : 0,
		'society_id'             : society_id,
		'choosed_member_type_id' : 1
	}
	user_id          = Users().insert_member(data)
	encrypt_user_id  = Cryptography.encrypt(int(user_id))
	return redirect (url_for('backoffice.getMemberEdit',user_id=encrypt_user_id,society_id=society_id,society_key=society_key))

@app.route('/member_edit/<user_id>/<society_id>/<society_key>',methods = ["GET"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def getMemberEdit(user_id,society_id,society_key,user = None):
	user_additional = None
	societyData = Auth.getSociety(society_id)
	user_id     = unquote(user_id)
	try:
		user_id  = int(Cryptography.decrypt(user_id))
	except:
		flash("Invalid URL","errorMsg")
		return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
	if user_id==0:
		# TO DO :-
			# insert new user and redirect to again this page 
		return render_template('back_office/member_edit.html')
	else:
		is_payment      = 0
		is_membership   = 1
		payment_types   = MPaymentType().get_all_payment_type(is_membership,society_id)
		states          = States().get_states()
		districts       = States().get_districts()
		countries       = Countries().get_countries()
		country_id      = societyData['default_country_id']
		states_of_india = States().get_states_of_india(country_id)
		work_types      = MWorkType().get_work_type(society_id)
		datas           = MAttachmentType().get_image(user_id,is_payment,society_id)
		is_payment      = 1
		image           = MAttachmentType().get_image(user_id,is_payment,society_id)
		member_types    = MMemberType().count_get_member_registrations(society_id)
		member_type     = MMemberType().get_member_type_approved(society_id)    
		current_status  = MStatus().get_currentstatus(society_id)
		position_types  = MWorkType().get_position_type(society_id)
		if user is None:
			userss        = Users().AllUserData(user_id)
			for index,value in enumerate(userss) :
				if index == 0 :
					user_profile           = value[0]
					user_payment_method    = value[0]['payment_method']
					if user_payment_method is None:
						user_pay_method = None
					else: 
						user_pay_method = urllib.parse.unquote(user_payment_method)
					encrypt_user_id     = Cryptography.encrypt(int(user_id))
				if index == 8 :
					if value:
						user_additional     = value[0] if value  else None

					
			return render_template('back_office/member_edit.html',states=states,district=districts,countries=countries,states_of_india=states_of_india,user=user_profile,work_types=work_types,position_types=position_types,datas=datas,image=image,payment_content=payment_types,user_pay_method=user_pay_method,member_types=member_types,member_type=member_type,encrypt_user_id=encrypt_user_id,society_id=society_id,society_key=society_key,societyData=societyData,current_status=current_status,user_additional=user_additional)
		else:
			user_profile     = user 
			encrypt_user_id  = Cryptography.encrypt(int(user_id))
		return render_template('back_office/member_edit.html',states=states,district=districts,countries=countries,states_of_india=states_of_india,user=user_profile,work_types=work_types,position_types=position_types,datas=datas,payment_content=payment_types,image=image,member_types=member_types,member_type=member_type,encrypt_user_id=encrypt_user_id,society_id=society_id,society_key=society_key,societyData=societyData,current_status=current_status)

@app.route('/member_edit/<user_id>/<society_id>/<society_key>', methods = ["POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def postMemberEdit(user_id,society_id,society_key):
	user_id     = unquote(user_id)
	user_id     = int(Cryptography.decrypt(user_id))
	societyData = Auth.getSociety(society_id)
	if request.method == "POST":
		name                    = request.values.get('name') or None
		prefix                  = request.values.get('prefix') or None
		email                   = request.values.get('email') or None
		mobile                  = request.values.get('mobile') or None
		gender                  = request.values.get('gender') or None
		whatsapp_number         = request.values.get('whatsapp_number') or None
		aadhaar_number          = request.values.get('aadhaar_number',None) or None
		aios_membership_number  = request.values.get('aios_membership_number',None) or None
		address_1               = request.values.get('address_1') or None
		address_2               = request.values.get('address_2') or None
		address_3               = request.values.get('address_3') or None
		district                = request.values.get('district') or None
		other_districts         = request.values.get("other_district") if district == "Others" else None
		city                    = request.values.get('city') or None
		pincode                 = request.values.get('pincode') or None
		country                 = request.values.get('country',None)
		state                   = request.values.get('state',None)
		gov_proof_type          = request.values.get('gov_proof_type') or None
		gov_proof_id            = request.values.get('gov_proof_id') or None
		hos_address1            = request.values.get('hos_address1') or None
		hos_address2            = request.values.get('hos_address2') or None
		hos_address3            = request.values.get('hos_address3') or None
		mc_number               = request.values.get('mc_number') or None
		mc_state                = request.values.get('mc_state') or None
		is_pg                   = request.values.get('is_pg') or None
		status_id               = request.values.get('status_id',0)
		pay_method              = request.values.get('payment_method',None)
		payment_remarks         = request.values.get('payment_remarks') or None 
		dob                     = request.values.get('dob') or None
		member_type_id          = request.values.get('member_type') or 2
		utr_number              = request.values.get('utr_number') or None
		payment_id              = request.values.get('payment_id',0)
		remarks                 = request.values.get('remarks') or None
		is_life_member          = request.values.get('is_life_member') or None
		place                   = request.values.get('place') or None
		institution             = request.values.get('fellowship_institution') or None
		start_date              = request.values.get('start_date') or None
		end_date                = request.values.get('end_date') or None
		type_of_practice        = request.form.getlist('type_of_practice')
		practice_percentage     = request.form.getlist('practice_percentage')
		type_of_practice_str    = ', '.join(type_of_practice)  
		practice_percentage_str = ', '.join(practice_percentage)
		if dob:
			try:
				dob = datetime.strptime(dob, '%d-%m-%Y')
			except Exception as e:
				dob = None
		else:
			dob = None
		if pay_method is None:
			payment_method = None
		else: 
			payment_method = urllib.parse.unquote(pay_method)
		is_valid        = True
		member_types_data    = MMemberType().count_get_member_registrations(society_id)
		if len(member_types_data) > 1:
			choosed_member_type_id = request.values.get('member_type') or None
		else:
			member_types           = member_types_data[0]
			choosed_member_type_id = member_types['member_type_id']
		data = {
			'user_id'                 : user_id,
			'full_name'               : name,
			'prefix'                  : prefix,
			'email'                   : email,
			'mobile'                  : mobile,
			'dob'                     : dob,
			'gender'                  : gender,
			'whatsapp_number'         : whatsapp_number,
			'aadhaar_number'          : aadhaar_number,
			'aios_membership_number'  : aios_membership_number,
			'address1'                : address_1,
			'address2'                : address_2,
			'address3'                : address_3,
			'district'                : district,
			'other_districts'        : other_districts,
			'city'                    : city,
			'pincode'                 : pincode,
			'country_id'              : int(country) if country else None,
			'state_id'                : int(state) if state else None,
			'gov_proof_type'         : gov_proof_type,
			'gov_proof_id'           : gov_proof_id,
			'hos_address1'            : hos_address1,
			'hos_address2'            : hos_address2,
			'hos_address3'            : hos_address3,
			'mc_number'               : mc_number,
			'mc_state_id'             : mc_state,
			'is_pg'                   : is_pg,
			'status_id'               : status_id,
			'type_of_practice'        : type_of_practice_str,
			'practice_consists_percentage' : practice_percentage_str,
			'updated_at'              : datetime.now()
		}
		data_1 = {
			'payment_method'    : payment_method,
			'utr_number'        : utr_number
		}
		if status_id==14:
			data['member_type_id'] = member_type_id
# 		if status_id!=14:
# 			data['choosed_member_type_id'] = member_type_id
		if (int(payment_id) > 0) :
			paymentData = { 'utr_number' : utr_number,'updated_at':datetime.now()}
			UserPayment().update_payments_data(payment_id,user_id,paymentData)
		else :
			pass

		datas  = dict(data, **data_1)
		_blank = "_blank"
		if email:
			check_email  = Users().check_email(email,society_id)
			if check_email:
				if (int(check_email.user_id) != user_id):
					e_user_id        = check_email.user_id
					encrypt_user_id  = Cryptography.encrypt(int(e_user_id))
					link             = url_for('backoffice.ViewExistingMember',user_id=encrypt_user_id,society_id=society_id,society_key=society_key)
					flash("Email Already Exists with us.We cannot use same account,<a href ="+link+" target="+_blank+" > View that Member</a>","errorMsg")
					is_valid = False
				
		if mobile:
			check_mobile    = Users().check_mobile(user_id,mobile,society_id)
			if check_mobile:
				m_user_id        =   check_mobile.user_id
				encrypt_user_id  = Cryptography.encrypt(int(m_user_id))
				link             = url_for('backoffice.ViewExistingMember',user_id=encrypt_user_id,society_id=society_id,society_key=society_key)
				flash("Mobile Number Already Exists with us.We cannot use same number, <a href ="+link+" target="+_blank+"> View that Member</a>","errorMsg")
				is_valid         = False
	
		if whatsapp_number is not None:
			check_whatsapp      = Users().check_whatsapp(user_id,whatsapp_number,society_id)
			if check_whatsapp:
				w_user_id        = check_whatsapp.user_id
				encrypt_user_id  = Cryptography.encrypt(int(w_user_id))
				link             = url_for('backoffice.ViewExistingMember',user_id=encrypt_user_id,society_id=society_id,society_key=society_key)
				flash("WhatsApp Number Already Exists with us.We cannot use same number, <a href ="+link+" target="+_blank+"> View that Member</a>","errorMsg")
				is_valid         = False
		
		userData = Users().get_member(user_id)      
		if payment_method:
			if payment_method == 'Online Payment':
				encrypt_user_id  = Cryptography.encrypt(int(user_id))
				return render_template('back_office/bo_online_payment.html',encrypt_user_id=encrypt_user_id,society_id=society_id,society_key=society_key,userData=userData)
			else:
				is_upload    = 1
				image        = MAttachmentType().get_payment_image(user_id,is_upload,society_id)
				required_at  = []
				for d in image :
					if d['attach_file_name'] == None  and d['is_upload'] == 1:
						required_at.append(d['attach_type'])
					if len(required_at) > 0:
						msg = "Please upload the proof of payment before proceeding further"
						flash(msg,"errorMsg") 
						is_valid = False  
		if is_life_member:
			additional_data = {
				'user_id'                           : user_id,
				'is_any_fellowship'                 : is_life_member,
				'any_fellowship_place_training'     : place,
				'fellowship_start_date'             : start_date,
				'fellowship_end_date'               : end_date,
				'institution'                       : institution,
				'created_at'                        : datetime.now(),
				'updated_at'                        : datetime.now(),
				}
			update_or_insert = UserQualification().update_or_insert_user_additional(user_id,additional_data)  
				
		if is_valid:
			if payment_method:
				memberData   = MMemberType().usp_get_member_display_name(user_id,society_id)
				member_type  = memberData[0]
				now          = datetime.now()           
				payment_data = {
					'user_id'           : user_id,
					'society_id'        : society_id,
					'currency'          : member_type['currency'],
					'payment_method'    : "BO - "+payment_method,
					'payment_for'       : societyData['society_intial']+" Membership",
					'remarks'           : payment_remarks,
					'unique_id'         : now.strftime('%Y%m%d%H%M%S%f'),
					'status'            : "success",
					'amount'            : member_type['amount'],
					'created_at'        : datetime.now(),
					'updated_at'        : datetime.now(),
					'paid_at'           : datetime.now(),
					'app_type'          : Helper.AppType,
					'utr_number'        : utr_number
				}
				UserPayment().insert_bopaymentdata(payment_data)
			if remarks is not None :
				if int(status_id) == societyData['ms_rejected_status_id']:
					next_reminder_date = datetime.now()+timedelta(days=3)
					datas     = {'user_id':user_id,'society_id':society_id,'status_id':status_id,'member_type_id':member_type_id,'remarks':remarks,'created_at':datetime.now(),'next_reminder_date':next_reminder_date}
				else:
					datas     = {'user_id':user_id,'society_id':society_id,'status_id':status_id,'member_type_id':member_type_id,'remarks':remarks,'created_at':datetime.now()}
				UserStatusLogs().insert_status(datas)
			else:
				pass
			
			if int(member_type_id)  != 2 and int(status_id) == societyData['ms_approved_status_id'] and userData.membership_no is None:
				Users().usp_generate_membership_number(user_id,member_type_id,society_id)
			else:
				pass
			Users().update_member(user_id,data)
			flash("Successfully!...Updated","successMsg")
			encrypt_user_id  = Cryptography.encrypt(int(user_id))
			return redirect (url_for('backoffice.getMemberEdit',user_id=encrypt_user_id,society_id=society_id,society_key=society_key))
		else:
			encrypt_user_id  = Cryptography.encrypt(int(user_id))
			return getMemberEdit(encrypt_user_id,society_id,society_key,data)   
	else:
		flash("Please, Try again.","errorMsg")
		return redirect (url_for('backoffice.getLogin',society_id=society_id,society_key=society_key))

# sivabalan 
# for TNASI adding new members

@app.route('/insert_new_member/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def InsertNewMember(society_id,society_key):
	data = {
		'created_at'             : datetime.now(),
		'status_id'              : 0,
		'society_id'             : society_id,
		'choosed_member_type_id' : 1
	}
	user_id          = Users().insert_member(data)
	encrypt_user_id  = Cryptography.encrypt(int(user_id))
	return redirect (url_for('backoffice.AddNewMember',user_id=encrypt_user_id,society_id=society_id,society_key=society_key))


@app.route('/add_new_member/<user_id>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def AddNewMember(user_id,society_id,society_key,user = None):
	societyData = Auth.getSociety(society_id)
	user_id     = unquote(user_id)
	try:
		user_id  = int(Cryptography.decrypt(user_id))
	except:
		flash("Invalid URL","errorMsg")
		return render_template('back_office/bo_add_new_member.html',society_id=society_id,society_key=society_key) 
	if user_id==0:
		# TO DO :-
			# insert new user and redirect to again this page 
		return render_template('back_office/member_edit.html')
	else:       
		member_types    = MMemberType().count_get_member_registrations(society_id)
		states          = States().get_states()
		districts       = States().get_districts()
		countries       = Countries().get_countries()
		is_payment      = 0
		datas           = MAttachmentType().get_image(user_id,is_payment,society_id)
		if user is None:
			userss        = Users().AllUserData(user_id)
			for index,value in enumerate(userss) :
				if index == 0 :
					user_profile           = value[0]
			encrypt_user_id     = Cryptography.encrypt(int(user_id))
			return render_template('back_office/bo_add_new_member.html',states=states,district=districts,countries=countries,society_id=society_id,society_key=society_key,user=user_profile,member_types=member_types,encrypt_user_id=encrypt_user_id,datas=datas)
		else:
			user_profile     = user 
			encrypt_user_id  = Cryptography.encrypt(int(user_id))
		return render_template('back_office/bo_add_new_member.html',states=states,district=districts,countries=countries,society_id=society_id,society_key=society_key,user=user_profile,member_types=member_types,encrypt_user_id=encrypt_user_id,datas=datas)

@app.route('/post_add_new_member/<user_id>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def PostAddNewMember(user_id,society_id,society_key):
	user_id     = unquote(user_id)
	user_id     = int(Cryptography.decrypt(user_id))
	if request.method == "POST":
		name                    = request.values.get('name') or None
		prefix                  = request.values.get('prefix') or None
		member_type             = request.values.get('member_type')
		membership_no           = request.values.get('membership_no')
		email                   = request.values.get('email') or None
		mobile                  = request.values.get('mobile') or None
		gender                  = request.values.get('gender') or None
		whatsapp_number         = request.values.get('whatsapp_number') or None
		dob                     = request.values.get('dob') or None
		district                = request.values.get('district') or None
		other_districts         = request.values.get("other_district") if district == "Others" else None
		city                    = request.values.get('city') or None
		pincode                 = request.values.get('pincode') or None
		country                 = request.values.get('country',None)
		state                   = request.values.get('state',None)
		if dob:
			try:
				dob = datetime.strptime(dob, '%d-%m-%Y')
			except Exception as e:
				dob = None
		else:
			dob = None
		data = {
			'user_id'                 : user_id,        
			'full_name'               : name,
			'prefix'                  : prefix,
			'email'                   : email,
			'member_type_id'          : member_type,
			'choosed_member_type_id'  : member_type,
			'membership_no'           : membership_no,
			'membership_no_only'      : membership_no,
			'mobile'                  : mobile,
			'dob'                     : dob,
			'gender'                  : gender,
			'whatsapp_number'         : whatsapp_number,
			'district'                : district,
			'other_districts'        : other_districts,
			'city'                    : city,
			'pincode'                 : pincode,
			'country_id'              : int(country) if country else None,
			'state_id'                : int(state) if state else None,
			'society_id'              : society_id,
			'status_id'               : 14
			}
		_blank = "_blank"
		is_valid        = True
		if email:
			check_email  = Users().check_email(email,society_id)
			if check_email:
				if (int(check_email.user_id) != user_id):
					e_user_id        = check_email.user_id
					encrypt_user_id  = Cryptography.encrypt(int(e_user_id))
					link             = url_for('backoffice.ViewExistingMember',user_id=encrypt_user_id,society_id=society_id,society_key=society_key)
					flash("Email Already Exists with us.We cannot use same account,<a href ="+link+" target="+_blank+" > View that Member</a>","errorMsg")
					is_valid = False

		if mobile:
			check_mobile    = Users().check_mobile(user_id,mobile,society_id)
			if check_mobile:
				m_user_id        =   check_mobile.user_id
				encrypt_user_id  = Cryptography.encrypt(int(m_user_id))
				link             = url_for('backoffice.ViewExistingMember',user_id=encrypt_user_id,society_id=society_id,society_key=society_key)
				flash("Mobile Number Already Exists with us.We cannot use same number, <a href ="+link+" target="+_blank+"> View that Member</a>","errorMsg")
				is_valid         = False
		if whatsapp_number is not None:
			check_whatsapp      = Users().check_whatsapp(user_id,whatsapp_number,society_id)
			if check_whatsapp:
				w_user_id        = check_whatsapp.user_id
				encrypt_user_id  = Cryptography.encrypt(int(w_user_id))
				link             = url_for('backoffice.ViewExistingMember',user_id=encrypt_user_id,society_id=society_id,society_key=society_key)
				flash("WhatsApp Number Already Exists with us.We cannot use same number, <a href ="+link+" target="+_blank+"> View that Member</a>","errorMsg")
				is_valid         = False
		if membership_no:
			check_membership_no = Users().check_membership_no(user_id,membership_no,society_id)
			if check_membership_no:
				m_user_id        =   check_membership_no.user_id
				encrypt_user_id  = Cryptography.encrypt(int(m_user_id))
				link             = url_for('backoffice.ViewExistingMember',user_id=encrypt_user_id,society_id=society_id,society_key=society_key)
				flash("Membership Number Already Exists with us.We cannot use same number, <a href ="+link+" target="+_blank+"> View that Member</a>","errorMsg")
				is_valid         = False
		if is_valid:
			Users().update_member(user_id,data)     
			flash("Successfully!...updated","successMsg")
			encrypt_user_id  = Cryptography.encrypt(int(user_id))
			return redirect (url_for('backoffice.AddNewMember',user_id=encrypt_user_id,society_id=society_id,society_key=society_key))

		else:
			encrypt_user_id  = Cryptography.encrypt(int(user_id))
			return AddNewMember(encrypt_user_id,society_id,society_key,data)
	return redirect (url_for('backoffice.AddNewMember',society_id=society_id,society_key=society_key))


@app.route('/payment_content/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def PaymentContent(society_id,society_key):
	payment_type  = request.values['payment_method']
	is_membership = 1
	datas         = MPaymentType().get_payment_content(payment_type,is_membership,society_id)
	data          = datas['payment_content']
	return data

@app.route('/approved/<user_id>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def Approved(user_id,society_id,society_key):
	member_type_id      = request.values.get('m_member_types')
	societyData         = Auth.getSociety(society_id)
	if societyData['member_approve_type'] == "before payment":
		userData   = {'member_type_id':member_type_id,'updated_at': datetime.now()}
		Users().update_member(user_id,userData)
		data       = {'msg':'success'}
	else:
		membership_nos = Users().usp_generate_membership_number(user_id,member_type_id,society_id)
		userData       = membership_nos[0]
		data           = {'membership_no':userData['membership_no'],'msg':'Membership Number generated'}
	json_data   = json.dumps(data)
	return json_data

@app.route('/insert_qualification/<society_id>/<society_key>', methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def InsertQualification(society_id,society_key):
	if request.method == "POST":
		user_id         = request.form['user_id']
		uq_id           = request.form['uq_id']
		qualification   = request.form['qualification']
		year_from       = request.form['year_from']
		year_passing    = request.form['year_passing']
		institution     = request.form['institution']
		
		data={
			'user_id'       : user_id,
			'uq_id'         : uq_id,
			'qualification' : qualification,
			'year_from'     : year_from,
			'year_passing'  : year_passing,
			'institution'   : institution,
			'created_at'    : datetime.now(),
			'updated_at'    : datetime.now()
			}
		update_or_insert = UserQualification().update_or_insert(user_id,uq_id,data)
		return render_template('back_office/bo_qualification_table.html',qul_data=update_or_insert,society_id=society_id,society_key=society_key)

@app.route('/get_qualifications_by_user/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def get_qualifications_by_user(society_id,society_key):
	user_id = request.values['user_id']
	data    = UserQualification().get_qulification_by_user(user_id)
	return render_template('back_office/bo_qualification_table.html',qul_data=data,society_id=society_id,society_key=society_key)

@app.route('/get_qualification/<society_id>/<society_key>',methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def get_qualification(society_id,society_key):
	uq_id   =   request.form['uq_id']
	data    = UserQualification().get_qualification(uq_id) 
	return json.dumps(data)

@app.route('/delete_qualification/<society_id>/<society_key>',methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def delete_qualification(society_id,society_key):
	uq_id   = request.form['uq_id']
	user_id = request.form['user_id']
	UserQualification().delete_qualification(uq_id)
	data    = UserQualification().get_qulification_by_user(user_id)
	return render_template('back_office/bo_qualification_table.html',qul_data=data,society_id=society_id,society_key=society_key)

@app.route('/insert_work/<society_id>/<society_key>', methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def InsertWork(society_id,society_key):
	if request.method == "POST":
		work_id         = request.form['work_id']
		user_id         = request.form['user_id']
		work_type_id    = request.form['work_type_id']
		position_type_id= request.values.get('position_type_id') or None
		work_status     = request.form['work_status']
		work_since      = request.form['work_since']
		work_until      = request.form['work_until']
		work_place      = request.form['work_place']

		data = {
			'work_id'       : work_id,
			'user_id'       : user_id,
			'work_type_id'  : work_type_id,
			'position_type_id':position_type_id,
			'work_status'   : work_status,
			'work_since'    : work_since,
			'work_until'    : work_until,
			'work_place'    : work_place,
			'created_at'    : datetime.now(),
			'updated_at'    : datetime.now(),
		}
		work_data = UserWork().update_or_insert_work(user_id,work_id,data)  
		return render_template('back_office/bo_work_table.html',wrk_data = work_data,society_id=society_id,society_key=society_key)
		
@app.route('/get_work_by_user/<society_id>/<society_key>',methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def get_work_by_user(society_id,society_key):
	user_id = request.values["user_id"]
	data    = MWorkType().get_work_type_by_user(user_id)
	return render_template('back_office/bo_work_table.html',wrk_data = data,society_id=society_id,society_key=society_key)

#edit work
@app.route('/get_work/<society_id>/<society_key>',methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def get_work(society_id,society_key):
	work_id = request.values['work_id']
	data    = UserWork().get_work(work_id)
	return json.dumps(data)

@app.route('/delete_work/<society_id>/<society_key>',methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def delete_work(society_id,society_key):
	work_id = request.form['work_id']
	user_id = request.form['user_id']
	UserWork().delete_work(work_id)
	data    = MWorkType().get_work_type_by_user(user_id)
	return render_template('back_office/bo_work_table.html',wrk_data = data,society_id=society_id,society_key=society_key)

@app.route('/insert_publication/<society_id>/<society_key>', methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def InsertPublication(society_id,society_key):
	if request.method == "POST":
		publication_id      = request.form['publication_id']
		user_id             = request.form['user_id']
		author_type         = request.form['author_type']
		author_description  = request.form['author_description']

		data = {
			'publication_id'        : publication_id,
			'user_id'               : user_id,
			'author_type'           : author_type,
			'author_description'    : author_description,
			'created_at'            : datetime.now(),
			'updated_at'            : datetime.now(),
		}
		publication_data = Userpublication().update_or_insert_publication(user_id,publication_id,data)  
		return render_template('back_office/bo_publication_table.html',data = publication_data,society_id=society_id,society_key=society_key)
		
@app.route('/get_publication_by_user/<society_id>/<society_key>',methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def get_publication_by_user(society_id,society_key):
	user_id = request.values["user_id"]
	data    = Userpublication().get_publication_by_user(user_id)
	return render_template('back_office/bo_publication_table.html',data = data,society_id=society_id,society_key=society_key)

#edit work
@app.route('/get_publication/<society_id>/<society_key>',methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def get_publication(society_id,society_key):
	publication_id = request.values['publication_id']
	data           = Userpublication().get_publication(publication_id)
	return json.dumps(data)

@app.route('/delete_publication/<society_id>/<society_key>',methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def delete_publication(society_id,society_key):
	publication_id = request.form['publication_id']
	user_id        = request.form['user_id']
	Userpublication().delete_publication(publication_id)
	data           = Userpublication().get_publication_by_user(user_id)
	return render_template('back_office/bo_publication_table.html',data = data,society_id=society_id,society_key=society_key)

@app.route('/post_amzon_upload/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def PostAmazonUpload(society_id,society_key,acl="public-read"):
	if request.method == 'POST':
		user_id         = request.values.get('user_id')
		attach_id       = request.values['attach_id'] 
		attach_type_id  = request.form['attach_type_id']
		societyData     = Auth.getSociety(society_id)
		s3              = boto3.client("s3",aws_access_key_id='AKIAILLDAQ7NFUMVOYLQ',aws_secret_access_key='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')
		files           = request.files.getlist("file")
		for file in files:
			if file.filename:
				filename        = secure_filename(file.filename)
				split_tup       = os.path.splitext(filename)
				file_name       = split_tup[0]
				file_extension  = split_tup[1]
				datas           = MAttachmentType().get_attach_type(attach_type_id)
				attach_type     = datas['attach_type']
				file_str        = attach_type+file_extension
				if " " in file_str :
					file_str = file_str.replace(" ","")
				try:
					bucket     = societyData['aws_bucket']
					if bucket == 'common-application':
						foldername = str(society_key)+"/user_attachment"
					else:
						foldername = "user_attachment"
					user_id    = str(user_id)
					
					response   = s3.upload_fileobj(file, bucket,foldername+'/'+user_id+'/'+ file_str, ExtraArgs={"ACL": acl,"ContentType": file.content_type})
					data_1     = {'bucketname' : societyData['aws_bucket'],'foldername':foldername,'file_name':file_str+"?"+str(Helper.getcurrenttimestamp()),'msg':'Image successfully uploded','file_extension':file_extension,'status':1} 
					file_path  = societyData['aws_url']+foldername+"/"+user_id
					data = {
						'user_id'           : user_id,
						'attach_type_id'    : attach_type_id,
						'attach_file_name'  : file_str,
						'attach_path'       : file_path,
						'created_at'        : datetime.now(),
						'updated_at'        : datetime.now()  
					}
					if (int(attach_id) > 0):
						ua  = UserAttachments().get_user_attach(attach_id,attach_type_id)
						if ua:
							data.pop("created_at") 
							data            = UserAttachments().update_image(attach_id,data)
							d               = {}
							d['attach_id']  = attach_id
							data_1.update(d)
					else :
						attach_id_pk   = UserAttachments().insert_image(data)
						d              = {}
						d['attach_id'] = attach_id_pk
						data_1.update(d)
					return json.dumps(data_1)
				except ClientError as e:
					logging.error(e)
					print(logging.error(e))
					data_1    = {'msg':'Image upload failed .Please try again.','status':0}        
					json_data = json.dumps(data_1)
					return json_data
					# flash('Something Error .Please Try Again')
	return "success"

@app.route('/delete_amazon_image/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def DeleteAmazonImage(society_id,society_key):
	attach_id       = request.form['attach_id']
	attach_type_id  = request.form['attach_type_id']
	societyData     = Auth.getSociety(society_id)
	ua              = UserAttachments().get_user_attach(attach_id,attach_type_id)
	if ua is None:
		data = {'msg':'Deleted','status' : 1}
	else:
		filepath        = ua['attach_path']
		filename        = ua['attach_file_name']
		foldername      = filepath+ "/"+filename
		foldername      = foldername.replace(societyData['aws_url'], "")
		s3              = boto3.resource("s3",aws_access_key_id='AKIAILLDAQ7NFUMVOYLQ',aws_secret_access_key='EEudWCsWeCIt/J9/z5m5htmUdGFJNzWFPvNQBIp/')
		response        =  s3.Object(societyData['aws_bucket'], foldername).delete()
		UserAttachments().delete_image(attach_id,attach_type_id)
		data  = {'msg':'Deleted','status' : 1}
	json_data = json.dumps(data)
	return json_data

@app.route('/search_member/<society_id>/<society_key>', methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def search_member(society_id,society_key):
	if request.method == 'POST':
		search_data = request.form['search_value']
		search_data = search_data.strip()
		if "-" in search_data:
			searchData = search_data.split("-")
			searchUser = searchData[0]+"|"+searchData[1]
		elif " " in search_data:    
			searchData = search_data.split(" ")
			searchUser = searchData[0]+"|"+searchData[1]
		else:
			searchUser = search_data
		if int(society_id) == 1:
			is_prosec = None
		else:
			is_prosec = 1
		type        = request.form['type']
		members     = Users().usp_search_prosec(searchUser,is_prosec,society_id)
		if members is None:
			msg = "Member Not Found"
			return render_template('back_office/bo_prosec_table.html',members = members,type=type,msg=msg,society_id=society_id,society_key=society_key)
		else:
			return render_template('back_office/bo_prosec_table.html',members = members,type=type,society_id=society_id,society_key=society_key)

# after select proposer and seconder-insert and update in db
# proposer and seconder must not be same 
@app.route('/insert_prosec/<society_id>/<society_key>', methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def insert_prosec(society_id,society_key):
	if request.method == "POST":
		isvalid         = True
		msg             = ""
		status          = 0
		reference_id    = request.values['reference_id']
		user_id         = request.form['user_id']
		ps_type         = request.form['type']
		reference_by    = request.form['user_id_refer'] 

		data    = {
					'user_id'       : user_id,
					'type'          : ps_type,
					'reference_by'  : reference_by,
					'created_at'    : datetime.now(),
					'updated_at'    : datetime.now(),
			}
		if int(reference_by) > 0:
			d = Reference().get_reference(user_id,reference_by)
			if d:
				if (d["type"] != ps_type):
					msg     = "You can't choose proposer and seconder both same, Please choose diffrent members"
					status  = 0
					isvalid = False
		
		if isvalid == True:
			if (int(reference_id) > 0):
				data.pop("created_at")
				data    =   Reference().update_prosec(user_id,ps_type,data)
				status  = 1
			else:
				Reference().insert_prosec(data)
				status = 1
		return jsonify(status=status,msg=msg)

# get proposer and seconder to show table after select button
@app.route('/get_prosec/<society_id>/<society_key>', methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def get_prosec(society_id,society_key):
	ps_type         = request.form['type']
	reference_by    = request.form['user_id_refer']
	user_id         = request.form['user_id']
	members         = Reference().usp_get_reference_details(user_id,reference_by,ps_type)
	return render_template('back_office/bo_prosec_two_table.html',members=members,ps_type=ps_type,society_id=society_id,society_key=society_key)

# get exist proposer and seconder in db
@app.route('/get_exists_proandsec/<society_id>/<society_key>', methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def get_exists_proandsec(society_id,society_key):
	status      = 0
	html        = ""
	user_id     = request.form['user_id']
	ps_type     = request.form['type']
	member      = Users().get_already_pro_sec(user_id,ps_type)
	if member:
		status      = 1
		html        = render_template('back_office/bo_prosec_two_table.html',members = member,ps_type=ps_type,society_id=society_id,society_key=society_key)
	return jsonify(status=status,html=html)

# delete proposer and seconder      
@app.route('/delete_prosec/<society_id>/<society_key>',methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def Delete_prosec(society_id,society_key):
	reference_id = request.values['reference_id']
	Reference().delete_prosec(reference_id)
	return jsonify(status="success")

@app.route('/prosec_accrej/<int:user_id>/<int:reference_by>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ProsecAccrej(user_id,reference_by,society_id,society_key):
	if request.method == "POST":
		btn         = request.values['reference']
		now         = datetime.now()
		societyData = Auth.getSociety(society_id)
		if btn == 'accept':
			data_1 = {'approved_on' : now,'updated_at':now}
			Reference().update_prosec_acc_rej(user_id,reference_by,data_1)
			data   = {'msg':'Accepted','status' : 1}
			approved_both  = Reference().check_accept_both(user_id)
			count_approved = approved_both[0]
			if int(count_approved == 2) :
				if societyData['member_approve_type'] == "before payment":
					status  = "approved_both_proposer_seconder_waiting_approval_secretariat_without_pay" 
				else:
					status  = "approved_both_proposer_seconder"
				status_id_1 = MStatus().get_status_id(status,society_id)
				status_id   = status_id_1.status_id
				data        = {'status_id':status_id,'updated_at': datetime.now()}
				Users().update_member(user_id,data)
				json_data   = json.dumps(data)
				return json_data
			else :
				json_data = json.dumps(data)
				return json_data
		else:
			data      = {'msg':'Rejected','status' : 1}
			data_1    = {'rejected_on' : datetime.now(),'updated_at': datetime.now()}
			Reference().update_prosec_acc_rej(user_id,reference_by,data_1)
			json_data = json.dumps(data)
			return json_data


@app.route("/report_export_filter/<society_id>/<society_key>" , methods=['GET','POST'])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ReportExportFilter(society_id,society_key):
	society = Auth.checkSocietybyIdKey(society_id,society_key)
	export_columns = request.values.getlist('export_columns',None)
	if export_columns:
		export_column = ("','".join(export_columns))
		export_column = "'"+export_column+"'"
	else:
		export_column = "Null"
	
	
	export_cols        = ExportFilterCols().get_export_columns(society_id) # get all column values

	is_export            = False
	user_id              = None
	status_id            = None
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	search_member_type   = request.values.get('search_member_type',None) or None
	from_memnos          = request.values.get('from_memno',None) or None
	end_memnos           = request.values.get('end_memno',None) or None
	filter_visible       = request.values.get('filter_visible',None)
	approved_from        = request.values.get('approved_from',None) or None
	approved_to          = request.values.get('approved_to',None) or None
	order_type           = request.values.get('order_type',"asc") or None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None
	if search_member_type is None:
		status_id = 14

	if from_memnos:
		from_memno = ''.join([i for i in from_memnos if  i.isdigit()])
	else:
		from_memno = None

	if end_memnos:
		end_memno = ''.join([i for i in end_memnos if  i.isdigit()])
	else:
		end_memno = None

	search_data          = {
		'name'           : search_name,
		'email'          : search_email,
		'mobile'         : search_mobile,
		'member_type'    : search_member_type,
		'status_id'      : status_id,
		'from_memno'     : from_memno,
		'end_memno'      : end_memno,
		'approved_from'  : approved_from,
		'approved_to'    : approved_to,
		'order_type'     : order_type,
		'sort_by'        : sort_by

	}
	
	submit_btn =  request.values.get('form_submit',None)    #Post method block start
	
	if submit_btn == "Clear":
		search_data['name']           =  None
		search_data['email']          =  None
		search_data['mobile']         =  None
		search_data['member_type']    =  None
		search_data['from_memno']     =  None
		search_data['end_memno']      =  None
		search_data['export_columns'] =  None
					  
	page    = 1
	limit   = 500000
	if submit_btn == "Export CSV":
		page      = 1
		limit     = 500000
		is_export = True
	offset =  int((page-1)*limit)
	if search_member_type and int(search_member_type) == 2:
		status_id = 10
		result = Users().usp_get_incomplete_member(search_name,search_email,search_mobile,status_id,offset,limit,user_id,society_id)
	else:
		result   = Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type)
	
	for index,value in enumerate(result) :
		if index == 0:
			if len(value) == 0:
				flash("No Records","errorMsg")
				return render_template('back_office/export.html',society_id=society_id,society_key=society_key,search_data=search_data,export_cols=export_cols) 
			else:
				data = value
	data_name=[]
	for j in data:
		data1={}
		for row in export_columns:
			data1[row]=j[row]
		data_name.append(data1)

	if is_export == True:
		if data:
			get_select_columns = ExportFilterCols().get_select_columns(export_column,society_id)
			col_name=[] 
			if get_select_columns:
				for j in get_select_columns:
					data2=j['cols_display_name']
					col_name.append(data2)
			return ExportDownloadCSV(data_name,export_columns,col_name,society_key)
		else:
			flash("No Record Found !..")
				  
	member_types = MMemberType().get_all_member_types(society_id)
	return render_template('back_office/export.html',user_data= data,search_data=search_data,export_columns = export_columns,export_cols=export_cols,export_column=export_column,society_id=society_id,society_key=society_key,member_types=member_types)

def ExportDownloadCSV(data_name,export_columns,col_name,society_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 = col_name
	writer.writerow(line)
	for row in data_name:
		line = []
		for i in export_columns:
			# print(i)
			line.append(row[i])
		writer.writerow(line)

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


@app.route("/mail_template_index/<society_id>/<society_key>" , methods=['GET','POST'])
def MailTemplateIndex(society_id,society_key):
	Auth.checkSocietybyIdKey(society_id,society_key)
	templateData  = MembershipMailTemplates().get_mail_template_name(society_id)
	return render_template('back_office/mail_index.html',templateData=templateData,society_id=society_id,society_key=society_key)

@app.route("/mail_template/<template_name>/<society_id>/<society_key>" , methods=['GET','POST'])
def MailTemplate(template_name,society_id,society_key):
	mailData = MembershipMailTemplates().get_mail_template(society_id,template_name)
	is_preview = 0
	return render_template('back_office/m_mail_template.html',society_id=society_id,society_key=society_key,mailData=mailData,is_preview=is_preview)


@app.route("/preview_mail/<society_id>/<society_key>" , methods=['GET','POST'])
def PreviewMail(society_id,society_key):
	sub_type     = request.values.get('sub_type')
	subject   = request.values.get('subject')
	datas = request.values.get('mail_content')
	is_layout    = request.values.get('is_layout')

	if int(is_layout) == 1:
		datas = render_template('back_office/email/bo_mail_template.html',mail_content=datas)

	else:
		pass
	
	datas = {'sub_data':subject,'data':datas,"msg" : "successfully" ,"status" : 1}
	json_data = json.dumps(datas,default=str)
	return json_data


# @app.route("/preview_mail_1/<society_id>/<society_key>" , methods=['GET','POST'])
# def PreviewMail_1(society_id,society_key):
#   sub_type     = request.values.get('sub_type')
#   if sub_type == "Merge":
#       subject   = request.values.get('subject')
#       sub_datas = request.values.get('sub_data')
#       sub_data  = json.loads(sub_datas)
#       sub_datas = Helper.merge_tags(subject,sub_data)
#   else:
#       mail_content = request.values.get('subject')
#       society      = request.values.get('sub_data')
#       society      = json.loads(society)
#       data         = {'mail_content':mail_content,'society':society}
#       sub_datas        = Helper.convert_html_for_mail_screen(data)


#   is_type      = request.values.get('is_type')
#   is_layout    = request.values.get('is_layout')
#   mail_content = request.values.get('mail_content')

#   if is_type == "Merge":
#       mail_data = request.values.get('mail_data')
#       mail_data = json.loads(mail_data)
#       datas   = Helper.merge_tags(mail_content,mail_data)
#   else:
#       society = request.values.get('mail_data')
#       society = json.loads(society)
#       data = {'mail_content':mail_content,'society':society}
#       datas = Helper.convert_html_for_mail_screen(data)

#   if int(is_layout) == 1:
#       datas = render_template('back_office/email/bo_mail_template.html',mail_content=datas)

#   else:
#       pass
	
#   datas = {'sub_data':sub_datas,'data':datas,"msg" : "successfully" ,"status" : 1}
#   json_data = json.dumps(datas,default=str)
#   return json_data

@app.route("/get_preview_mail/<template_name>/<society_id>/<society_key>" , methods=['GET','POST'])
def getPreviewMail(template_name,society_id,society_key):
	mailData = MembershipMailTemplates().get_mail_template(society_id,template_name)
	is_preview = 1
	datas = render_template('back_office/email/bo_mail_template.html',mail_content=mailData.mail_content)
	return render_template('back_office/m_mail_template.html',society_id=society_id,society_key=society_key,mailData=mailData,datas=datas,is_preview=is_preview)

# Sivabalan 
# VRSI for changing associate member to life member
# TNOA for changing life member to associate member vice versa
@app.route('/change_member_type/<society_id>/<society_key>',methods=["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ChangeMemberType(society_id,society_key):
	user_id             = request.values.get('user_id')
	user_id             = unquote(user_id)
	user_id             = int(Cryptography.decrypt(user_id))
	attach_type_id      = request.values.get('type_id') or None
	prev_member_type_id = request.values.get('prev_member_type_id') or None 
	userData            = Users().get_member(user_id)
	membership_no       = userData.membership_no
	member_type_id      = userData.member_type_id
	is_valid            = True
	mem_no = ""
	if int(society_id)  == 1 :
		userattach     = UserAttachments().check_fellowship_certificate(user_id,attach_type_id)
		if userattach:
			if member_type_id == Helper.AssociateMemberId:
				Str     = membership_no
				l       = len(Str) 
				mem_no  = Str[:l-1]
				member_type_id = 1
		else:
			is_valid = False
			data  = {'msg':'Please upload the file','status' : 0}
#   elif int(society_id)==3:
#       if member_type_id == Helper.NationalMemberId:
#           String = membership_no
#           for i in range(0,len(String)):
#               if i != 1:
#                   mem_no = mem_no + String[i]
#           member_type_id=1
#       elif member_type_id == Helper.LifeMemberId:
#           String = membership_no
#           for i in range(0,len(String)):
#               if i == 1:
#                   mem_no = mem_no + 'N' + String[i]
#               else:
#                   mem_no = mem_no + String[i]
#           member_type_id=17
#       else:
#           pass
	elif int(society_id)==3:
		if member_type_id == Helper.NationalMemberId:
			Str = membership_no
			l = len(Str) 
			mem_no  = Str[:l-1]
			member_type_id=1
		elif member_type_id == Helper.LifeMemberId:
			String = membership_no
			mem_no = String + 'N'
			member_type_id=17
		else:
			pass
	elif int(society_id)==2:
		if member_type_id == Helper.AssociateMemberId:
			Str = membership_no
			l = len(Str) 
			mem_no  = Str[:l-1]
			member_type_id = 1
		elif member_type_id == Helper.LifeMemberId:
			String = membership_no
			mem_no = String + 'A'
			member_type_id=6
		else:
			pass
	else:
		return "nothing"
	if is_valid:
		data = {'membership_no':mem_no,'member_type_id':member_type_id,'prev_member_type_id':prev_member_type_id,'updated_at': datetime.now()}
		Users().update_member(user_id,data)
		userData     = Users().get_member(user_id)
		status  = "Approve"
		remarks = "changed_member_type"
		user_logs_data = {'society_id':society_id,'user_id' : user_id,'status_id': userData.status_id,'status':status,'member_type_id':userData.member_type_id,'remarks':remarks,'created_at':datetime.now()}
		UserStatusLogs().insert_status(user_logs_data)      
		flash('Updated successfully','successMsg')
		data  = {'msg':'success','status' : 1}
	return json.dumps(data)


@app.route('/view_changes_mail/<user_id>/<society_id>/<society_key>/<is_preview>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ViewChangesMail(user_id,society_id,society_key,is_preview):
	template_name    = request.values.get("template_name")
	user_id          = unquote(user_id)
	user_id          = int(Cryptography.decrypt(user_id))
	prev_member_type = request.values.get('prev_member_type')
	societyData      = Auth.getSociety(society_id)
	user             = Users().usp_approved_mail_data(user_id,society_id)
	user_profile     = user[0]
	if prev_member_type == None:
		prev_member_type = user_profile['prev_member_type']
	email            = user_profile['email']
	mailData         = MembershipMailTemplates().get_mail_template(society_id,template_name) 
	
	s_data = {
		'mail_content' : mailData.subject,
		'userData'     : user_profile,
		'society'      : societyData
	}
	m_data = {
		'prev_member_type':prev_member_type,
		'mail_content' : mailData.mail_content,
		'userData'     : user_profile,
		'society'      : societyData
	}
	subject         = Helper.convert_html_for_mail_screen(s_data)
	mail_content    = Helper.convert_html_for_mail_screen(m_data)
	if int(is_preview) == 1:        
		encrypt_user_id = Cryptography.encrypt(int(user_id))
		html_data = render_template('back_office/member_type_change_mail_view_v1.html',encrypt_user_id=encrypt_user_id,users=user_profile,mail_content=mail_content,subject=subject,prev_member_type=prev_member_type,society_id=society_id,society_key=society_key,societyData=societyData,template_name=template_name)
		data  = {'html_data':html_data,'msg':'success','status' : 1}
		return json.dumps(data)
	else:
		html  = render_template('back_office/email/bo_mail_template.html',mail_content=mail_content,societyData=societyData)
		EMAIL.sendMail(subject,html,email,mailData,societyData)
		encrypt_user_id = Cryptography.encrypt(int(user_id))
		flash('Mail sent successfully','successMsg')
		return redirect(url_for('backoffice.MembersPage',society_id=society_id,society_key=society_key))

	
@app.route('/send_changes_mail/<prev_member_type>/<user_id>/<society_id>/<society_key>/<template_name>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def SendChangesMail(prev_member_type,user_id,society_id,society_key,template_name):
	prev_member_type = urllib.parse.unquote(prev_member_type)
	user_id          = unquote(user_id)
	user_id          = int(Cryptography.decrypt(user_id))
	societyData      = Auth.getSociety(society_id)  
	user             = Users().usp_approved_mail_data(user_id,society_id)
	user_profile     = user[0]
	email            = user_profile['email']
	status_id        = user_profile['status_id']
	# full_name      = user_profile['prefix']+user_profile['full_name'] if user_profile['prefix'] else user_profile['full_name']
	template_name  = template_name
	mailData       = MembershipMailTemplates().get_mail_template(society_id,template_name)
	society        = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail']
	}
	s_data = {
		'mail_content': mailData.subject,
		'userData'    : user_profile,
		'society'     : society
	}
	subject          = Helper.convert_html_for_mail_screen(s_data)
	m_data = {
		'prev_member_type':prev_member_type,
		'mail_content': mailData.mail_content,
		'userData'    : user_profile,
		'society'     : society
	}
	mail_content     = Helper.convert_html_for_mail_screen(m_data)
	html  = render_template('back_office/email/bo_mail_template.html',mail_content=mail_content,societyData=societyData)
	EMAIL.sendMail(subject,html,email,mailData,societyData)
	encrypt_user_id = Cryptography.encrypt(int(user_id))
	flash('Mail Sent successfully','successMsg')
	return redirect(url_for('backoffice.MembersPage',society_id=society_id,society_key=society_key))
	
	################## Ratification year generate ####################
@app.route('/update_ratification_year/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def UpdateRatificationYear(society_id,society_key):
	ratification_year       = None
	membership_no_from      = None
	membership_no_to        = None
	is_ratified             = None
	data = Users().usp_generate_ratification(ratification_year,society_id,membership_no_from,membership_no_to,is_ratified)
	for index,value in enumerate(data) :
		if index == 1:
			last_ratified_number = value[0]['@last_r_mem_no']
			last_ratified_year = value[0]['@last_r_year']
		if index == 2:
			next_ratified_number = value[0]['next_ratifed_number']
		if index == 3:
			last_membership_number = value[0]['last_membership_number']
		if index == 4:
			ratification_member_type = value[0]['member_types']
	return render_template('back_office/bo_ratification_year_update.html',society_id=society_id,society_key=society_key,last_ratified_number=last_ratified_number,next_ratified_number=next_ratified_number,last_membership_number=last_membership_number,last_ratified_year=last_ratified_year,ratification_member_type=ratification_member_type)


@app.route('/post_update_ratification_year/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def PostUpdateRatificationYear(society_id,society_key): 
	membership_no_from          = request.values.get('membership_no_from')
	membership_no_to            = request.values.get('membership_no_to')
	ratification_year           = request.values.get('ratification_year')
	is_ratified                 = request.values.get('is_ratified')
	data = Users().usp_generate_ratification(ratification_year,society_id,membership_no_from,membership_no_to,is_ratified)
	for index,value in enumerate(data) :
		if index == 0:
			msg=value[0]
	flash_mesg = msg['msg']
	flash_color = msg['flash_color']
	data = {
			'membership_no_from'    : membership_no_from,
			'membership_no_to'      : membership_no_to,
			'ratification_year'     : ratification_year,
			'flash_mesg'            : flash_mesg,
			'flash_color'           : flash_color,
			'is_ratified'           : is_ratified
		}
	json_data   = json.dumps(data)
	return json_data
	
# in members page - membership approved mail-manually
@app.route('/membership_submission_mail/<user_id>/<society_id>/<society_key>/<is_preview>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MembershipSubmissionMail(user_id,society_id,society_key,is_preview):
	user_id        = unquote(user_id)
	user_id        = int(Cryptography.decrypt(user_id))
	is_test        = request.values.get('is_test') or None
	societyData    = Auth.getSociety(society_id)    
	userss      = Users().AllUserData(user_id)
	for index,value in enumerate(userss) :
		if index == 0 :
			user_profile        = value[0]
		if index == 1 :
			user_qualification  = value         
		if index == 2 :
			user_work           = value   
		if index == 3 :
			user_attachments    = value 
		if index == 4 :
			prosec              = value
		if index == 5 :
			othersociety        = value
		if index == 6 :
			user_training       = value

	template_name    = "reg_success_mail"
	mailData         = MembershipMailTemplates().get_mail_template(society_id,template_name)
	full_name        = user_profile['prefix']+user_profile['full_name'] if user_profile['prefix'] else user_profile['full_name'] 
	sub_data         = {'full_name'    : full_name,'society_name' : societyData['society_intial']}
	subject          = Helper.merge_tags(mailData.subject,sub_data)
	society     = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail'],
		'society_full_form'   : societyData['society_title'],
		'society_member_link' : societyData['society_url'],
		'base_url'            : Helper.base_url()
	}
	data = {
		'mail_content'       : mailData.mail_content,
		'userData'           : user_profile,
		'qul_data'           : user_qualification,
		'exp_data'           : user_work,
		'image'              : user_attachments,
		'prosec_data'        : prosec,
		'othersociety_data'  : othersociety,
		'training_data'      : user_training,
		'society'            : society
	}
	mail_content     = Helper.convert_html_for_mail_screen(data)
	html             = render_template('back_office/email/bo_mail_template.html',mail_content=mail_content,societyData=societyData)
	encrypt_user_id = Cryptography.encrypt(int(user_id))
	if int(is_preview) == 1:
		return render_template('back_office/membership_submission_mail_view.html',encrypt_user_id=encrypt_user_id,users=user_profile,mail_content=mail_content,subject=subject,society_id=society_id,society_key=society_key,societyData=societyData)
	else:
#       print(is_test)
		if is_test and int(is_test) == 1:
			email   = request.form['sample_email']
#           print(email)
			subject = "SAMPLE : " + subject 
			flash("Successfully sent sample mail","successMsg")
		else:   
			email   = user_profile['email']
			flash("Successfully sent mail to Applicant","successMsg")
		EMAIL.sendMail(subject,html,email,mailData,societyData)
		return redirect(url_for('backoffice.WaitingProposerSeconder',society_id=society_id,society_key=society_key))

################## End Ratification year generate ####################

# For sending mail in member page
@app.route('/send_mail_members/<mail_template_id>/<society_id>/<society_key>',methods=["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def SendMailMembers(mail_template_id,society_id,society_key):
	user_ids            = request.values.get('selected_user_ids',None)
	test_mail_id        = request.values.get('test_mail_id')
	is_test             = request.values.get('is_test',None)
	is_preview          = request.values.get('is_preview',None)
	
	mailData = MembershipMailTemplates().get_mail_template_preview(society_id,mail_template_id)

	societyData          = Auth.getSociety(society_id)
	
	if int(society_id) == 2 and mailData['template_name'] == "intimation_mail":
		member_type_id       = 6
		userDatas  = Users().get_associate_member_data(society_id,member_type_id,user_ids)


		for userData in userDatas:
			sub_data      = {'society_intial':societyData['society_intial']}
			subject       = Helper.merge_tags(mailData['subject'],sub_data)
			mail_data = {
						'mail_content': mailData['mail_content'],
						'userData'     : userData,
						'societyData'    : societyData
						}

			mail_content  = Helper.convert_html_for_mail_screen(mail_data)
			html             = render_template('back_office/email/bo_mail_template.html',mail_content=mail_content,societyData=societyData)
			if is_preview and int(is_preview) == 1:
				data = {'html':html}
			else:
				if is_test and int(is_test) ==1:
					email = test_mail_id

				else:
					email = userData['email']
				msg  = 'Mail sent successfully'
				data = {'msg':msg}

				# EMAIL.sendMail(subject,html,email,mailData)
	else:
		pass

	return jsonify(data)
	
	
################### Expired Members Start.....###################

@app.route('/expired_members/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ExpiredMembers(society_id,society_key):
	societyData          = Auth.getSociety(society_id)
	max_date             = datetime.now()
	status_id            = societyData['ms_expired_mem_status_id']
	btn_page             = request.values.get('form_submit',None)
	user_id              = None
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	search_member_type   = request.values.get('search_member_type',None) or None
	filter_visible       = request.values.get('filter_visible',None)
	from_memnos          = request.values.get('from_memno',None) or None
	end_memnos           = request.values.get('end_memno',None) or None
	approved_from        = request.values.get('approved_from',None) or None
	approved_to          = request.values.get('approved_to',None) or None
	order_type           = request.values.get('order_type',"asc") or None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None

	if from_memnos:
		from_memno = ''.join([i for i in from_memnos if  i.isdigit()])
	else:
		from_memno = None

	if end_memnos:
		end_memno = ''.join([i for i in end_memnos if  i.isdigit()])
	else:
		end_memno = None

	#passing to tempalte for set filter form values
	search_data          = {
		'name'           : search_name,
		'email'          : search_email,
		'mobile'         : search_mobile,
		'member_type'    : search_member_type,
		'from_memno'     : from_memnos,
		'end_memno'      : end_memnos,
		'approved_from'  : approved_from,
		'approved_to'    : approved_to,
		'order_type'     : order_type,
		'sort_by'        : sort_by
	}
	
	
	if btn_page =="Search" :
		page   = 1
		limit  = 50
		filter_visible = 1
	
	else:
		page         = int(request.values.get('page',1)) #default page 1
		limit        = int(request.values.get('limit', 50)) 

	offset  = int((page-1)*limit)
	# member_types = MMemberType().get_member_type_approved(society_id)  
	data    = Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type)    
	for index,value in enumerate(data) :
		if index == 0:
			if btn_page == "Search" and len(value) == 0 :
				flash("User not found","errorMsg")
				return redirect(url_for('backoffice.ExpiredMembers',society_id=society_id,society_key=society_key))
			elif len(value) == 0:
				flash("There is no terminated members.","errorMsg")
				return render_template('back_office/expired_members.html',society_id=society_id,society_key=society_key) 
			else:
				data = value
		if index == 1 :
			total_count = value[0]
			total       = total_count['count(user_id)'] 
	return render_template('back_office/expired_members.html',user_profile=data,max_date=max_date,offset=offset,page=page,total=int(total),limit=limit,search_data=search_data,filter_visible=filter_visible,society_id=society_id,society_key=society_key,btn_page=btn_page)

@app.route('/search_member_for_expire/<society_id>/<society_key>', methods = ["GET", "POST"])
def search_member_for_expire(society_id,society_key):
	if request.method == 'POST':
		search_data = request.form['search_value']
		search_data = search_data.strip()
		if "-" in search_data:
			searchData = search_data.split("-")
			searchUser = searchData[0]+"|"+searchData[1]
		elif " " in search_data:    
			searchData = search_data.split(" ")
			searchUser = searchData[0]+"|"+searchData[1]
		else:
			searchUser = search_data
		members     = Users().usp_search_all_members(searchUser,society_id)
		if members is None:
			msg = "Member Not Found"
			return render_template('back_office/bo_search_members_table.html',members = members,msg=msg,society_id=society_id,society_key=society_key)
		else:
			return render_template('back_office/bo_search_members_table.html',members = members,society_id=society_id,society_key=society_key)

@app.route('/make_expired/<society_id>/<society_key>', methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def MakeExpired(society_id,society_key):
	boadmindata = Auth.bouser(society_id)
	if boadmindata:
		expired_by_user_id = boadmindata['user_id']
	expired_by_date     = datetime.now()
	user_id             = request.form['user_id']
	remarks             = request.form['remarks'] or "Deceased Member"
	societyData         = Auth.getSociety(society_id)
	user_data           = Users().get_member(user_id)
	prev_member_type_id = user_data.member_type_id
	full_name           = user_data.full_name
	prefix              = user_data.prefix
	name                = prefix + " " + full_name
	status_id           = societyData['ms_expired_mem_status_id']
	member_type_id      = Helper.ExpiredMemberId
	data={'status_id':status_id, 'member_type_id':member_type_id,'prev_member_type_id':prev_member_type_id,'expired_by_user_id':expired_by_user_id,'expired_by_date':expired_by_date,'expired_remarks':remarks,'updated_at':datetime.now()}
	result              = Users().update_member(user_id,data)
	status              = "Deceased Member"
	user_logs_data = {'society_id':society_id,'user_id' : user_id,'status_id': status_id,'status':status,'member_type_id':member_type_id,'created_at':datetime.now()}
	UserStatusLogs().insert_status(user_logs_data)
	flash("Member "+ name +" has been marked as terminated","successMsg")
	if result:
		msg="success"
		status=1
	else:
		msg="faild"
		status=1
	return jsonify(status=status,msg=msg)


####################Expired Members End....###################
################### Change associate to Life Member start ###################
@app.route('/waiting_for_life_member_page/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def WatingLifeMembersPage(society_id,society_key):
	societyData          = Auth.getSociety(society_id)
	status_id            = societyData['ms_approved_status_id']
	btn_page             = request.values.get('form_submit',None)
	user_id              = None
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	search_member_type   = request.values.get('search_member_type',None) or None
	filter_visible       = request.values.get('filter_visible',None)
	from_memnos          = request.values.get('from_memno',None) or None
	end_memnos           = request.values.get('end_memno',None) or None
	approved_from        = request.values.get('approved_from',None) or None
	approved_to          = request.values.get('approved_to',None) or None
	order_type           = request.values.get('order_type',"desc") or None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None

	if from_memnos:
		from_memno = ''.join([i for i in from_memnos if  i.isdigit()])
	else:
		from_memno = None

	if end_memnos:
		end_memno = ''.join([i for i in end_memnos if  i.isdigit()])
	else:
		end_memno = None
	member_type_id      = Helper.AssociateMemberId
	attach_type_id      = Helper.FellowshipAttachId1.get(society_key,None)
	#passing to tempalte for set filter form values
	search_data          = {
		'name'           : search_name,
		'email'          : search_email,
		'mobile'         : search_mobile,
		'member_type'    : search_member_type,
		'from_memno'     : from_memnos,
		'end_memno'      : end_memnos,
		'approved_from'  : approved_from,
		'approved_to'    : approved_to,
		'order_type'     : order_type,
		'sort_by'        : sort_by
	}
	if btn_page =="Search" :
		page   = 1
		limit  = 50
		filter_visible = 1
	else:
		page         = int(request.values.get('page',1)) #default page 1
		limit        = int(request.values.get('limit', 50))
	offset  = int((page-1)*limit)
	data    = Users().usp_mem_converting_assmem_lifemem(society_id,member_type_id,attach_type_id,status_id,offset,limit)    
	for index,value in enumerate(data) :
		if index == 0:
			if btn_page == "Search" and len(value) == 0 :
				flash("User not found","errorMsg")
				return redirect(url_for('backoffice.MembersPage',society_id=society_id,society_key=society_key))
			elif len(value) == 0:
				flash("There is no members awaiting for life member approvel","errorMsg")
				return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
			else:
				data = value
		if index == 1 :
			total_count = value[0]
			total       = total_count['count(u.user_id)']
	member_types = MMemberType().get_member_type_approved(society_id)
	return render_template('back_office/bo_approved_awaiting_life_member.html',user_profile=data,offset=offset,page=page,total=int(total),limit=limit,search_data=search_data,filter_visible=filter_visible,society_id=society_id,society_key=society_key,btn_page=btn_page,member_types=member_types)
	 
			


@app.route('/view_life_member_verification/<user_id>/<int:status_id>/<society_id>/<society_key>', methods = ["GET"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ViewLifeMemberVerification(user_id,status_id,society_id,society_key):
	user_id     = unquote(user_id)
	try:
		user_id     = int(Cryptography.decrypt(user_id))
	except:
		flash("Invalid URL","errorMsg")
		return render_template('back_office/display_msg.html',society_id=society_id,society_key=society_key) 
	societyData          = Auth.getSociety(society_id)
	page                 = int(request.values.get('page',1)) #default page 1   
	limit                = int(request.values.get('limit', 10)) #default page size 10    
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None
	order_type           = request.values.get('order_type',"desc") or None
	offset               = int((page-1)*limit)
	search_member_type   = None
	from_memno           = None
	end_memno            = None
	approved_from        = None
	approved_to          = None
	
	data                 = Users().usp_get_members(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type)
	for index,value in enumerate(data):
		if index == 0:
			userData = value[0]
		if index == 2:
			user_profile = value[0] 
		if index == 3:
			user_qualification = value
		if index == 4:
			user_work = value
		if index == 5:
			user_attachments = value
		if index == 6:
			prosec = value
		if index == 9:
			user_other_society = value
		if index == 10:
			user_training = value
	
	member_type         = MMemberType().get_member_type_approved(society_id)
	if  int(society_id)==1 or int(society_id) == 9:
		attach_type_id      = Helper.FellowshipAttachId1.get(society_key,None)
		attach_images       = MAttachmentType().get_fellowship_attach_id(attach_type_id,user_id,society_id)
	else:
		attach_images=None  
	payment_method      = user_profile['payment_method']
	if payment_method is None:
		pay_method = None
	else: 
		pay_method = urllib.parse.unquote(payment_method)
	encrypt_user_id = Cryptography.encrypt(int(user_id))
	return render_template('back_office/bo_view_life_member_approvel.html',user_id=user_id,encrypt_user_id=encrypt_user_id,member=userData,datas=user_qualification,data=user_work,user=user_profile,image=user_attachments,prosec_data=prosec,member_type=member_type,pay_method=pay_method,society_id=society_id,society_key=society_key,societyData=societyData,user_other_society=user_other_society,user_training=user_training,attach_images=attach_images)

@app.route('/approved_rejected_life_member/<user_id>/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ApprovedRejectedLifeMember(user_id,society_id,society_key):
	user_id     = unquote(user_id)
	user_id     = int(Cryptography.decrypt(user_id))
	societyData = Auth.getSociety(society_id)
	if request.method == "POST":
		status              = request.values["approved_rejected"]
		remarks             = request.values["remarks"]
		prev_member_type    = request.values["prev_member_type"]
		status_db           = "Approved. Membership number generated"
		status_id_1         = MStatus().get_status_id_from_display_name(status_db,society_id)
		status_id           = status_id_1['status_id']
		if status == "Approve":
			userData       = Users().get_member(user_id)
			membership_no  = userData.membership_no
			member_type_id = userData.member_type_id
			prev_member_type_id = member_type_id
			is_valid = True
			mem_no = ""
			if member_type_id == Helper.AssociateMemberId:
				Str = membership_no
				l = len(Str) 
				membership_no  = Str[:l-1]
				mem_no=membership_no
				member_type_id = 1          
			data = {'membership_no':mem_no,'member_type_id':member_type_id,'prev_member_type_id':prev_member_type_id,'status_id':status_id,'updated_at': datetime.now()}
			Users().update_member(user_id,data)
			userData     = Users().get_member(user_id)
			member_type_id= userData.member_type_id
			status_id = userData.status_id
			status = "Approve"
			remarks = "changed_member_type"
			user_logs_data = {'society_id':society_id,'user_id' : user_id,'status_id': status_id,'status':status,'member_type_id':member_type_id,'remarks':remarks,'created_at':datetime.now()}
			UserStatusLogs().insert_status(user_logs_data)
			flash('Updated successfully','successMsg')
			return redirect (url_for('backoffice.ViewApproveChangesMail',user_id=user_id,society_id=society_id,society_key=society_key,prev_member_type=prev_member_type))
		elif status == "Delete" :
			attach_id       = request.form['attach_id']
			attach_type_id  = request.form['attach_type_id']
			societyData     = Auth.getSociety(society_id)
			ua              = UserAttachments().get_user_attach(attach_id,attach_type_id)
			if ua is None:
				data = {'msg':'Deleted','status' : 1}
			else:
				filepath        = ua['attach_path']
				filename        = ua['attach_file_name']
				foldername      = filepath+ "/"+filename
				foldername      = foldername.replace(societyData['aws_url'], "")
				s3              = boto3.resource("s3",aws_access_key_id='AKIAILLDAQ7NFUMVOYLQ',aws_secret_access_key='EEudWCsWeCIt/J9/z5m5htmUdGFJNzWFPvNQBIp/')
				response        =  s3.Object(societyData['aws_bucket'], foldername).delete()
				UserAttachments().delete_image(attach_id,attach_type_id)
				data  = {'msg':'Deleted','status' : 1}
			return redirect (url_for('backoffice.WatingLifeMembersPage',society_id=society_id,society_key=society_key))
		else:
			remarks = remarks
			data = {'status_id':status_id,'rejected_for_life_membership':remarks,'updated_at': datetime.now()}
			Users().update_member(user_id,data)
			attach_type_id      = Helper.FellowshipAttachId1.get(society_key,None)
			UserAttachments().update_confirm_date(user_id,attach_type_id)
			flash('Rejected successfully','successMsg')
			return redirect(url_for('backoffice.ViewRejectMail',user_id=user_id,status_id=status_id,society_id=society_id,society_key=society_key,prev_member_type=prev_member_type))


	else:
		flash("Please, Try again.","errorMsg")
		return redirect (url_for('backoffice.getLogin',society_id=society_id,society_key=society_key))

@app.route('/view_approve_changes_mail/<user_id>/<society_id>/<society_key>/<prev_member_type>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ViewApproveChangesMail(user_id,society_id,society_key,prev_member_type):
	prev_member_type = unquote(prev_member_type)
	user_data        = Users().get_member(user_id)
	societyData      = Auth.getSociety(society_id)
	user             = Users().usp_approved_mail_data(user_id,society_id)
	user_profile     = user[0]
	template_name    = "changed_member_type"
	mailData         = MembershipMailTemplates().get_mail_template(society_id,template_name) 
	society  = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail']
	}
	s_data = {
		'mail_content' : mailData.subject,
		'userData'     : user_profile,
		'society'      : society
	}
	m_data = {
		'mail_content' : mailData.mail_content,
		'prev_member_type': prev_member_type,
		'userData'     : user_profile,
		'society'      : society
	}
	subject         = Helper.convert_html_for_mail_screen(s_data)
	mail_content    = Helper.convert_html_for_mail_screen(m_data)
	encrypt_user_id = Cryptography.encrypt(int(user_id))
	return render_template('back_office/member_type_change_mail_view.html',encrypt_user_id=encrypt_user_id,users=user_profile,mail_content=mail_content,subject=subject,template_name=template_name,society_id=society_id,society_key=society_key,prev_member_type=prev_member_type,societyData=societyData)

@app.route('/view_reject_mail/<user_id>/<status_id>/<society_id>/<society_key>/<prev_member_type>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ViewRejectMail(user_id,status_id,society_id,society_key,prev_member_type):
	user_data        = Users().get_member(user_id)
	societyData      = Auth.getSociety(society_id)
	user             = Users().usp_approved_mail_data(user_id,society_id)
	user_profile     = user[0]
	template_name    = "rejected_change_life_member"
	mailData         = MembershipMailTemplates().get_mail_template(society_id,template_name) 
	society  = {
		'society_id'          : society_id,
		'society_key'         : society_key,
		'society_name'        : societyData['society_intial'],
		'support_mail'        : societyData['e_support_mail']
	}
	s_data = {
		'mail_content' : mailData.subject,
		'userData'     : user_profile,
		'society'      : society
	}
	m_data = {
		
		'mail_content' : mailData.mail_content,
		'userData'     : user_profile,
		'society'      : society
	}
	subject         = Helper.convert_html_for_mail_screen(s_data)
	mail_content    = Helper.convert_html_for_mail_screen(m_data)
	encrypt_user_id = Cryptography.encrypt(int(user_id))
	
	return render_template('back_office/member_type_change_mail_view.html',encrypt_user_id=encrypt_user_id,users=user_profile,mail_content=mail_content,societyData=societyData,template_name=template_name,subject=subject,society_id=society_id,society_key=society_key,prev_member_type=prev_member_type)
################### Change associate to Life Member end ################### 

################### Proposer/seconder Search ---- Start ##################
@app.route('/search_prosec_all/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def SearchProsecAll(society_id,society_key):
	societyData               = Auth.getSociety(society_id)
	return render_template('back_office/bo_search_all_members.html',society_id=society_id,society_key=society_key)

@app.route('/post_search_prosec_all/<society_id>/<society_key>', methods = ["GET", "POST"])
def PostSearchProsecAll(society_id,society_key):
	members     = None
	msg         = None
	if request.method == 'POST':
		search_data = request.values['search_value']
		search_data = search_data.strip()
		if "-" in search_data:
			searchData = search_data.split("-")
			searchUser = searchData[0]+"|"+searchData[1]## regex method used for mysql
		elif " " in search_data:    
			searchData = search_data.split(" ")
			searchUser = searchData[0]+"|"+searchData[1]## regex method used for mysql
		else:
			searchUser = search_data
		members     = Users().ups_search_prosec_for_bo(searchUser,society_id)
		if members is None:
			msg = "Member Not Found"
	return render_template('back_office/bo_search_members_for_prosec.html',members = members,msg=msg,society_id=society_id,society_key=society_key)

@app.route('/view_single_user/<society_id>/<society_key>/<user_id>', methods = ["GET", "POST"])
def ViewSingleUser(society_id,society_key,user_id):
	msg                 = None
	get_prosec_data     = Reference().get_all_prosec_by_reference(user_id,society_id)
	members             = get_prosec_data[0]
	status              = get_prosec_data[1]     
	get_member          = Users().get_member(user_id)
	if members is None:
		msg = "Record not found for this members"
	return render_template('back_office/bo_single_users_prosec_table.html',members = members,status=status,msg=msg,user=get_member,society_id=society_id,society_key=society_key)
	
@app.route('/view_prosec_status/<society_id>/<society_key>', methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def ViewProsecStatus(society_id,society_key):
	dt  = datetime.now().date()
	msg = None
	societyData    = Society().getSociety(society_id,society_key)
	view_prosec_data    = Users().usp_view_prosec_status(society_id)
	if view_prosec_data is None:
		msg = "Record not found"
	return render_template('back_office/email/view_prosec_status.html',view=view_prosec_data,dt=dt,society=societyData,society_id=society_id,society_key=society_key,msg=msg)
	
####################Proposer/seconder Search ---- end #################

####################Search All Members Non Members ---- start #################

@app.route('/search_all_members_nonmembers/<society_id>/<society_key>', methods = ["GET", "POST"])
def SearchAllMembersNonMembers(society_id,society_key):
	societyData               = Auth.getSociety(society_id)
	member_types              = MMemberType().get_all_member_types(society_id)
	return render_template('back_office/bo_search_all_members_nonmembers.html',member_types=member_types,society_id=society_id,society_key=society_key)


@app.route('/post_search_all_members_non_members/<society_id>/<society_key>', methods = ["GET", "POST"])
def PostSearchallMembersNonmembers(society_id,society_key):
	members     = None
	msg         = None
	member_types = None
	if request.method == 'POST':
		mem_type_id = request.values['search_member_type'] or None
		if mem_type_id == "0":
			member_types = MMemberType().get_member_type_approved(society_id)
		elif mem_type_id == "1":
			member_types = MMemberType().get_all_member_types(society_id)
		else:
			mem_type_id = mem_type_id
		if  member_types:
			member_type_ids=[]
			for i in member_types:
				member_type_ids.append(i['member_type_id'])
			mem_type_id=member_type_ids
			mem_type_id = ','.join(str(x) for x in mem_type_id)
		else:
			pass
		search_data = request.values['search_value']
		search_data = search_data.strip()
		if "-" in search_data:
			searchData = search_data.split("-")
			searchUser = searchData[0]+"|"+searchData[1]## regex method used for mysql
		elif " " in search_data:    
			searchData = search_data.split(" ")
			searchUser = searchData[0]+"|"+searchData[1]## regex method used for mysql
		else:
			searchUser = search_data
		members     = Users().ups_search_all_members_nonmembers(searchUser,society_id,mem_type_id)
		if members is None:
			msg = "Member Not Found"
	return render_template('back_office/bo_search_all_members_nonmembers_table.html',members = members,msg=msg,society_id=society_id,society_key=society_key)
	
####################Search All Members Non Members ---- start #################


@app.route('/dashboard_count/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def DashboardCount(society_id,society_key):
	societyData               = Auth.getSociety(society_id)
	users                     = Users().usp_dashboard_count(society_id)
	total_count               = users[0]
	member_type_count         = users[1]
	incomplete_mem            = users[2]
	waiting_for_approvel      = users[3]
	waiting_proposer_seconder = users[4]
	waiting_for_payment       = users[5]
	rejected_members          = users[6]
	non_members               = users[7]
	ratification              = users[8]
	total_ratified_count      = users[9]
	total_non_ratified_count  = users[10]
	return render_template('back_office/bo_dashboard.html',society_id=society_id,society_key=society_key,total_count=total_count,member_type_count=member_type_count,incomplete_mem=incomplete_mem,waiting_for_approvel=waiting_for_approvel,waiting_proposer_seconder=waiting_proposer_seconder,waiting_for_payment=waiting_for_payment,rejected_members=rejected_members,non_members=non_members,ratification=ratification,total_ratified_count=total_ratified_count,total_non_ratified_count=total_non_ratified_count)
	
@app.route('/kjo_journal/<society_id>/<society_key>',methods = ["GET", "POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def KJOJournal(society_id,society_key):
	societyData          = Auth.getSociety(society_id)
	status_id            = societyData['ms_approved_status_id']
	journal_count        = Users().get_kjo_count(society_id,status_id)
	return render_template('back_office/kjo_journal.html',society_id=society_id,society_key=society_key,journal_count=journal_count)

@app.route('/kjo_journal_table/<society_id>/<society_key>',methods = ["GET", "POST"])
def KJOJournalTable(society_id,society_key):
	societyData          = Auth.getSociety(society_id)
	e_journal_opt_in     = request.values.get('e_journal_opt_in',None) or None  
	status_id            = societyData['ms_approved_status_id']
	btn_page             = request.values.get('export_button',None)
	user_id              = None
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	filter_visible       = request.values.get('filter_visible',None)
	from_memnos          = request.values.get('from_memno',None) or None
	end_memnos           = request.values.get('end_memno',None) or None
	order_type           = request.values.get('order_type',"desc") or None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None

	if from_memnos:
		from_memno = ''.join([i for i in from_memnos if  i.isdigit()])
	else:
		from_memno = None

	if end_memnos:
		end_memno = ''.join([i for i in end_memnos if  i.isdigit()])
	else:
		end_memno = None

	#passing to tempalte for set filter form values
	search_data          = {
		'name'           : search_name,
		'email'          : search_email,
		'mobile'         : search_mobile,
		'from_memno'     : from_memnos,
		'end_memno'      : end_memnos,
		'order_type'     : order_type,
		'sort_by'        : sort_by
	}
	is_export = False

	if btn_page == "Export Members Records":
		is_export            = True
		page                 = 1
		limit                = 5000000
		search_name          =  None
		search_email         =  None
		search_mobile        =  None
		search_member_type   =  None
		search_membership_no =  None
	elif btn_page =="Search" :
		page   = 1
		limit  = 2000
		filter_visible = 1
	else:
		page         = int(request.values.get('page',1)) #default page 1
		limit        = int(request.values.get('limit', 2000)) 

	offset  = int((page-1)*limit)
	data    = Users().usp_get_kjo_journal(search_name,search_email,search_mobile,status_id,offset,limit,from_memno,end_memno,e_journal_opt_in,society_id,sort_by,order_type)    
	for index,value in enumerate(data) :
		# print(value)
		if index == 0:
			if btn_page == "Search" and len(value) == 0 :
				data_1 = {"status": 2}
			elif len(value) == 0:
				data_1 = {"status": 2} 
			else:
				data = value
				html_data = render_template('back_office/kjo_journal_table.html',user_profile=data,offset=offset,societyData=societyData,page=page,limit=limit,search_data=search_data,filter_visible=filter_visible,society_id=society_id,society_key=society_key,btn_page=btn_page,e_journal_opt_in=e_journal_opt_in)
				data_1 = {"status": 1,"html_data":html_data}
		
		if index == 1 :
			total_count = value[0]
			total       = total_count['count(user_id)']     
	
	return json.dumps(data_1)



@app.route('/change_journal_type/<society_id>/<society_key>',methods = ["GET", "POST"])
def ChangeJournalType(society_id,society_key):
	user_id             = request.values.get('user_id')
	update_journal      = request.values.get('update_journal')
	data_1 = {'e_journal_opt_in':update_journal, 'updated_at': datetime.now()}
	Users().update_member(user_id,data_1)
	data = {"status": 1}
	return json.dumps(data)
	
################### YOSI Mentors Start.....###################

@app.route('/yosi_mentors/<society_id>/<society_key>', methods = ["GET","POST"])
@RouteGroup.bo_login_required
@RouteGroup.society_required
def YOSIMentors(society_id,society_key):
	societyData          = Auth.getSociety(society_id)
	max_date             = datetime.now()
	status_id            = societyData['ms_approved_status_id']
	btn_page             = request.values.get('form_submit',None)
	user_id              = None
	search_name          = request.values.get('search_name',None) or None
	search_email         = request.values.get('search_email',None) or None
	search_mobile        = request.values.get('search_mobile',None) or None
	search_member_type   = request.values.get('search_member_type',None) or None
	filter_visible       = request.values.get('filter_visible',None)
	from_memnos          = request.values.get('from_memno',None) or None
	end_memnos           = request.values.get('end_memno',None) or None
	approved_from        = request.values.get('approved_from',None) or None
	approved_to          = request.values.get('approved_to',None) or None
	order_type           = request.values.get('order_type',"asc") or None
	sort_by              = request.values.get('sort_by',"membership_no_only") or None

	if from_memnos:
		from_memno = ''.join([i for i in from_memnos if  i.isdigit()])
	else:
		from_memno = None

	if end_memnos:
		end_memno = ''.join([i for i in end_memnos if  i.isdigit()])
	else:
		end_memno = None

	#passing to tempalte for set filter form values
	search_data          = {
		'name'           : search_name,
		'email'          : search_email,
		'mobile'         : search_mobile,
		'member_type'    : search_member_type,
		'from_memno'     : from_memnos,
		'end_memno'      : end_memnos,
		'approved_from'  : approved_from,
		'approved_to'    : approved_to,
		'order_type'     : order_type,
		'sort_by'        : sort_by
	}
	
	
	if btn_page =="Search" :
		page   = 1
		limit  = 50
		filter_visible = 1
	
	else:
		page         = int(request.values.get('page',1)) #default page 1
		limit        = int(request.values.get('limit', 50)) 

	offset  = int((page-1)*limit)
	# member_types = MMemberType().get_member_type_approved(society_id)  
	data    = Users().usp_get_yosi_mentors(search_name,search_email,search_mobile,status_id,offset,limit,user_id,search_member_type,from_memno,end_memno,approved_from,approved_to,society_id,sort_by,order_type)    
	for index,value in enumerate(data) :
		if index == 0:
			if btn_page == "Search" and len(value) == 0 :
				flash("User not found","errorMsg")
				return redirect(url_for('backoffice.YOSIMentors',society_id=society_id,society_key=society_key))
			elif len(value) == 0:
				flash("There is no members age greater than 40.","errorMsg")
				return render_template('back_office/yosi_mentors.html',society_id=society_id,society_key=society_key) 
			else:
				data = value
		if index == 1 :
			total_count = value[0]
			total       = total_count['count(user_id)'] 
	return render_template('back_office/yosi_mentors.html',user_profile=data,max_date=max_date,offset=offset,page=page,total=int(total),limit=limit,search_data=search_data,filter_visible=filter_visible,society_id=society_id,society_key=society_key,btn_page=btn_page)

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