def create_customer(data):
	is_completed = False
	try:
	    if isinstance(data, unicode): data = get_json(data)

	    print_msg("Create Customer", data.get("P_USER_NAME"))
	    
	    validate_request["create_customer"](data)	    
	    
	    # Create new customecreate_new_siter document
	    customer = frappe.new_doc('Customer')
	    customer.customer_name = data.get('P_CUST_NAME')
	    customer.customer_type = 'Company'
	    customer.customer_group = 'Commercial'
	    customer.territory = 'All Territories'
	    customer.cpr_cr = data.get("P_CPR_CR")
	    customer.is_active = 0
	    customer.domain_name = data.get("P_USER_NAME")
	    customer.save(ignore_permissions=True)
	    # create new contact
	    create_contact(customer, data)
	    # create new site {deactivated}
	    admin_pwd = create_new_site(data, customer.name)
	    notify_user("create_customer", data)
	    create_request_log("02", "Success", "create_customer", data)
	    is_completed = True
	except Exception, e:
		frappe.db.rollback()
		error = "%s\n%s"%(e, traceback.format_exc())
		print error
		create_request_log("01", str(e), "create_customer", data, error)
def delete_customer(args):
	is_completed = False
	try:
		if isinstance(args, unicode): args = get_json(args)
		
		print_msg("Delete Customer", args.get("P_USER_NAME"))
		validate_request["delete_customer"](args)
		
		domain_name = args.get("P_USER_NAME")
		site = frappe.get_doc("Sites", domain_name)
		if site.customer:
			if not site.is_active:
				# drop-site
				cmd = {
					"../../bin/bench drop-site --root-password {0} {1}".format(get_mariadb_root_pwd(), domain_name): "Deleting Site - {0}".format(domain_name)
					}
				exec_cmd(cmd, cwd=get_target_banch(), trxn_no=args.get("P_TRXN_NO"))

				notify_user("delete_customer", args)
				# delete customer and site
				frappe.delete_doc("Sites", site.name, ignore_permissions=True)
				frappe.delete_doc("Customer", site.customer, ignore_permissions=True)

				create_request_log("02", "Success", "delete_customer", args)
			else:
				raise Exception("Can not delete the Customer, Please first deactivate the site : %s"%(site.name))
		else:
			raise Exception("Unable to find site customer, Please contact Administrator")
		is_completed = True
	except Exception, e:
		import traceback
		frappe.db.rollback()
		error = "%s\n%s"%(e, traceback.format_exc())
		print error
		create_request_log("01", str(e), "delete_customer", args, error)
def restart_service(args, parent_service=None):
	# update customer master, is_active
	is_completed = False
	domain = args.get("P_USER_NAME")
	try:
		if isinstance(args, unicode): args = get_json(args)
		
		cmd = "restart_service" if not parent_service else parent_service
		print_msg(cmd.upper(), args.get("P_USER_NAME"))
		validate_request[cmd](args)
		
		if is_site_already_exists(domain):
			if not frappe.db.get_value("Sites", domain, "is_active"):
				configure_site(domain, is_disabled=False, trxn_no=args.get("P_TRXN_NO"))
				update_sites_doc(domain, is_active=True)
				update_customer_domain_details(domain, is_active=True)
				notify_user("restart_service", args)
				create_request_log("02", "Success", "restart_service", args)
			else:
				frappe.throw("Requested site (%s) is already active"%(domain))
		else:
			frappe.throw("Requested site (%s) does not exists"%(domain))
		is_completed = True
	except Exception, e:
		frappe.db.rollback()
		error = "%s\n%s"%(e, traceback.format_exc())
		print error
		create_request_log("01", str(e), "restart_service", args, error)
