MediPro - Context handler

PHOTO EMBED

Wed Oct 09 2024 15:18:23 GMT+0000 (Coordinated Universal Time)

Saved by @usman13

//////////////////////////////// Fetching dymamic messages Start ///////////////////////////////////////////////////////////
messages = zoho.crm.getRecords("Chatbot_Messages");
// info messages;
for each  dynamic_message in messages
{
	if(dynamic_message.get("Type") == "Welcome")
	{
		welcome_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "HIPAA Disclaimer")
	{
		hippa_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Chat End")
	{
		chat_end_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Departments")
	{
		departments_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Issue")
	{
		issue_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Connect to Agent")
	{
		connect_to_agent_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "User Not Identified")
	{
		user_not_identified_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Other Email")
	{
		other_mail_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Select Product")
	{
		select_product_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "No Support Agreement")
	{
		no_support_agreement_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Category")
	{
		category_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Read Article")
	{
		read_article_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Article Found")
	{
		article_found_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Issue Resolved with Article")
	{
		issue_resolved_with_article_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Tallk to Agent")
	{
		talk_to_agent_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Thank You for Information")
	{
		thank_you_for_information_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Need Further Help")
	{
		need_further_help_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Thank You")
	{
		thank_you_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Ticket Created for Team")
	{
		ticket_created_for_team_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Ticket Created for Reference")
	{
		ticket_created_for_reference_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Issue Resolved")
	{
		issue_resolved_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "What Can I Help You")
	{
		how_can_i_help_you_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Operator Busy")
	{
		operator_busy_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Classification")
	{
		classification_message = dynamic_message.get("Message");
	}
	else if(dynamic_message.get("Type") == "Ticket Not Created")
	{
		ticket_not_created_message = dynamic_message.get("Message");
	}
}
//////////////////////////////// Fetching dymamic messages Ends ///////////////////////////////////////////////////////////
response = Map();
response.put("action","context");
response.put("context_id",context_id);
/////////////////////////Checking and Creating Sessions//////////////////////////////////////////////
departmentId = "810990000000014005";
deskDepartmentId = "206833000002271242";
data_mp = zoho.salesiq.visitorsession.get("mediproinc","data_mp","zoho_salesiq").get("data_mp");
if(!isNull(data_mp))
{
	department = data_mp.get("department");
	if(department == "Sales")
	{
		//sales
		departmentId = "810990000000014003";
		deskDepartmentId = "206833000001963132";
	}
	else if(department == "Client Care")
	{
		//client care		
		departmentId = "810990000000014005";
		deskDepartmentId = "206833000002271242";
	}
	accountID = data_mp.get("accountID");
	activeAgreement = data_mp.get("activeAgreement");
}
//////////////////////////////////////////////////////////////////////
if(context_id.equals("verifyContact"))
{
	contactEmail = answers.get("otherEmail").get("text");
	info contactEmail;
	///////////////////////////////////////////////////////////////////
	set_map = Map();
	set_map.put("otherEmail",contactEmail);
	temp_store = zoho.salesiq.visitorsession.set("mediproinc",set_map,"zoho_salesiq");
	info "Storing data = " + temp_store;
	////////////////////////////////////////////////////////
	searchContact = invokeurl
	[
		url :"https://www.zohoapis.com/crm/v3/Contacts/search?criteria=(Email:equals:" + contactEmail + ")"
		type :GET
		connection:"zohocrm"
	];
	// 	info searchContact;
	if(isNull(searchContact))
	{
		// Chat Forward
		response.put("action","forward");
		response.put("department",departmentId);
		response.put("replies",{connect_to_agent_message});
	}
	else
	{
		/////////////// User found ///////////////
		info "Record Found";
		contactDetials = searchContact.get("data").get(0);
		accountID = contactDetials.get("Account_Name").get("id");
		chatBotActions = invokeurl
		[
			url :"https://www.zohoapis.com/crm/v2/functions/erphub_test/actions/execute?auth_type=apikey&zapikey=1003.54e865e56692ea2154455b76012a7b71.1a7eab6552466d5f0187d84f8f1785b0&accountID=" + accountID
			type :POST
		];
		info "From function = " + chatBotActions;
		classifications = chatBotActions.get("details").get("output").get("classifications");
		///////////////////////////////////////////////////
		if(!classifications.isEmpty())
		{
			////////////////////////////////////////////////////////////////////////////////////////
			searchAgreement = invokeurl
			[
				url :"https://www.zohoapis.com/crm/v3/Contracts/search?criteria=((Account:equals:" + accountID + ")and(Status:equals:Active))"
				type :GET
				connection:"zohocrm"
			];
			info "searchAgreement: " + searchAgreement;
			activeAgreement = false;
			if(searchAgreement.size() > 0)
			{
				activeAgreement = true;
			}
			else
			{
				activeAgreement = false;
			}
			/////////////////////////////////////////////////////////////////////
			classification_rep_list = List();
			if(activeAgreement == true)
			{
				classification_rep_list.add(classification_message);
			}
			else
			{
				classification_rep_list.add(no_support_agreement_message);
				classification_rep_list.add(classification_message);
			}
			//////////////////////info show question/////////////////////////////
			response.put("action","context");
			response.put("context_id","clientCare");
			question = {"name":"classification","replies":classification_rep_list,"input":{"type":"select","options":classifications}};
			response.put("questions",{question});
			/////////////////////Create Session//////////////////////////////////
			data_mp = Map();
			data_mp.put("accountID",accountID);
			data_mp.put("activeAgreement",activeAgreement);
			data_mp.put("department","Client Care");
			set_map = Map();
			set_map.put("data_mp",data_mp);
			temp_store = zoho.salesiq.visitorsession.set("mediproinc",set_map,"zoho_salesiq");
			info "Storing data = " + temp_store;
			/////////////////////////////////////////////////////////////////////
		}
		else
		{
			// Chat End
			response.put("action","end");
			response.put("replies",{chat_end_message});
		}
	}
}
///////////////////// Sales Department ////////////////////////////////////
if(context_id.equals("salesIssueType"))
{
	if(!answers.containsKey("whatCanIhelpYouWith"))
	{
		selectedIssueType = answers.get("issueType").get("text");
		///////////////////////////////////////////////////////////////////////////////
		response.put("context_id","salesIssueType");
		question = {"name":"whatCanIhelpYouWith","replies":{how_can_i_help_you_message}};
		response.put("questions",{question});
	}
	else
	{
		selectedIssueType = answers.get("issueType").get("text");
		helpAnswer = answers.get("whatCanIhelpYouWith").get("text");
		leadMap = Map();
		fullName = visitor.get("name");
		if(fullName.contains(" "))
		{
			leadMap.put("First_Name",fullName.getPrefix(" "));
			leadMap.put("Last_Name",fullName.getSuffix(" "));
		}
		else
		{
			leadMap.put("Last_Name",fullName);
		}
		leadMap.put("Company",fullName);
		leadMap.put("Email",visitor.get("email"));
		leadMap.put("Phone",visitor.get("phone"));
		leadMap.put("Lead_Source","Chat");
		leadMap.put("Description",helpAnswer);
		options = Map();
		optionlist = list();
		optionlist.add("workflow");
		options.put("trigger",optionlist);
		leadResponse = zoho.crm.createRecord("leads",leadMap,options,"zohocrm");
		// 		info "Creating lead: " + leadResponse;
		// Chat Forward
		response.put("action","forward");
		response.put("department",departmentId);
		response.put("replies",{connect_to_agent_message});
	}
}
///////////////////// Sales Department End /////////////////////////
///////////////////// Client Care //////////////////////////////
////// User not identified ///////////////
if(context_id.equals("userNotIdentified"))
{
	if(!answers.containsKey("couldNotIdentify"))
	{
		response.put("action","context");
		response.put("context_id","userNotIdentified");
		couldNotIdentify = {"name":"couldNotIdentify","replies":{user_not_identified_message},"input":{"type":"select","options":{"Yes","No"}}};
		response.put("questions",{couldNotIdentify});
	}
	else
	{
		couldNotIdentify = answers.get("couldNotIdentify").get("text");
		if(couldNotIdentify.toString() == "Yes")
		{
			if(!answers.containsKey("otherEmail"))
			{
				response.put("action","context");
				response.put("context_id","verifyContact");
				otherEmail = {"name":"otherEmail","replies":{other_mail_message}};
				response.put("questions",{otherEmail});
			}
		}
		else
		{
			// Chat Forward
			response.put("action","forward");
			response.put("department",departmentId);
			response.put("replies",{connect_to_agent_message});
		}
	}
}
////// User not identified End ///////////////
//////////////////  Client Care /////////////////////
if(context_id.equals("clientCare"))
{
	chatBotActions = invokeurl
	[
		url :"https://www.zohoapis.com/crm/v2/functions/erphub_test/actions/execute?auth_type=apikey&zapikey=1003.54e865e56692ea2154455b76012a7b71.1a7eab6552466d5f0187d84f8f1785b0&accountID=" + accountID
		type :POST
	];
	// 	info "From function = " + chatBotActions;
	classifications = chatBotActions.get("details").get("output").get("classifications");
	classificationsVsCategories = chatBotActions.get("details").get("output").get("classificationsVsCategories");
	catergoriesVsIssueTypes = chatBotActions.get("details").get("output").get("catergoriesVsIssueTypes");
	issueTypeVsrequireInfo = chatBotActions.get("details").get("output").get("issueTypeVsrequireInfo");
	if(answers.containsKey("classification") && !answers.containsKey("category"))
	{
		classification = answers.get("classification").get("text");
		response.put("context_id","clientCare");
		category = {"name":"category","replies":{category_message},"input":{"type":"select","options":classificationsVsCategories.get(classification)}};
		response.put("questions",{category});
	}
	else
	{
		keyCombination_issueType = answers.get("classification").get("text") + "/" + answers.get("category").get("text");
		returnedCategories = catergoriesVsIssueTypes.get(keyCombination_issueType);
		if(!returnedCategories.contains("Empty") && answers.containsKey("classification") && answers.containsKey("category") && !answers.containsKey("issueType"))
		{
			category = answers.get("category").get("text");
			response.put("context_id","clientCare");
			issueType = {"name":"issueType","replies":{issue_message},"input":{"type":"select","options":returnedCategories}};
			response.put("questions",{issueType});
		}
		else
		{
			keyCombination = answers.get("classification").get("text") + "/" + answers.get("category").get("text") + "/" + ifnull(answers.get("issueType"),{"text":"Empty"}).get("text");
			info keyCombination;
			crmRecordId = issueTypeVsrequireInfo.get(keyCombination);
			/////////////////////////////////////////////////////////////////////////////////////////////
			tempStoreMap = Map();
			tempStoreMap.put("crmRecordId",crmRecordId);
			tempStoreMap.put("classification",answers.get("classification").get("text"));
			tempStoreMap.put("category",answers.get("category").get("text"));
			tempStoreMap.put("issueType",ifnull(answers.get("issueType"),{"text":"Empty"}).get("text"));
			storeData = zoho.salesiq.visitorsession.set("mediproinc",tempStoreMap,"zoho_salesiq");
			/////////////////////////////////////////////////////////////////////////////////////////////
			chatBotActionsRecId = invokeurl
			[
				url :"https://www.zohoapis.com/crm/v2/functions/Chatbot_Actions_Using_RecId/actions/execute?auth_type=apikey&zapikey=1003.54e865e56692ea2154455b76012a7b71.1a7eab6552466d5f0187d84f8f1785b0&recId=" + crmRecordId
				type :POST
			];
			requiredInfoType = chatBotActionsRecId.get("details").get("output").get("requiredInfoType");
			///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			Free_Typing_Questions_Instructions = chatBotActionsRecId.get("details").get("output").get("Free_Typing_Questions_Instructions");
			KB_Instruction_Article = chatBotActionsRecId.get("details").get("output").get("KB_Instruction_Article");
			Free_Typing_Formatted_Questions = chatBotActionsRecId.get("details").get("output").get("Free_Typing_Formatted_Questions");
			///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			Multi_Option_Message = chatBotActionsRecId.get("details").get("output").get("Multi_Option_Message");
			Multi_Option_Question = chatBotActionsRecId.get("details").get("output").get("Multi_Option_Question");
			Multiple_Options = chatBotActionsRecId.get("details").get("output").get("Multiple_Options");
			Option_vs_Output_Messages = chatBotActionsRecId.get("details").get("output").get("Option_vs_Output_Messages");
			Option_vs_Output_Actions = chatBotActionsRecId.get("details").get("output").get("Option_vs_Output_Actions");
			Option_vs_Output_Article = chatBotActionsRecId.get("details").get("output").get("Option_vs_Output_Article");
			///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			Output_Message = chatBotActionsRecId.get("details").get("output").get("Output_Message");
			Output_Action = chatBotActionsRecId.get("details").get("output").get("Output_Action");
			KB_Article = chatBotActionsRecId.get("details").get("output").get("KB_Article");
			///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			if(requiredInfoType == "Free Typing Question")
			{
				response.put("action","context");
				response.put("context_id","output");
				////////////////////////////////////////////////
				question_count = 1;
				questions_list = List();
				for each  val in Free_Typing_Formatted_Questions
				{
					replies = Collection();
					if(question_count == 1)
					{
						if(Free_Typing_Questions_Instructions != "-" && Free_Typing_Questions_Instructions != null)
						{
							if(KB_Instruction_Article != null && KB_Instruction_Article != "-")
							{
								replies.insert({"type":"links","text":Free_Typing_Questions_Instructions,"links":{{"url":KB_Instruction_Article,"text":read_article_message}}});
							}
							else
							{
								replies.insert(Free_Typing_Questions_Instructions);
							}
						}
					}
					info val;
					replies.insert(val);
					question = {"name":val,"replies":replies};
					questions_list.add(question);
					////////////////////////////////////////////
					question_count = question_count + 1;
				}
				response.put("questions",questions_list);
			}
			else if(requiredInfoType == "Multi Option Question")
			{
				response.put("action","context");
				response.put("context_id","multi_option_context");
				////////////////////////////////////////////////
				replies = Collection();
				if(!isNull(Multi_Option_Message))
				{
					replies.insert(Multi_Option_Message);
				}
				replies.insert(Multi_Option_Question);
				question = {"name":"multiOptionSelection","replies":replies,"input":{"type":"select","options":Multiple_Options}};
				response.put("questions",{question});
			}
			else if(requiredInfoType == "Article Only")
			{
				replies = Collection();
				KB_Article = ifnull(KB_Article,"https://www.medipro.com/");
				if(Output_Message != "-" && Output_Message != null)
				{
					replies.insert({"type":"links","text":Output_Message,"links":{{"url":KB_Article,"text":read_article_message}}});
				}
				else
				{
					replies.insert({"type":"links","text":article_found_message,"links":{{"url":KB_Article,"text":read_article_message}}});
				}
				response.put("action","end");
				response.put("replies",replies);
			}
		}
	}
}
////////////////////////////////////////////
if(context_id.equals("multi_option_context"))
{
	crmRecordId = zoho.salesiq.visitorsession.get("mediproinc","crmRecordId","zoho_salesiq").get("crmRecordId");
	/////////////////////////////////////////////////////////////////////////////////////////////
	chatBotActionsRecId = invokeurl
	[
		url :"https://www.zohoapis.com/crm/v2/functions/Chatbot_Actions_Using_RecId/actions/execute?auth_type=apikey&zapikey=1003.54e865e56692ea2154455b76012a7b71.1a7eab6552466d5f0187d84f8f1785b0&recId=" + crmRecordId
		type :POST
	];
	requiredInfoType = chatBotActionsRecId.get("details").get("output").get("requiredInfoType");
	Check_Support_Agreement = chatBotActionsRecId.get("details").get("output").get("Check_Support_Agreement");
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	Multi_Option_Message = chatBotActionsRecId.get("details").get("output").get("Multi_Option_Message");
	Multi_Option_Question = chatBotActionsRecId.get("details").get("output").get("Multi_Option_Question");
	Multiple_Options = chatBotActionsRecId.get("details").get("output").get("Multiple_Options");
	Option_vs_Output_Messages = chatBotActionsRecId.get("details").get("output").get("Option_vs_Output_Messages");
	Option_vs_Output_Actions = chatBotActionsRecId.get("details").get("output").get("Option_vs_Output_Actions");
	Option_vs_Output_Article = chatBotActionsRecId.get("details").get("output").get("Option_vs_Output_Article");
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////		
	if(requiredInfoType == "Multi Option Question")
	{
		selectedValue = answers.get("multiOptionSelection").get("text");
		/////////////////////////////////////////////////////////////////////////////////////////////
		tempStoreMap = Map();
		tempStoreMap.put("multiOptionSelection",selectedValue);
		storeData = zoho.salesiq.visitorsession.set("mediproinc",tempStoreMap,"zoho_salesiq");
		/////////////////////////////////////////////////////////////////////////////////////////////
		selectedMessages = ifnull(Option_vs_Output_Messages.get(selectedValue),"-");
		info "Line 463";
		info "selected Messages = " + selectedMessages;
		////////////////////////////////////////////////
		if(selectedMessages.matches("\d+\.") || selectedMessages.contains("?") || selectedMessages.contains(":"))
		{
			response.put("action","context");
			response.put("context_id","output");
			mainQuestion = selectedMessages.getPrefix(":");
			if(mainQuestion == null)
			{
				mainQuestion = selectedMessages;
			}
			subQuestions = selectedMessages.getSuffix(":");
			if(subQuestions != null)
			{
				finalSubQuestion = subQuestions.replaceAll("\d+\.","<q>").replaceFirst("<q>","").toList("<q>");
			}
			////////////////////////////////////////////////
			question_count = 1;
			questions_list = List();
			for each  val in finalSubQuestion
			{
				trimmedQuestion = val.trim();
				replies = Collection();
				if(question_count == 1)
				{
					if(mainQuestion != "-" && mainQuestion != null)
					{
						replies.insert(mainQuestion);
					}
				}
				replies.insert(trimmedQuestion);
				question = {"name":trimmedQuestion,"replies":replies};
				questions_list.add(question);
				////////////////////////////////////////////
				question_count = question_count + 1;
			}
			response.put("questions",questions_list);
		}
		else
		{
			selectedActions = Option_vs_Output_Actions.get(selectedValue);
			selectedArticle = Option_vs_Output_Article.get(selectedValue);
			finalActions = selectedActions;
			finalArticle = ifnull(selectedArticle,"https://www.medipro.com/");
			//////////////////////////////////////////////////////////////////////////////////////////////
			if(activeAgreement == false && Check_Support_Agreement == true)
			{
				finalActions.removeElement("Talk to an Agent");
			}
			//////////////////////////////////////////////////////
			////////////////  Create Ticket //////////////////////////////////////////////////////////
			ticketId = "";
			ticketNumber = "";
			if(finalActions.contains("Open Ticket") || finalActions.contains("Closed Ticket"))
			{
				otherEmail = zoho.salesiq.visitorsession.get("mediproinc","otherEmail","zoho_salesiq").get("otherEmail");
				email = ifnull(otherEmail,visitor.get("email"));
				search_param_map = Map();
				search_param_map.put("email",email);
				Get_Contact = invokeurl
				[
					url :"https://desk.zoho.com/api/v1/contacts/search?"
					type :GET
					parameters:search_param_map
					connection:"zoho_desk"
				];
				// 			info "Searching Customer = "+Get_Contact;
				if(Get_Contact.get("data").size() > 0)
				{
					//// Contact found 
					deskContactID = Get_Contact.get("data").get(0).get("id");
				}
				else
				{
					/// Create Contact
					contactMap = Map();
					fullName = visitor.get("name");
					if(fullName.contains(" "))
					{
						contactMap.put("firstName",fullName.getPrefix(" "));
						contactMap.put("lastName",fullName.getSuffix(" "));
					}
					else
					{
						contactMap.put("lastName",fullName);
					}
					otherEmail = zoho.salesiq.visitorsession.get("mediproinc","otherEmail","zoho_salesiq").get("otherEmail");
					email = ifnull(otherEmail,visitor.get("email"));
					contactMap.put("email",email);
					contactMap.put("phone",visitor.get("phone"));
					creatingDeskContact = invokeurl
					[
						url :"https://desk.zoho.com/api/v1/contacts"
						type :POST
						parameters:contactMap.toString()
						connection:"zoho_desk"
					];
					info "creatingDeskContact = " + creatingDeskContact;
					deskContactID = creatingDeskContact.get("id");
				}
				////////////////////////////////////////////////////////////
				classification = zoho.salesiq.visitorsession.get("mediproinc","classification","zoho_salesiq").get("classification");
				category = zoho.salesiq.visitorsession.get("mediproinc","category","zoho_salesiq").get("category");
				issueType = zoho.salesiq.visitorsession.get("mediproinc","issueType","zoho_salesiq").get("issueType");
				////////////////////////////////////////////////////////////
				//// Creating Ticket
				create_map = Map();
				create_map.put("subject","Ticket submitted by " + visitor.get("name") + " via Chatbot.");
				create_map.put("contactId",deskContactID);
				create_map.put("departmentId",deskDepartmentId);
				create_map.put("channel","Chat");
				create_map.put("description","");
				create_map.put("classification",classification.replaceAll("[\"#%&'+,;<=>\\^`{}|~]",""));
				create_map.put("category",category.replaceAll("[\"#%&'+,;<=>\\^`{}|~]",""));
				if(issueType.toString() != "Empty")
				{
					cf = Map();
					cf.put("cf_issue_type",issueType.replaceAll("[\"#%&'+,;<=>\\^`{}|~]",""));
					create_map.put("cf",cf);
				}
				createTicketResp = invokeurl
				[
					url :"https://desk.zoho.com/api/v1/tickets"
					type :POST
					parameters:create_map + ""
					connection:"zoho_desk"
				];
				info "createTicketResp = " + createTicketResp;
				if(createTicketResp.containsKey("modifiedTime"))
				{
					ticketId = createTicketResp.get("id");
					ticketNumber = createTicketResp.get("ticketNumber");
				}
			}
			/////////////////////////////////////////////////////////////////////////////////////////////
			tempStoreMap = Map();
			tempStoreMap.put("ticketId",ticketId);
			tempStoreMap.put("ticketNumber",ticketNumber);
			tempStoreMap.put("finalActions",finalActions);
			storeData = zoho.salesiq.visitorsession.set("mediproinc",tempStoreMap,"zoho_salesiq");
			/////////////////////////////////////////////////////////////////////////////////////////////
			////////////////// Article - Agent - > True ///////////////////////////////////////////////////////
			if(finalActions.contains("KB Article") && !finalActions.contains("Talk to an Agent") && !finalActions.contains("Open Ticket") && !finalActions.contains("Closed Ticket"))
			{
				replies = Collection();
				if(selectedMessages != "-")
				{
					replies.insert(selectedMessages);
				}
				finalArticle = ifnull(finalArticle,"https://www.medipro.com/");
				if(selectedMessages != "-" && selectedMessages != null)
				{
					replies.insert({"type":"links","text":article_found_message,"links":{{"url":finalArticle,"text":read_article_message}}});
				}
				else
				{
					replies.insert({"type":"links","text":article_found_message,"links":{{"url":finalArticle,"text":read_article_message}}});
				}
				response.put("action","end");
				response.put("replies",replies);
			}
			else if(finalActions.contains("KB Article"))
			{
				response.put("action","context");
				response.put("context_id","issue_resolved_with_kb");
				replies = Collection();
				if(selectedMessages != "-")
				{
					replies.insert(selectedMessages);
				}
				replies.insert({"type":"links","text":article_found_message,"links":{{"url":finalArticle,"text":read_article_message}}});
				replies.insert(issue_resolved_with_article_message);
				question = {"name":"issueResolvedWithKb","replies":replies,"input":{"type":"select","options":{"Yes","No"}}};
				response.put("questions",{question});
			}
			////////////////// Article - > True  | Agent  -> False /////////////////////////////////////////	
			else if(!finalActions.contains("KB Article") && finalActions.contains("Talk to an Agent"))
			{
				response.put("action","context");
				response.put("context_id","talk_to_human");
				replies = Collection();
				if(selectedMessages != "-")
				{
					replies.insert(selectedMessages);
				}
				if(ticketNumber != null && ticketNumber != "")
				{
					ticket_message = ticket_created_for_team_message.getPrefix("{{") + ticketNumber + ticket_created_for_team_message.getSuffix("}}");
					replies.insert(ticket_message);
				}
				replies.insert(talk_to_agent_message);
				question = {"name":"connectTo","replies":replies,"input":{"type":"select","options":{"Yes","No"}}};
				response.put("questions",{question});
			}
			//////////////////  Agent - Article  -> False /////////////////////////////////////////		
			else if(!finalActions.contains("KB Article") && !finalActions.contains("Talk to an Agent"))
			{
				if(ticketId != null)
				{
					//////////////////////////////// Attaching chat Transcript on the Ticket Starts //////////////////////////////////////////
					conversation_id = visitor.get("active_conversation_id");
					param = Map();
					param.put("data","messages");
					param.put("format","pdf");
					export_chat = invokeurl
					[
						url :"https://salesiq.zoho.com/api/v2/mediproinc/conversations/" + conversation_id + "/export"
						type :POST
						parameters:param + ""
						connection:"zoho_salesiq"
					];
					info "Exporting Chat = " + export_chat;
					export_chat.setParamName("file");
					header = Map();
					header.put("Content-Type","multipart/form-data");
					////// attach file to ticket ////
					attach = invokeurl
					[
						url :"https://desk.zoho.com/api/v1/tickets/" + ticketId + "/attachments?isPublic=true"
						type :POST
						headers:header
						files:export_chat
						connection:"zoho_desk"
					];
					//////////////////////////////// Attaching chat Transcript on the Ticket Ends //////////////////////////////////////////
				}
				replies = Collection();
				if(selectedMessages != "-")
				{
					replies.insert(selectedMessages);
				}
				if(finalActions.contains("Closed Ticket"))
				{
					update_map = Map();
					update_map.put("status","Closed");
					updateTicketResp = invokeurl
					[
						url :"https://desk.zoho.com/api/v1/tickets/" + ticketId + ""
						type :PATCH
						parameters:update_map + ""
						connection:"zoho_desk"
					];
					//////////////////////////////////////////////////////////////
					replies.insert(thank_you_for_information_message);
					need_help_message = need_further_help_message.getPrefix("{{") + ticketNumber + need_further_help_message.getSuffix("}}");
					replies.insert(need_help_message);
					replies.insert(thank_you_message);
				}
				else
				{
					replies.insert(thank_you_for_information_message);
					ticket_team_message = ticket_created_for_team_message.getPrefix("{{") + ticketNumber + ticket_created_for_team_message.getSuffix("}}");
					replies.insert(ticket_team_message);
					replies.insert(thank_you_message);
				}
				response.put("action","end");
				response.put("replies",replies);
			}
		}
	}
}
/////// Output ///////
if(context_id.equals("output"))
{
	crmRecordId = zoho.salesiq.visitorsession.get("mediproinc","crmRecordId","zoho_salesiq").get("crmRecordId");
	info "Line: 362: crmRecordId: " + crmRecordId;
	/////////////////////////////////////////////////////////////////////////////////////////////
	chatBotActionsRecId = invokeurl
	[
		url :"https://www.zohoapis.com/crm/v2/functions/Chatbot_Actions_Using_RecId/actions/execute?auth_type=apikey&zapikey=1003.54e865e56692ea2154455b76012a7b71.1a7eab6552466d5f0187d84f8f1785b0&recId=" + crmRecordId
		type :POST
	];
	info "Line: 369: chatBotActionsRecId: " + chatBotActionsRecId;
	requiredInfoType = chatBotActionsRecId.get("details").get("output").get("requiredInfoType");
	Check_Support_Agreement = chatBotActionsRecId.get("details").get("output").get("Check_Support_Agreement");
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	Output_Action = chatBotActionsRecId.get("details").get("output").get("Output_Action");
	KB_Article = chatBotActionsRecId.get("details").get("output").get("KB_Article");
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	Option_vs_Output_Actions = chatBotActionsRecId.get("details").get("output").get("Option_vs_Output_Actions");
	Option_vs_Output_Article = chatBotActionsRecId.get("details").get("output").get("Option_vs_Output_Article");
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	if(requiredInfoType == "Free Typing Question")
	{
		finalActions = Output_Action;
		finalArticle = ifnull(KB_Article,"https://www.medipro.com/");
	}
	else if(requiredInfoType == "Multi Option Question")
	{
		selectedValue = zoho.salesiq.visitorsession.get("mediproinc","multiOptionSelection","zoho_salesiq").get("multiOptionSelection");
		info "selectedValue: " + selectedValue;
		selectedActions = Option_vs_Output_Actions.get(selectedValue);
		selectedArticle = Option_vs_Output_Article.get(selectedValue);
		finalActions = selectedActions;
		finalArticle = ifnull(selectedArticle,"https://www.medipro.com/");
	}
	//////////////////////////////////////////////////////////////////////////////////////////////
	if(activeAgreement == false && Check_Support_Agreement == true)
	{
		finalActions.removeElement("Talk to an Agent");
	}
	info "Final ACtions: " + finalActions;
	//////////////////////////////////////////////////////
	inputValuesString = "Questions:<br><br>";
	for each  keyVal in answers.keys()
	{
		info keyVal;
		inputValuesString = inputValuesString + keyVal + " : " + answers.get(keyVal).get("text") + "<br><br>";
	}
	info "inputValuesString: " + inputValuesString;
	info finalActions;
	info finalArticle;
	////////////////  Create Ticket //////////////////////////////////////////////////////////
	ticketId = "";
	ticketNumber = "";
	if(finalActions.contains("Open Ticket") || finalActions.contains("Closed Ticket"))
	{
		otherEmail = zoho.salesiq.visitorsession.get("mediproinc","otherEmail","zoho_salesiq").get("otherEmail");
		email = ifnull(otherEmail,visitor.get("email"));
		search_param_map = Map();
		search_param_map.put("email",email);
		Get_Contact = invokeurl
		[
			url :"https://desk.zoho.com/api/v1/contacts/search?"
			type :GET
			parameters:search_param_map
			connection:"zoho_desk"
		];
		// 			info "Searching Customer = "+Get_Contact;
		if(Get_Contact.get("data").size() > 0)
		{
			//// Contact found 
			deskContactID = Get_Contact.get("data").get(0).get("id");
		}
		else
		{
			/// Create Contact
			contactMap = Map();
			fullName = visitor.get("name");
			if(fullName.contains(" "))
			{
				contactMap.put("firstName",fullName.getPrefix(" "));
				contactMap.put("lastName",fullName.getSuffix(" "));
			}
			else
			{
				contactMap.put("lastName",fullName);
			}
			otherEmail = zoho.salesiq.visitorsession.get("mediproinc","otherEmail","zoho_salesiq").get("otherEmail");
			email = ifnull(otherEmail,visitor.get("email"));
			contactMap.put("email",email);
			contactMap.put("phone",visitor.get("phone"));
			creatingDeskContact = invokeurl
			[
				url :"https://desk.zoho.com/api/v1/contacts"
				type :POST
				parameters:contactMap.toString()
				connection:"zoho_desk"
			];
			info "creatingDeskContact = " + creatingDeskContact;
			deskContactID = creatingDeskContact.get("id");
		}
		////////////////////////////////////////////////////////////
		classification = zoho.salesiq.visitorsession.get("mediproinc","classification","zoho_salesiq").get("classification");
		category = zoho.salesiq.visitorsession.get("mediproinc","category","zoho_salesiq").get("category");
		issueType = zoho.salesiq.visitorsession.get("mediproinc","issueType","zoho_salesiq").get("issueType");
		////////////////////////////////////////////////////////////		
		//// Creating Ticket
		create_map = Map();
		create_map.put("subject","Ticket submitted by " + visitor.get("name") + " via Chatbot.");
		create_map.put("contactId",deskContactID);
		create_map.put("departmentId",deskDepartmentId);
		create_map.put("channel","Chat");
		create_map.put("description",ifnull(inputValuesString,""));
		create_map.put("classification",classification.replaceAll("[\"#%&'+,;<=>\\^`{}|~]",""));
		create_map.put("category",category.replaceAll("[\"#%&'+,;<=>\\^`{}|~]",""));
		if(issueType.toString() != "Empty")
		{
			cf = Map();
			cf.put("cf_issue_type",issueType.replaceAll("[\"#%&'+,;<=>\\^`{}|~]",""));
			create_map.put("cf",cf);
		}
		createTicketResp = invokeurl
		[
			url :"https://desk.zoho.com/api/v1/tickets"
			type :POST
			parameters:create_map + ""
			connection:"zoho_desk"
		];
		info "createTicketResp = " + createTicketResp;
		if(createTicketResp.containsKey("modifiedTime"))
		{
			ticketId = createTicketResp.get("id");
			ticketNumber = createTicketResp.get("ticketNumber");
		}
	}
	/////////////////////////////////////////////////////////////////////////////////////////////
	tempStoreMap = Map();
	tempStoreMap.put("ticketId",ticketId);
	tempStoreMap.put("ticketNumber",ticketNumber);
	tempStoreMap.put("finalActions",finalActions);
	storeData = zoho.salesiq.visitorsession.set("mediproinc",tempStoreMap,"zoho_salesiq");
	/////////////////////////////////////////////////////////////////////////////////////////////
	////////////////// Article - Agent - > True ///////////////////////////////////////////////////////
	if(finalActions.contains("KB Article"))
	{
		info "IN: KB Article Condition";
		response.put("action","context");
		response.put("context_id","issue_resolved_with_kb");
		replies = Collection();
		replies.insert({"type":"links","text":article_found_message,"links":{{"url":finalArticle,"text":read_article_message}}});
		replies.insert(issue_resolved_with_article_message);
		question = {"name":"issueResolvedWithKb","replies":replies,"input":{"type":"select","options":{"Yes","No"}}};
		response.put("questions",{question});
	}
	////////////////// Article - > True  | Agent  -> False /////////////////////////////////////////	
	else if(!finalActions.contains("KB Article") && finalActions.contains("Talk to an Agent"))
	{
		response.put("action","context");
		response.put("context_id","talk_to_human");
		replies = Collection();
		if(ticketNumber != null && ticketNumber != "")
		{
			ticket_team_message = ticket_created_for_team_message.getPrefix("{{") + ticketNumber + ticket_created_for_team_message.getSuffix("}}");
			replies.insert(ticket_team_message);
		}
		replies.insert(talk_to_agent_message);
		question = {"name":"connectTo","replies":replies,"input":{"type":"select","options":{"Yes","No"}}};
		response.put("questions",{question});
	}
	//////////////////  Agent - Article  -> False /////////////////////////////////////////		
	else if(!finalActions.contains("KB Article") && !finalActions.contains("Talk to an Agent"))
	{
		if(ticketId != null)
		{
			//////////////////////////////// Attaching chat Transcript on the Ticket Starts //////////////////////////////////////////
			conversation_id = visitor.get("active_conversation_id");
			param = Map();
			param.put("data","messages");
			param.put("format","pdf");
			export_chat = invokeurl
			[
				url :"https://salesiq.zoho.com/api/v2/mediproinc/conversations/" + conversation_id + "/export"
				type :POST
				parameters:param + ""
				connection:"zoho_salesiq"
			];
			info "Exporting Chat = " + export_chat;
			export_chat.setParamName("file");
			header = Map();
			header.put("Content-Type","multipart/form-data");
			////// attach file to ticket ////
			attach = invokeurl
			[
				url :"https://desk.zoho.com/api/v1/tickets/" + ticketId + "/attachments?isPublic=true"
				type :POST
				headers:header
				files:export_chat
				connection:"zoho_desk"
			];
			//////////////////////////////// Attaching chat Transcript on the Ticket Ends //////////////////////////////////////////
		}
		replies = Collection();
		if(finalActions.contains("Closed Ticket"))
		{
			update_map = Map();
			update_map.put("status","Closed");
			updateTicketResp = invokeurl
			[
				url :"https://desk.zoho.com/api/v1/tickets/" + ticketId + ""
				type :PATCH
				parameters:update_map + ""
				connection:"zoho_desk"
			];
			//////////////////////////////////////////////////////////////
			replies.insert(thank_you_for_information_message);
			need_futher_help_ticket_message = need_further_help_message.getPrefix("{{") + ticketNumber + need_further_help_message.getSuffix("}}");
			replies.insert(need_futher_help_ticket_message);
			replies.insert(thank_you_message);
		}
		else
		{
			replies.insert(thank_you_for_information_message);
			ticket_message = ticket_created_for_team_message.getPrefix("{{") + ticketNumber + ticket_created_for_team_message.getSuffix("}}");
			replies.insert(ticket_message);
			replies.insert(thank_you_message);
		}
		response.put("action","end");
		response.put("replies",replies);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////
if(context_id.equals("issue_resolved_with_kb"))
{
	info "IN: Issue Resolved Context";
	if(answers.containsKey("issueResolvedWithKb"))
	{
		ticketId = zoho.salesiq.visitorsession.get("mediproinc","ticketId","zoho_salesiq").get("ticketId");
		ticketNumber = zoho.salesiq.visitorsession.get("mediproinc","ticketNumber","zoho_salesiq").get("ticketNumber");
		finalActions = zoho.salesiq.visitorsession.get("mediproinc","finalActions","zoho_salesiq").get("finalActions");
		info "finalActions: " + finalActions;
		///////////////////////////////////////////////////////////////////////////
		issueResolvedWithKb = answers.get("issueResolvedWithKb").get("text");
		if(issueResolvedWithKb.toString() == "Yes")
		{
			if(ticketId != null)
			{
				//////////////////////////////// Attaching chat Transcript on the Ticket Starts //////////////////////////////////////////
				conversation_id = visitor.get("active_conversation_id");
				param = Map();
				param.put("data","messages");
				param.put("format","pdf");
				export_chat = invokeurl
				[
					url :"https://salesiq.zoho.com/api/v2/mediproinc/conversations/" + conversation_id + "/export"
					type :POST
					parameters:param + ""
					connection:"zoho_salesiq"
				];
				info "Exporting Chat = " + export_chat;
				export_chat.setParamName("file");
				header = Map();
				header.put("Content-Type","multipart/form-data");
				////// attach file to ticket ////
				attach = invokeurl
				[
					url :"https://desk.zoho.com/api/v1/tickets/" + ticketId + "/attachments?isPublic=true"
					type :POST
					headers:header
					files:export_chat
					connection:"zoho_desk"
				];
				//////////////////////////////// Attaching chat Transcript on the Ticket Ends //////////////////////////////////////////
			}
			update_map = Map();
			update_map.put("status","Closed");
			updateTicketResp = invokeurl
			[
				url :"https://desk.zoho.com/api/v1/tickets/" + ticketId + ""
				type :PATCH
				parameters:update_map + ""
				connection:"zoho_desk"
			];
			////////////////////////////////////////////////////////////////////////////////////
			replies = Collection();
			replies.insert(thank_you_for_information_message);
			if(ticketNumber != null && ticketNumber != "")
			{
				referenct_ticket_message = ticket_created_for_reference_message.getPrefix("{{") + ticketNumber + ticket_created_for_reference_message.getSuffix("}}");
				replies.insert(referenct_ticket_message);
			}
			else
			{
				replies.insert(issue_resolved_message);
			}
			replies.insert(thank_you_message);
			response.put("action","end");
			response.put("replies",replies);
		}
		else if(issueResolvedWithKb.toString() == "No" && !finalActions.contains("Talk to an Agent"))
		{
			if(ticketId != null)
			{
				//////////////////////////////// Attaching chat Transcript on the Ticket Starts //////////////////////////////////////////
				conversation_id = visitor.get("active_conversation_id");
				param = Map();
				param.put("data","messages");
				param.put("format","pdf");
				export_chat = invokeurl
				[
					url :"https://salesiq.zoho.com/api/v2/mediproinc/conversations/" + conversation_id + "/export"
					type :POST
					parameters:param + ""
					connection:"zoho_salesiq"
				];
				info "Exporting Chat = " + export_chat;
				export_chat.setParamName("file");
				header = Map();
				header.put("Content-Type","multipart/form-data");
				////// attach file to ticket ////
				attach = invokeurl
				[
					url :"https://desk.zoho.com/api/v1/tickets/" + ticketId + "/attachments?isPublic=true"
					type :POST
					headers:header
					files:export_chat
					connection:"zoho_desk"
				];
				//////////////////////////////// Attaching chat Transcript on the Ticket Ends //////////////////////////////////////////
			}
			replies = Collection();
			replies.insert(thank_you_for_information_message);
			if(ticketNumber != null && ticketNumber != "")
			{
				ticket_message = ticket_created_for_team_message.getPrefix("{{") + ticketNumber + ticket_created_for_team_message.getSuffix("}}");
				replies.insert(ticket_message);
			}
			else
			{
				replies.insert(ticket_not_created_message);
			}
			replies.insert(thank_you_message);
			response.put("action","end");
			response.put("replies",replies);
		}
		else if(issueResolvedWithKb.toString() == "No" && finalActions.contains("Talk to an Agent"))
		{
			response.put("action","context");
			response.put("context_id","talk_to_human");
			replies = Collection();
			if(ticketNumber != null && ticketNumber != "")
			{
				ticket_message = ticket_created_for_team_message.getPrefix("{{") + ticketNumber + ticket_created_for_team_message.getSuffix("}}");
				replies.insert(ticket_message);
			}
			replies.insert(talk_to_agent_message);
			question = {"name":"connectTo","replies":replies,"input":{"type":"select","options":{"Yes","No"}}};
			response.put("questions",{question});
		}
	}
}
///////////////////////////////////////////////////////////////////////////////////////////
if(context_id.equals("talk_to_human"))
{
	ticketId = zoho.salesiq.visitorsession.get("mediproinc","ticketId","zoho_salesiq").get("ticketId");
	if(ticketId != null)
	{
		//////////////////////////////// Attaching chat Transcript on the Ticket Starts //////////////////////////////////////////
		conversation_id = visitor.get("active_conversation_id");
		param = Map();
		param.put("data","messages");
		param.put("format","pdf");
		export_chat = invokeurl
		[
			url :"https://salesiq.zoho.com/api/v2/mediproinc/conversations/" + conversation_id + "/export"
			type :POST
			parameters:param + ""
			connection:"zoho_salesiq"
		];
		info "Exporting Chat = " + export_chat;
		export_chat.setParamName("file");
		header = Map();
		header.put("Content-Type","multipart/form-data");
		////// attach file to ticket ////
		attach = invokeurl
		[
			url :"https://desk.zoho.com/api/v1/tickets/" + ticketId + "/attachments?isPublic=true"
			type :POST
			headers:header
			files:export_chat
			connection:"zoho_desk"
		];
		//////////////////////////////// Attaching chat Transcript on the Ticket Ends //////////////////////////////////////////
	}
	info "IN: talk_to_human Context";
	if(answers.containsKey("connectTo"))
	{
		connectTo = answers.get("connectTo").get("text");
		info "connectTo = " + connectTo;
		if(connectTo.toString() == "Yes")
		{
			info departmentId;
			// Chat Forward
			response.put("action","forward");
			response.put("department",departmentId);
			response.put("replies",{connect_to_agent_message});
		}
		else
		{
			replies = Collection();
			replies.insert(thank_you_for_information_message);
			replies.insert(ticket_not_created_message);
			response.put("action","end");
			response.put("replies",replies);
		}
	}
}
return response;
content_copyCOPY