ChatApi/Services/Bot/ChatBotRHCall.cs
2024-12-22 15:49:43 -03:00

134 lines
5.7 KiB
C#

using ChatApi.Models;
using ChatApi.Services.Bot.Structs;
using ChatApi.Services.Emails;
using ChatApi.Settings;
using Microsoft.Extensions.Options;
using Microsoft.SemanticKernel.ChatCompletion;
using System.Text;
namespace ChatApi.Services.Bot
{
public class ChatBotRHCall
{
private ChatBot _chatbot;
private readonly IChatCompletionService _chatCompletionService;
private readonly IHttpClientFactory _httpClientFactory;
private readonly IOptions<ChatRHSettings> _chatRHApiConfig;
public UserData UserData { get; set; }
Dictionary<string, string> _opcoesSolicitação =
new Dictionary<string, string> {
{ "Inclusão/Exclusão Alura", "Inclusão/Exclusão Alura"},
{ "Inclusão/Exclusão Auxílio Idioma", "Inclusão/Exclusão Auxílio Idioma"},
{ "Inclusão/Exclusão Plano Odonto", "Inclusão/Exclusão Plano Odonto"},
//{ "Envio de Atestado", "Envio de Atestado"},
//{ "Envio de Reembolso Idioma", "Envio de Reembolso Idioma"},
//{ "Afastamento e Licenças", "Afastamento e Licenças"},
{ "Dúvidas Plano de Saúde", "Dúvidas Plano de Saúde"},
{ "Dúvidas Folha de Pagamento", "Dúvidas Folha de Pagamento"},
{ "Ajuste Cargo/Salário", "Ajuste Cargo/Salário"},
{ "Feedbacks, reclamações", "Feedbacks, reclamações"},
{ "Feedz - Dúvida 1:1", "Feedz - Dúvida 1:1"},
{ "Feedz - Dúvida Feedback", "Feedz - Dúvida Feedback"},
{ "Feedz - Cadastro de Objetivo", "Feedz - Cadastro de Objetivo"},
{ "Feedz - Erro Cadastro", "Feedz - Erro Cadastro"},
{ "Feedz - Outros", "Feedz - Outros"},
{ "Ciclo de Performance", "Ciclo de Performance"},
{ "Declaração Bolsa Faculdade", "Declaração Bolsa Faculdade"},
{ "Inclusão/Exclusão Programa de Especialização", "Inclusão/Exclusão Programa de Especialização"},
//{ "Envio de Reembolso Especialização", "Envio de Reembolso Especialização"},
{ "DayOff", "DayOff"}
};
private readonly IOptions<DomvsDatabaseSettings> _config;
public ChatBotRHCall(
IOptions<DomvsDatabaseSettings> config,
IChatCompletionService chatCompletionService,
IHttpClientFactory httpClientFactory,
IOptions<ChatRHSettings> chatRHApiConfig)
{
_chatCompletionService = chatCompletionService;
_httpClientFactory = httpClientFactory;
_chatRHApiConfig = chatRHApiConfig;
_config = config;
}
public string SetAnswer(string sessionId, string resposta, bool needsRestart = false)
{
if (_chatbot==null)
{
this.Init(sessionId);
}
return _chatbot.SetAnswer(resposta);
}
public async Task<string?> GetNextQuestion()
{
return await _chatbot.GetNextQuestion();
}
public string GetCurrentQuestion()
{
return _chatbot.GetCurrentQuestion();
}
public bool HasNextQuestion()
{
return _chatbot.HasNextQuestion();
}
public async Task<string?> CallFinalAction()
{
return await _chatbot.CallFinalAction();
}
public void Init(string sessionId)
{
var persist = ChatPersistence.Create(_config.Value).SetBotName("RHCall");
var actionOnEnd = new ActionCreateCall(_httpClientFactory, _chatRHApiConfig.Value);
_chatbot = new ChatBot(persist, sessionId, this.UserData, _chatCompletionService, actionOnEnd);
AddNumbersBeforShow(_opcoesSolicitação);
_chatbot.AddQuestion(new Question(
"Você quer fazer uma solicitação ao RH, certo??",
resposta => !string.IsNullOrEmpty(resposta)));
_chatbot.AddQuestion(new Question(
"Qual seu número de celular (com WhatsApp)?",
resposta => !string.IsNullOrEmpty(resposta) && resposta.Length >= 10));
_chatbot.AddQuestion(new Question(
"Qual seu e-mail?",
resposta => EmailValidate.IsValidEmail(resposta)));
var builder = new StringBuilder();
_opcoesSolicitação.Select(s => s.Value).ToList().ForEach(s => builder.AppendLine(s));
var validNumbers = _opcoesSolicitação.Select(s => s.Value.Substring(0, s.Value.IndexOf("-")-1)).ToList();
_chatbot.AddQuestion(new Question(
$"Indique o tipo de solicitação: \n {builder}",
resposta => validNumbers.IndexOf(resposta) != -1,
null,
text => _opcoesSolicitação.FirstOrDefault(s => s.Value.Substring(0, s.Value.IndexOf("-")-1) == text).Key));
_chatbot.AddQuestion(new Question(
"Texto/Descrição da solicitação (em caso de dúvidas)",
resposta => !string.IsNullOrEmpty(resposta)));
_chatbot.AddQuestion(new Question(
"Tudo bem? Posso enviar sua solicitação? Ou prefere que eu tente fazer algum ajuste no texto da descrição? (SIM ou NÃO)",
resposta => resposta.ToUpper() == "SIM" || resposta.ToUpper() == "NÃO"));
}
private void AddNumbersBeforShow(Dictionary<string, string> dict)
{
int optionNumber = 1;
foreach (var key in dict.Keys)
{
dict[key] = $"{optionNumber} - {dict[key]}";
optionNumber++;
}
}
}
}