def disconnect_service(args, parent_service=None):
	# update customer master, is_active
	is_completed = False
	try:
		if isinstance(args, unicode): args = get_json(args)
		
		cmd = "disconnect_service" if not parent_service else parent_service
		print_msg(cmd.upper(), args.get("P_USER_NAME"))
		
		validate_request[cmd](args)
		
		if is_site_already_exists(args.get("P_USER_NAME")):
			if frappe.db.get_value("Sites", args.get("P_USER_NAME"),"is_active"):
				configure_site(args.get("P_USER_NAME"), is_disabled=True, trxn_no=args.get("P_TRXN_NO"))
				update_sites_doc(args.get("P_USER_NAME"), is_active=False)
				update_customer_domain_details(args.get("P_USER_NAME"), is_active=False)
				# check if any site is linked with package if not then update is_assigned value of package
				if not frappe.db.get_value("Sites",{"package_id":args.get("P_PACKAGE_ID")},"name"):
					frappe.db.set_value("Packages", args.get("P_PACKAGE_ID"), "is_assigned", 0)
				notify_user("disconnect_service", args)
				create_request_log("02", "Success", "disconnect_service", args)
			else:
				frappe.throw("Requested site (%s) is already disconnected"%(args.get("P_USER_NAME")))
		else:
			frappe.throw("Requested site (%s) does not exists"%(args.get("P_USER_NAME")))
		is_completed = True
	except Exception, e:
		frappe.db.rollback()
		error = "%s\n%s"%(e, traceback.format_exc())
		print error
		create_request_log("01", str(e), "disconnect_service", args, error)
def create_new_site(args, customer):
	"""Create new site, create site doc"""
	if isinstance(args, unicode): args = get_json(args)
	if not is_site_already_exists(args.get("P_USER_NAME")):
		pwd = generate_random_password()
		create_site(args.get("P_USER_NAME"), args.get("P_AUTHENTICATE"), pwd, args.get("P_TRXN_NO"), is_active=False)
		create_sites_doc(args, customer, pwd)
		return pwd
	else:
		raise Exception("Requested site (%s) already exist"%(args.get("P_USER_NAME")))
def create_service(args):
	"""Activate newly created service"""
	# update customer master - is_active and CPR CR, current package id
	is_completed = False
	try:
		if isinstance(args, unicode): args = get_json(args)
		
		print_msg("Create Service", args.get("P_USER_NAME"))
		validate_request["create_service"](args)
		
		if is_site_already_exists(args.get("P_USER_NAME")):
			result = {}
			if frappe.db.get_value("Sites", args.get("P_USER_NAME"),"is_active"):
				result = update_client_instance_package_details(args, is_active=True)
			else:
				configure_site(args.get("P_USER_NAME"), is_disabled=False, trxn_no=args.get("P_TRXN_NO"))
				update_sites_doc(args.get("P_USER_NAME"), is_active=True)
				# Allowing the supervisor and nginx to reload
				import time
				time.sleep(10)
				result = update_client_instance_package_details(args, is_active=True)

			if result.get("X_ERROR_CODE") == "02":
				update_customer_package_details(args)
				notify_user("create_service", args, password=get_admin_pwd(args.get("P_USER_NAME")))
				create_request_log("02", "Success", "create_service", args)
			else:
				configure_site(args.get("P_USER_NAME"), is_disabled=True)
				update_sites_doc(args.get("P_USER_NAME"), is_active=False)
				raise Exception("Error : ", result.get("X_ERROR_DESC"))
		else:
			raise Exception("Requested site (%s) does not exist"%(args.get("P_USER_NAME")))
		is_completed = True
	except Exception, e:
		frappe.db.rollback()
		print e
		error = "%s\n%s"%(e, traceback.format_exc())
		print error
		create_request_log("01", str(e), "create_service", args, error)
def control_action(args):
	args = get_json(args)
	if args.get("P_CREDIT_ACTION") in ["TOS","SUSPEND"]:
		return disconnect_service(args, parent_service="control_action");
	else:
		return restart_service(args, parent_service="control_action")