/// <summary> /// Create a new ticket from the input. /// </summary> /// <param name="currentLanguageCode">Current applicable language code.</param> /// <param name="message">A message in a conversation.</param> /// <param name="data">Represents the submit data associated with the Ask An Expert card.</param> /// <param name="member">Teams channel account detailing user Azure Active Directory details.</param> /// <param name="ticketsProvider">Tickets Provider.</param> /// <returns>TicketEntity object.</returns> private static async Task <TicketEntity> CreateTicketAsync( string currentLanguageCode, IMessageActivity message, AskAnExpertCardPayload data, TeamsChannelAccount member, ITicketsProvider ticketsProvider) { IList <TicketEntity> ticketList = await ticketsProvider.GetTicketCountAsync(); TicketEntity ticketEntity = new TicketEntity { LanguageCode = currentLanguageCode, TicketId = (10000 + ticketList.Count).ToString(), // Guid.NewGuid().ToString(), Status = (int)TicketState.UnAnswered, DateCreated = DateTime.UtcNow, Title = data.Title, Description = data.Description, RequesterName = member.Name, RequesterUserPrincipalName = member.UserPrincipalName, RequesterGivenName = member.GivenName, RequesterConversationId = message.Conversation.Id, LastModifiedByName = message.From.Name, LastModifiedByObjectId = message.From.AadObjectId, UserQuestion = data.UserQuestion, KnowledgeBaseAnswer = data.KnowledgeBaseAnswer, KnowledgeBaseQuestion = data.KnowledgeBaseQuestion, }; await ticketsProvider.UpsertTicketAsync(ticketEntity).ConfigureAwait(false); return(ticketEntity); }
/// <summary> /// Create a new ticket from the input. /// </summary> /// <param name="message">A message in a conversation.</param> /// <param name="data">Represents the submit data associated with the Ask An Expert card.</param> /// <param name="member">Teams channel account detailing user Azure Active Directory details.</param> /// <param name="ticketsProvider">Tickets Provider.</param> /// <returns>TicketEntity object.</returns> private static async Task <TicketEntity> CreateTicketAsync( IMessageActivity message, AskAnExpertCardPayload data, TeamsChannelAccount member, ITicketsProvider ticketsProvider) { TicketEntity ticketEntity = new TicketEntity { TicketId = Guid.NewGuid().ToString(), Status = (int)TicketState.UnAssigned, DateCreated = DateTime.Now, Title = data.Title, Description = data.Description, RequesterName = member.Name, RequesterUserPrincipalName = member.UserPrincipalName, RequesterGivenName = member.GivenName, RequesterConversationId = message.Conversation.Id, LastModifiedByName = message.From.Name, LastModifiedByObjectId = message.From.AadObjectId, UserQuestion = data.UserQuestion, KnowledgeBaseAnswer = data.KnowledgeBaseAnswer, Subject = data.Project, }; await ticketsProvider.UpsertTicketAsync(ticketEntity).ConfigureAwait(false); return(ticketEntity); }
/// <summary> /// This method will construct the card for ask an expert, when invoked from the response card. /// </summary> /// <param name="payload">Payload from the response card.</param> /// <returns>Ask an expert card.</returns> public static Attachment GetCard(ResponseCardPayload payload) { var data = new AskAnExpertCardPayload { Title = payload.UserQuestion, // Pre-populate the description with the user's question UserQuestion = payload.UserQuestion, KnowledgeBaseAnswer = payload.KnowledgeBaseAnswer, }; return(GetCard(false, data)); }
/// <summary> /// This method will construct the card for ask an expert, when invoked from the response card. /// </summary> /// <param name="payload">Payload from the response card.</param> /// <returns>Ask an expert card.</returns> public static Attachment GetCard(ResponseCardPayload payload) { var cardPayload = new AskAnExpertCardPayload { Description = payload.UserQuestion, // Pre-populate the description with the user's question. UserQuestion = payload.UserQuestion, KnowledgeBaseAnswer = payload?.KnowledgeBaseAnswer, }; return(GetCard(cardPayload, showValidationErrors: false)); }
/// <summary> /// Create a new ticket from the input. /// </summary> /// <param name="message">A message in a conversation.</param> /// <param name="data">Represents the submit data associated with the Ask An Expert card.</param> /// <param name="member">Teams channel account detailing user Azure Active Directory details.</param> /// <param name="ticketsProvider">Tickets Provider.</param> /// <returns>TicketEntity object.</returns> private static async Task <TicketEntity> CreateTicketAsync( IMessageActivity message, AskAnExpertCardPayload data, TeamsChannelAccount member, ITicketsProvider ticketsProvider) { //AtBot Conceirge Support //Boolean as to whether this is the Teams channel. If not, we assume bot is being interfaced as an AtBot Agent bool isTeamsChannel = message.ChannelId == "msteams"; ChannelAccount agentUser = message.From; //When creating a ticket from the bot acting as an agent, the requestor information will be limited to the UPN. Additional graph calls //will be needed to pull AAD GUID and display name. TicketEntity ticketEntity = new TicketEntity { TicketId = Guid.NewGuid().ToString(), Status = (int)TicketState.Open, DateCreated = DateTime.UtcNow, Title = data.Title, Description = data.Description, RequesterName = isTeamsChannel ? member.Name : agentUser.Name, RequesterUserPrincipalName = isTeamsChannel ? member.UserPrincipalName : agentUser.Name, RequesterGivenName = isTeamsChannel ? member.GivenName : agentUser.Name, RequesterConversationId = message.Conversation.Id, LastModifiedByName = message.From.Name, LastModifiedByObjectId = message.From.AadObjectId, UserQuestion = data.UserQuestion, KnowledgeBaseAnswer = data.KnowledgeBaseAnswer, }; await ticketsProvider.UpsertTicketAsync(ticketEntity).ConfigureAwait(false); return(ticketEntity); }
/// <summary> /// This method will construct the card for ask an expert bot menu. /// </summary> /// <param name="showValidationErrors">Determines whether we show validation errors.</param> /// <param name="data">Data from the ask an expert card.</param> /// <returns>Ask an expert card.</returns> private static Attachment GetCard(bool showValidationErrors, AskAnExpertCardPayload data) { AdaptiveCard askAnExpertCard = new AdaptiveCard("1.0") { Body = new List <AdaptiveElement> { new AdaptiveTextBlock { Weight = AdaptiveTextWeight.Bolder, Text = Resource.AskAnExpertText1, Size = AdaptiveTextSize.Large, Wrap = true }, new AdaptiveTextBlock { Text = Resource.AskAnExpertSubheaderText, Wrap = true }, new AdaptiveColumnSet { Columns = new List <AdaptiveColumn> { new AdaptiveColumn { Width = AdaptiveColumnWidth.Auto, Items = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = Resource.TitleRequiredText, Wrap = true } } }, new AdaptiveColumn { Items = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = (showValidationErrors && string.IsNullOrWhiteSpace(data.Title)) ? Resource.MandatoryTitleFieldText : string.Empty, Color = AdaptiveTextColor.Attention, HorizontalAlignment = AdaptiveHorizontalAlignment.Right, Wrap = true } } } }, }, new AdaptiveTextInput { Id = nameof(AskAnExpertCardPayload.Title), Placeholder = Resource.ShowCardTitleText, IsMultiline = false, Spacing = AdaptiveSpacing.Small, Value = data.Title, }, new AdaptiveTextBlock { Text = Resource.DescriptionText, Wrap = true }, new AdaptiveTextInput { Id = nameof(AskAnExpertCardPayload.Description), Placeholder = Resource.AskAnExpertPlaceholderText, IsMultiline = true, Spacing = AdaptiveSpacing.Small, Value = data.Description, } }, Actions = new List <AdaptiveAction> { new AdaptiveSubmitAction { Title = Resource.AskAnExpertButtonText, Data = new AskAnExpertCardPayload { MsTeams = new CardAction { Type = ActionTypes.MessageBack, DisplayText = Resource.AskAnExpertDisplayText, Text = AskAnExpertSubmitText, }, UserQuestion = data.UserQuestion, KnowledgeBaseAnswer = data.KnowledgeBaseAnswer, }, } } }; return(new Attachment { ContentType = AdaptiveCard.ContentType, Content = askAnExpertCard, }); }
/// <summary> /// This method will construct the card for ask an expert, when invoked from the ask an expert card submit. /// </summary> /// <param name="payload">Payload from the ask an expert card.</param> /// <returns>Ask an expert card.</returns> public static Attachment GetCard(AskAnExpertCardPayload payload) { return(GetCard(true, payload)); }
/// <summary> /// This method will construct the card for ask an expert bot menu. /// </summary> /// <param name="cardPayload">Data from the ask an expert card.</param> /// <param name="showValidationErrors">Determines whether we show validation errors.</param> /// <returns>Ask an expert card.</returns> private static Attachment GetCard(AskAnExpertCardPayload cardPayload, bool showValidationErrors) { AdaptiveCard askAnExpertCard = new AdaptiveCard(new AdaptiveSchemaVersion(1, 0)) { Body = new List <AdaptiveElement> { new AdaptiveTextBlock { Weight = AdaptiveTextWeight.Bolder, Text = Strings.AskAnExpertTitleText, Size = AdaptiveTextSize.Large, Wrap = true, }, new AdaptiveTextBlock { Text = Strings.AskAnExpertSubheaderText, Wrap = true, }, new AdaptiveColumnSet { Columns = new List <AdaptiveColumn> { new AdaptiveColumn { Width = AdaptiveColumnWidth.Auto, Items = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = Strings.TitleRequiredText, Wrap = true, }, }, }, new AdaptiveColumn { Items = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = (showValidationErrors && string.IsNullOrWhiteSpace(cardPayload?.Title)) ? Strings.MandatoryTitleFieldText : string.Empty, Color = AdaptiveTextColor.Attention, HorizontalAlignment = AdaptiveHorizontalAlignment.Right, Wrap = true, }, }, }, }, }, new AdaptiveTextInput { Id = nameof(AskAnExpertCardPayload.Title), Placeholder = Strings.ShowCardTitleText, IsMultiline = false, Spacing = AdaptiveSpacing.Small, Value = cardPayload?.Title, }, new AdaptiveColumnSet { Columns = new List <AdaptiveColumn> { new AdaptiveColumn { Width = AdaptiveColumnWidth.Auto, Items = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = Strings.DescriptionText, Wrap = true, }, }, }, new AdaptiveColumn { Items = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = (showValidationErrors && cardPayload?.Description.Length > 500) ? Strings.MaxCharactersText : string.Empty, Color = AdaptiveTextColor.Attention, HorizontalAlignment = AdaptiveHorizontalAlignment.Right, Wrap = true, }, }, }, }, }, new AdaptiveTextInput { Id = nameof(AskAnExpertCardPayload.Description), Placeholder = Strings.AskAnExpertPlaceholderText, IsMultiline = true, Spacing = AdaptiveSpacing.Small, Value = cardPayload?.Description, }, }, Actions = new List <AdaptiveAction> { new AdaptiveSubmitAction { Data = new AskAnExpertCardPayload { MsTeams = new CardAction { Type = ActionTypes.MessageBack, DisplayText = Strings.AskAnExpertDisplayText, Text = AskAnExpertSubmitText, }, UserQuestion = cardPayload?.UserQuestion, KnowledgeBaseAnswer = cardPayload?.KnowledgeBaseAnswer, Project = cardPayload?.Project, }, }, }, }; return(new Attachment { ContentType = AdaptiveCard.ContentType, Content = askAnExpertCard, }); }
/// <summary> /// This method will construct the card for ask an expert, when invoked from the ask an expert card submit. /// </summary> /// <param name="payload">Payload from the ask an expert card.</param> /// <returns>Ask an expert card.</returns> public static Attachment GetCard(AskAnExpertCardPayload payload) { return(GetCard(payload, showValidationErrors: true)); }
// Create a new ticket from the input private async Task <TicketEntity> CreateTicketAsync(IMessageActivity message, AskAnExpertCardPayload data, TeamsChannelAccount member) { TicketEntity ticketEntity = new TicketEntity { TicketId = Guid.NewGuid().ToString(), Status = (int)TicketState.Open, DateCreated = DateTime.UtcNow, Choices = data.Choices, Title = data.Title, Description = data.Description, Location = data.Location, PhoneNumber = data.PhoneNumber, Mail = data.Mail, RequesterName = member.Name, RequesterUserPrincipalName = member.UserPrincipalName, RequesterGivenName = member.GivenName, RequesterConversationId = message.Conversation.Id, LastModifiedByName = message.From.Name, LastModifiedByObjectId = message.From.AadObjectId, UserQuestion = data.UserQuestion, KnowledgeBaseAnswer = data.KnowledgeBaseAnswer }; await this.ticketsProvider.SaveOrUpdateTicketAsync(ticketEntity); return(ticketEntity); }
/// <summary> /// This method will construct the card for ask an expert bot menu. /// </summary> /// <param name="showValidationErrors">Determines whether we show validation errors.</param> /// <param name="data">Data from the ask an expert card.</param> /// <returns>Ask an expert card.</returns> private static Attachment GetCard(bool showValidationErrors, AskAnExpertCardPayload data) { AdaptiveCard askAnExpertCard = new AdaptiveCard("1.0") { Body = new List <AdaptiveElement> { new AdaptiveTextBlock { Weight = AdaptiveTextWeight.Bolder, Text = Resource.AskAnExpertText1, Size = AdaptiveTextSize.Large, Wrap = true }, new AdaptiveTextBlock { Text = Resource.AskAnExpertSubheaderText, Wrap = true }, new AdaptiveColumnSet { Columns = new List <AdaptiveColumn> { new AdaptiveColumn { Width = AdaptiveColumnWidth.Auto, Items = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = Resource.TitleRequiredText, Wrap = true } } }, new AdaptiveColumn { Items = new List <AdaptiveElement> { new AdaptiveTextBlock { Text = (showValidationErrors && string.IsNullOrWhiteSpace(data.Title)) ? Resource.MandatoryTitleFieldText : string.Empty, Color = AdaptiveTextColor.Attention, HorizontalAlignment = AdaptiveHorizontalAlignment.Right, Wrap = true } } } }, }, new AdaptiveTextInput { Id = nameof(AskAnExpertCardPayload.Title), Placeholder = Resource.ShowCardTitleText, IsMultiline = false, Spacing = AdaptiveSpacing.Small, Value = data.Title, }, new AdaptiveTextBlock { Text = "Issue description", Wrap = true }, new AdaptiveTextInput { Id = nameof(AskAnExpertCardPayload.Description), Placeholder = Resource.AskAnExpertPlaceholderText, IsMultiline = true, Spacing = AdaptiveSpacing.Small, Value = data.Description, }, new AdaptiveTextBlock { Text = "IP address/computer account ", Wrap = true }, new AdaptiveTextInput { Id = nameof(AskAnExpertCardPayload.Location), Placeholder = "Please Enter your IP Address ", IsMultiline = false, Spacing = AdaptiveSpacing.Small, Value = data.Location, }, new AdaptiveTextBlock { Text = "Location", Wrap = true }, new AdaptiveChoiceSetInput { Type = AdaptiveChoiceSetInput.TypeName, Id = "Choices", IsMultiSelect = false, Style = AdaptiveChoiceInputStyle.Compact, Value = "Choose a plan", Choices = new List <AdaptiveChoice> { new AdaptiveChoice() { Title = "العباسية ", Value = "العباسية" }, new AdaptiveChoice() { Title = "اسيوط & منيا ", Value = "اسيوط & منيا" }, new AdaptiveChoice() { Title = "بني سويف ", Value = "بني سويف" }, new AdaptiveChoice() { Title = "بنها", Value = "بنها" }, new AdaptiveChoice() { Title = "كول سنتر ", Value = "كول سنتر " }, new AdaptiveChoice() { Title = "هليوپوليس ", Value = "هليوپوليس " }, new AdaptiveChoice() { Title = "Showroom ", Value = "Showroom " }, new AdaptiveChoice() { Title = "Small Branches & Service Center ", Value = "Small Branches & Service Center " }, new AdaptiveChoice() { Title = "بورسعيد -الاسكندرية-طنطا - المنصوره ", Value = "بورسعيد -الاسكندرية-طنطا - المنصوره" }, new AdaptiveChoice() { Title = "قليوبية", Value = "قليوبية" }, new AdaptiveChoice() { Title = "قويسنا ", Value = "قويسنا" }, }, }, new AdaptiveTextBlock { Text = "Mail ", Wrap = true }, new AdaptiveTextInput { Id = nameof(AskAnExpertCardPayload.Mail), Placeholder = "Please Enter your Mail ", IsMultiline = false, Spacing = AdaptiveSpacing.Small, Value = data.Mail, }, new AdaptiveTextBlock { Text = "Phone Number ", Wrap = true }, new AdaptiveTextInput { Id = nameof(AskAnExpertCardPayload.PhoneNumber), Placeholder = "Please Enter your Phone Number ", IsMultiline = false, Spacing = AdaptiveSpacing.Small, Value = data.PhoneNumber, }, }, Actions = new List <AdaptiveAction> { new AdaptiveSubmitAction { Title = Resource.AskAnExpertButtonText, Data = new AskAnExpertCardPayload { MsTeams = new CardAction { Type = ActionTypes.MessageBack, DisplayText = Resource.AskAnExpertDisplayText, Text = AskAnExpertSubmitText, }, UserQuestion = data.UserQuestion, KnowledgeBaseAnswer = data.KnowledgeBaseAnswer, }, } } }; return(new Attachment { ContentType = AdaptiveCard.ContentType, Content = askAnExpertCard, }); }