Ejemplo n.º 1
0
        public static async Task Process(IDialogContext context)
        {
            var activity = context.Activity as Activity;

            Sesion sesion = context.UserData.GetValue <Sesion>("sesion");

            context.UserData.SetValue("Usuario", sesion.Nombre);

            var container = new Container();

            UnityConfig.RegisterTypes(container);

            /* 4.1.4   El Sistema crea una nueva Solicitud Académica con los datos indicados líneas abajo
             *  en la entidad[GSAV_SolicitudAcadémica], generando un código único */

            Solicitud solicitud = new Solicitud();

            if (context.UserData.ContainsKey("solicitud"))
            {
                solicitud = LeerSolicitud(sesion, context, activity, container);

                if (solicitud.Estado != "P")
                {
                    solicitud = CrearNuevaSolicitud(sesion, context, activity, container);
                }
            }
            else
            {
                solicitud = CrearNuevaSolicitud(sesion, context, activity, container);
            }

            try
            {
                DialogEngine handler = container.GetInstance <DialogEngine>();

                Result receivedResult = await handler.GetSpeechAsync(activity, sesion, context);

                IIntencion intencionManager = container.GetInstance <IIntencion>();

                /*
                 * 4.1.5   El Sistema valida si existe una “Intención de Consulta” para la pregunta
                 * ingresada por el alumno a través del Agente de Procesamiento de Lenguaje Natural.
                 * GSAV _RN013 – Tipos de Consultas Académicas
                 */
                if (receivedResult.ExistIntent)
                {
                    /*
                     * 4.1.6   El Sistema valida si la “Intención de Consulta” obtenida tiene una probabilidad
                     * mayor o igual al 80 %.GSAV _RN018– Porcentaje para respuestas certera
                     */

                    var intentScore = receivedResult.Intents.FirstOrDefault().Score;

                    if (receivedResult.ExistValidIntent)
                    {
                        string    intent    = receivedResult.GetValidIntent();
                        Intencion intencion = intencionManager.ObtenerCategoria(intent);

                        context.UserData.SetValue("result", receivedResult);

                        if (string.IsNullOrEmpty(intencion.NombreBase))
                        {
                            intencion.NombreBase = intent;
                        }

                        context.UserData.SetValue("intencion", intencion);

                        if (!string.IsNullOrEmpty(intent))
                        {
                            string dfParams  = receivedResult.Intents[0].Parameters;
                            string dfContext = receivedResult.OutputContexts;
                            Dictionary <string, string> listParams = JsonConvert.DeserializeObject <Dictionary <string, string> >(dfParams);
                            string course     = string.Empty;
                            string assignment = string.Empty;
                            int    number     = 0;

                            if (listParams.Count > 0)
                            {
                                if (listParams.ContainsKey("Curso"))
                                {
                                    course = listParams["Curso"];
                                    context.UserData.SetValue("Curso", course);
                                }

                                if (listParams.ContainsKey("Tarea"))
                                {
                                    assignment = listParams["Tarea"];
                                    context.UserData.SetValue("Tarea", assignment);
                                }

                                if (listParams.ContainsKey("number"))
                                {
                                    int.TryParse(listParams["number"], out number);
                                    context.UserData.SetValue("number", number);
                                }
                            }

                            var message = context.MakeMessage();

                            switch (intencion.NombreBase)
                            {
                            case "ActividadAcademica":
                                message.Text = $"Esta es una consulta de: {intent}";

                                context.PrivateConversationData.SetValue("custom", message.Text);

                                await context.PostAsync(message);

                                await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.ATENDIDO);

                                context.Wait(MenuDialog.MessageReceivedAsync);
                                break;

                            case AppConstant.Intencion.PROGRAMACION:

                                if (receivedResult.Intents[0].AllRequiredParamsPresent)
                                {
                                    string fechaActividad = string.Empty;
                                    int    numberSelected = context.UserData.GetValue <int>("number");

                                    var actividadManager = container.GetInstance <IActividad>();

                                    List <ActivitiesByCourseViewModel> activities = actividadManager.GetActivitiesByCourse(solicitud.IdAlumno);

                                    var filtered = activities.Where(o => o.Curso == course && o.Actividad == assignment);

                                    ActivitiesByCourseViewModel a = new ActivitiesByCourseViewModel();

                                    if (filtered.Count() == 0)
                                    {
                                        //context.Call(new NoRespuestaDialog(), MenuDialog.ResumeAfterDerivedAcademicIntent);

                                        await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.DERIVADA);

                                        context.Wait(MenuDialog.MessageReceivedAsync);

                                        return;
                                    }

                                    if (numberSelected > 0)
                                    {
                                        a = filtered.Where(o => o.NumeroActividad == numberSelected).FirstOrDefault();

                                        fechaActividad = a?.FechaActividad.ToString("dd MMMM yyyy");
                                    }
                                    else
                                    {
                                        a = filtered.Where(o => o.FechaActividad >= DateTime.Now).FirstOrDefault();

                                        fechaActividad = a?.FechaActividad.ToString("dd MMMM yyyy");
                                    }

                                    if (a == null)
                                    {
                                        a = new ActivitiesByCourseViewModel();
                                    }

                                    context.UserData.SetValue("Actividad", a);


                                    if (!string.IsNullOrEmpty(fechaActividad))
                                    {
                                        if (string.IsNullOrEmpty(receivedResult.Speech))
                                        {
                                            string tareaConNumero = assignment;

                                            if (number > 0)
                                            {
                                                tareaConNumero = $"{assignment} {number}";
                                            }

                                            receivedResult.Speech = $"La fecha de actividad de la {tareaConNumero} del Curso {course} es: {fechaActividad}";
                                        }
                                        else
                                        {
                                            receivedResult.Speech = receivedResult.Speech + " " + fechaActividad;
                                        }


                                        context.UserData.SetValue("result", receivedResult);

                                        await context.PostAsync(receivedResult.Speech);

                                        //await context.Forward(new MenuDialog(), MenuDialog.ResumeAfterSuccessAcademicIntent, context, CancellationToken.None);
                                        //context.Wait(MenuDialog.ResumeAfterSuccessAcademicIntent);
                                        //context.Call(new MenuDialog(), MenuDialog.ResumeAfterSuccessAcademicIntent);

                                        await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.ATENDIDO);

                                        context.Wait(MenuDialog.MessageReceivedAsync);
                                    }
                                    else
                                    {
                                        //context.Wait(MenuDialog.ResumeAfterFailedAcademicIntent);
                                        //await context.PostAsync(receivedResult.Speech);
                                        await context.PostAsync("La información ingresada es invalida, ingrese nuevamente su consulta");

                                        //context.Call(new NoRespuestaDialog(), MenuDialog.ResumeAfterDerivedAcademicIntent);

                                        //await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.FALTAINFORMACION);

                                        //context.Wait(MenuDialog.MessageReceivedAsync);

                                        //context.Call(new ProgramacionActividadesDialog(), MenuDialog.ResumeAfterSuccessAcademicIntent);

                                        await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.INVALIDO);

                                        context.Wait(MenuDialog.MessageReceivedAsync);
                                    }
                                }
                                else
                                {
                                    if (string.IsNullOrEmpty(course))
                                    {
                                        var cursoManager = container.GetInstance <ICurso>();

                                        List <CourseByModuleViewModel> studentActiveCourses = cursoManager.GetCourseByModuleActive(solicitud.IdAlumno);

                                        var questions = studentActiveCourses.Select(x => x.Curso).ToList();;

                                        string QuestionPrompt     = "Por favor seleccione el curso?";
                                        string invalidCourseInput = "La información ingresada es invalida, ingrese nuevamente su consulta";

                                        PromptOptions <string> options = new PromptOptions <string>(QuestionPrompt, "", invalidCourseInput, questions, 0);   // Overrided the PromptOptions Constructor.
                                        PromptDialog.Choice(context, MenuDialog.OnCourseSelected, options);
                                    }
                                    else
                                    {
                                        await context.PostAsync(receivedResult.Speech);
                                    }

                                    context.Wait(MenuDialog.MessageReceivedAsync);
                                }

                                break;

                            case AppConstant.Intencion.CREDITOSCUSTOM:
                                if (receivedResult.Intents[0].AllRequiredParamsPresent)
                                {
                                    var actividadManager = container.GetInstance <IActividad>();

                                    List <ActivitiesByCourseViewModel> activities = actividadManager.GetActivitiesByCourse(solicitud.IdAlumno);

                                    var filtered = activities.Where(o => o.Curso == course);


                                    await context.PostAsync(receivedResult.Speech + " " + 0);

                                    //context.Wait(MenuDialog.ResumeAfterSuccessAcademicIntent);
                                    //context.Call(new MenuDialog(), MenuDialog.ResumeAfterSuccessAcademicIntent);
                                    context.Wait(MenuDialog.MessageReceivedAsync);
                                }
                                else
                                {
                                    if (string.IsNullOrEmpty(course))
                                    {
                                        var cursoManager = container.GetInstance <ICurso>();

                                        List <CourseByModuleViewModel> studentActiveCourses = cursoManager.GetCourseByModuleActive(solicitud.IdAlumno);

                                        var questions = studentActiveCourses.Select(x => x.Curso).ToList();;

                                        string QuestionPrompt     = "Por favor seleccione el curso?";
                                        string invalidCourseInput = "La información ingresada es invalida, ingrese nuevamente su consulta";

                                        PromptOptions <string> options = new PromptOptions <string>(QuestionPrompt, "", invalidCourseInput, questions, 0);   // Overrided the PromptOptions Constructor.
                                        PromptDialog.Choice(context, MenuDialog.OnCourseSelected, options);
                                    }
                                    else
                                    {
                                        await context.PostAsync(receivedResult.Speech);
                                    }

                                    context.Wait(MenuDialog.MessageReceivedAsync);
                                }

                                break;

                            case AppConstant.Intencion.CREDITOS:
                            case AppConstant.Intencion.ORGANIZACION:
                            case AppConstant.Intencion.CALENDARIO:
                                //case "OrganizacionAulaVirtual1":
                                //context.Call(new CalendarioDialog(), ResumeAfterSuccessAcademicIntent);
                                message      = context.MakeMessage();
                                message.Text = $"Esta es una consulta de: {intent}";

                                //receivedResult.Speech = message.Text;
                                context.PrivateConversationData.SetValue("custom", message.Text);

                                await context.PostAsync(message);

                                //context.Wait(MenuDialog.MessageReceivedAsync);
                                //context.Call(new MenuDialog(), ResumeAfterSuccessAcademicIntent);
                                //context.Wait(MenuDialog.ResumeAfterSuccessAcademicIntent);
                                //context.Call(new MenuDialog(), MenuDialog.ResumeAfterSuccessAcademicIntent);

                                await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.ATENDIDO);

                                context.Wait(MenuDialog.MessageReceivedAsync);
                                break;

                            //case AppConstant.Intencion.ORGANIZACION:
                            //    context.Call(new OrganizacionDialog(), ResumeAfterSuccessAcademicIntent);
                            //    break;

                            case AppConstant.Intencion.MATRICULA:
                            case AppConstant.Intencion.ASISTENCIA:
                            case AppConstant.Intencion.RETIRO:
                            case AppConstant.Intencion.PROMEDIO:
                                //context.Call(new PreguntasFrecuentesDialog(), MenuDialog.ResumeAfterSuccessAcademicIntent);

                                //if (receivedResult.Speech.Equals(string.Empty))
                                //{
                                //    receivedResult.Speech = "Por favor, canalice su consulta vía Contacto UPC: http://www.upc.edu.pe/servicios/contacto-upc";
                                //}

                                await context.PostAsync(receivedResult.Speech);

                                await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.ATENDIDO);

                                context.Wait(MenuDialog.MessageReceivedAsync);

                                break;

                            //case AppConstant.Intencion.CREDITOS:
                            //    context.Call(new CreditosDialog(), ResumeAfterSuccessAcademicIntent);
                            //    break;
                            case AppConstant.Intencion.DEFAULT:

                                if (receivedResult.Speech.Equals(string.Empty))
                                {
                                    receivedResult.Speech = "Por favor, canalice su consulta vía Contacto UPC: http://www.upc.edu.pe/servicios/contacto-upc";
                                }

                                await context.PostAsync(receivedResult.Speech);

                                await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.INVALIDO);

                                context.Wait(MenuDialog.MessageReceivedAsync);

                                //context.Call(new NoRespuestaDialog(), MenuDialog.ResumeAfterFailedAcademicIntent);
                                break;


                            default:
                                //context.Call(new NoRespuestaDialog(), MenuDialog.ResumeAfterDerivedAcademicIntent);

                                await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.DERIVADA);

                                context.Wait(MenuDialog.MessageReceivedAsync);
                                break;
                            }
                        }
                        else
                        {
                            var userName = context.UserData.GetValue <Sesion>("sesion").Nombre;
                            var message  = context.MakeMessage();
                            message.Text = $"Uhmmm... {userName} estoy entrenándome para ayudarte más adelante con este tipo de dudas.{Environment.NewLine} Pero recuerda que vía Contacto UPC:  http://www.upc.edu.pe/servicios/contacto-upc puedes resolver tus dudas o consultas.";

                            context.PrivateConversationData.SetValue("custom", message.Text);

                            await context.PostAsync(message);

                            await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.INVALIDO);

                            //context.Wait(MenuDialog.ResumeGetAcademicIntent);
                            context.Wait(MenuDialog.MessageReceivedAsync);
                        }
                    }
                    else
                    {
                        //ExistValidIntent = false

                        //context.Call(new SinScoreDialog(), MenuDialog.ResumeAfterDerivedAcademicIntent);

                        var userName = context.UserData.GetValue <Sesion>("sesion").NombreApePaterno;

                        var message = context.MakeMessage();
                        message.Text = $"Uhmmm... {userName} estoy entrenándome para ayudarte más adelante con este tipo de dudas.{Environment.NewLine} Pero recuerda que vía Contacto UPC:  http://www.upc.edu.pe/servicios/contacto-upc puedes resolver tus dudas o consultas.";

                        context.PrivateConversationData.SetValue("custom", message.Text);

                        await context.PostAsync(message);

                        //context.Call(new MenuDialog(), MenuDialog.ResumeAfterUnknownAcademicIntent);
                        await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.INVALIDO);

                        context.Wait(MenuDialog.MessageReceivedAsync);
                    }
                }
                else
                { //ExistIntent = false
                  //await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.INVALIDO);
                  //context.Call(new SinScoreDialog(), MenuDialog.ResumeAfterUnknownAcademicIntent);
                    var userName = context.UserData.GetValue <Sesion>("sesion").NombreApePaterno;

                    string sinScoreDialogSpeech =
                        $"Uhmmm... {userName} estoy entrenándome para ayudarte más adelante con este tipo de dudas.{Environment.NewLine}. Pero recuerda que vía Contacto UPC: http://www.upc.edu.pe/servicios/contacto-upc puedes resolver tus dudas o consultas";

                    await context.PostAsync(sinScoreDialogSpeech);

                    //context.Call(new MenuDialog(), MenuDialog.ResumeAfterUnknownAcademicIntent);

                    await ActualizarSolicitud(context, AppConstant.EstadoSolicitud.INVALIDO);

                    context.Wait(MenuDialog.MessageReceivedAsync);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                BaseData.LogError(ex);
            }
        }