/// <summary> /// Method to as the answer not necessary qualification /// </summary> public void NextQuery2(ChatViewModel chat2) { var db = new SamiEntities(); var claseHtml = 0; //Get notification from DB by ID var request = (from notification in db.AgentRequestNotifications where notification.RequesterGroup == chat2.Group && notification.AttendedByAgent == false && notification.AttendedByAgentDate == null select notification); if (request.Any()) { var date = request.First(); //Mark the request as attended date.AttendedByAgent = true; date.AttendedByAgentDate = DateTime.Now; //Save changes db.AgentRequestNotifications.AddOrUpdate(date); db.SaveChanges(); if (chat2.Group.Count() > 1) { claseHtml++; } //Craft a chat model object chat2.Message = $"<div id='validatortimeOutAgent'><span>Nuestros Agentes se encuentran ocupados, ¿deseas seguir esperando? o me autorizas para cancelar la petición y enviar el caso al correo de los agentes humanos</span><div class='form-inline'>" + "<button type='button' class='btn btn-sami-success mb-2 mr-sm-2 mb-sm-0 QueueForAgentChatAgain'><i class='fa fa-check'></i> Deseo Esperar</button>" + "<button type='button' class='btn btn-sami-success mb-2 mr-sm-2 mb-sm-0 CancelRequest'><i class='fa fa-close'></i> Deseo cancelar</button>" + "</div>" + "</div>"; chat2.Name = "S@mi"; chat2.ProfilePictureLocation = "bot-avatar.png"; //Send message letting user know a agent has attended his request and connected to chat Clients.Client(chat2.ConnectionId).addChatMessage(chat2); } }
public string GetListFile() { SamiEntities db = new SamiEntities(); int company = User.Identity.GetCompanyId(); var filesAdd = new GetListFiles(); var jsonConvert = ""; var getFiles = (from files in db.ControlArchivos where files.IdCompany == company select files); if (getFiles.Any()) { foreach (var files in getFiles.ToList()) { var extension = files.FileName.Split('.'); var getList = new getFileList { name = files.FileName, url = files.FileUpload, extension = extension[1] }; filesAdd.GetListFilesAdd.Add(getList); } jsonConvert = JsonConvert.SerializeObject(filesAdd.GetListFilesAdd.ToList()); } else { jsonConvert = "error"; } return(jsonConvert); }
#pragma warning restore 1591 /// <summary> /// Generate chat history file from database chat history by ID /// </summary> /// <param name="id">Chat connection ID</param> /// <returns>Text file containing chat history</returns> public ActionResult GenerateHistory(string id) { var db = new SamiEntities(); //Load messages from database var chatMessages = (from chat in db.Chats join session in db.HistoricoSesions on chat.IdSesion equals session.IdSesion where session.SessionConnectionId == id select chat).ToList(); //Get user manager object from HTTP context var userManager = HttpContext.GetOwinContext() .GetUserManager <ApplicationUserManager>(); var sb = new StringBuilder(); foreach (var chatMessage in chatMessages) { string texto = chatMessage.Texto.Replace("<script>AutoQueueForAgentChat();</script>", ""); if (chatMessage.Fecha != null) { /* * Generate a text line with date, user and chat text, this line uses a ternary resolution * to find out if a message was sent by a human user or was generated by the system / bot */ sb.AppendLine(!string.IsNullOrEmpty(chatMessage.UserID) ? $"[{chatMessage.Fecha.Value}] {userManager.FindById(chatMessage.UserID).UserName}: {chatMessage.Texto}" : $"[{chatMessage.Fecha.Value}] Pólux: {texto}"); } } //Encode generated string to byte array var byteArray = Encoding.UTF8.GetBytes(sb.ToString()); //Return file from memory, file will download automatically on user's browser return(File(new MemoryStream(byteArray), "text/plain", $"ChatHistory-{DateTime.Now:yyyy-MM-dd hhmmss}.txt")); }
public ActionResult Delete(int id) { try { using (SamiEntities db = new SamiEntities()) { Compania emp = db.Companias.Where(x => x.IdCompania == id).FirstOrDefault <Compania>(); db.Companias.Remove(emp); var valor = db.SaveChanges(); if (valor == 1) { return(Json(new { success = true, message = "Se ha eliminado la compañía correctamente" }, JsonRequestBehavior.AllowGet)); } else { return(Json(new { success = false, message = "Error, se ha encontrado un problema, intentelo de nuevo" }, JsonRequestBehavior.AllowGet)); } } } catch (Exception ex) { return(Json(new { success = false, message = ex.Message }, JsonRequestBehavior.AllowGet)); } }
/// <summary> /// Consultar el ticket solicitado por un usuario. /// Retorna un string. /// </summary> /// <param name="query"></param> /// <param name="companyId"></param> /// <returns></returns> public async Task <string> GetTicketCa(string query, int companyId) { // Se inicializa las variables int login = 0; string first = "", second = "", third = "", fourth = "", fifth = "", sixth = "", crConsultado = "", groupId = "", resultadoFinal = ""; // Conexión a la base de datos SamiEntities db = new SamiEntities(); // Consulta parametros de CA var connectionCA = (from connCa in db.ConexionCAs where connCa.IdCompania == companyId select connCa).First(); // Web Service SOAP CA. CaConexionSaludTotal.USD_WebServiceSoapClient ca = new CaConexionSaludTotal.USD_WebServiceSoapClient(); // Se logea por ca login = ca.login(connectionCA.UsuarioCA, connectionCA.PasswordCA); // Atributos de consulta string[] datos = { "status.sym", "assignee.userid", "assignee.combo_name", "description" }; // Se consulta el cr del caso, el estado, el asignado y la descripción del usuario first = ca.doSelect(login, "cr", $"ref_num='{query}'", 1, datos); // Convertimos el archivo xml en texto XElement firstX = XElement.Parse(first); // Se toma solo las etiquetas <Handle>cr:</Handle> var att = firstX.Descendants("Handle").ToList(); // Se guarda el cr extraido. foreach (var item in att) { crConsultado = item.Value; } // Separamos el id del grupo var idGroup = firstX.Descendants("AttrValue").ToList(); // Se consulta el atributo tipo de solicitud string[] datos2 = { "type.sym" }; // Se consulta por segunda vez para traer el tipo de solicitud, en este caso se ingresa el CR consultado second = ca.doSelect(login, "cr", $"persistent_id='{crConsultado}'", 255, datos2); // Se convierte la respuesta XML a Texto XElement secondX = XElement.Parse(second); // Se consulta el atributo de la descripción string[] datos3 = { "description" }; // Consultar el comentario en proceso, trae todos los comentarios concatenados third = ca.doSelect(login, "alg", $"call_req_id='{crConsultado}' and type in ('ST','LOG','TR','RE', 'CB', 'RS', 'SOLN', 'ESC', 'NF')", 255, datos3); // Se convierte el resultado XML en texto XElement thirdX = XElement.Parse(third); // Consultar el comentario en proceso, trae todos los comentarios concatenados sixth = ca.doSelect(login, "alg", $"call_req_id='{crConsultado}' and type in ('ST','LOG','TR','RE', 'CB', 'RS', 'SOLN', 'ESC', 'NF')", 255, datos3); // Se convierte el resultado XML en texto XElement sixthX = XElement.Parse(sixth); // Consultar el comentario resuelto fourth = ca.doSelect(login, "alg", $"call_req_id='{crConsultado}' and type = 'RE'", 255, datos3); // Se convierte el resultado XML en texto XElement fourthX = XElement.Parse(fourth); // Se consulta el atributo de la descripción string[] datos5 = { "last_mod_dt" }; // Consultar el comentario en proceso, trae todos los comentarios concatenados fifth = ca.doSelect(login, "cr", $"persistent_id='{crConsultado}'", 255, datos5); // Se convierte el resultado XML en texto XElement seventh = XElement.Parse(fifth); // Se toma solo las etiquetas <AttrValue></AttrValue> del XML var finalAtt = firstX.Descendants("AttrValue").ToList(); var finalAtt2 = secondX.Descendants("AttrValue").ToList(); var finalAtt3 = thirdX.Descendants("AttrValue").ToList(); var finalAtt4 = fourthX.Descendants("AttrValue").ToList(); var finalAtt6 = sixthX.Descendants("AttrValue").ToList(); var finalAtt7 = seventh.Descendants("AttrValue"); var time = Convert.ToInt64(finalAtt7.First().Value); var timeConvert = UnixTimeToDateTime(time); // Se crea array de cadena de texto. string[] lista = { "<strong>Tipo de Caso:</strong> " }; string[] lista2 = { "<br/><strong>Estado:</strong> ", "<br/><strong>Caso Asignado a:</strong> ", "<br/><strong>Grupo: </strong>", "<br/><strong>Descripción usuario:</strong> " }; string[] lista3 = { "<br/><strong>Comentario en Proceso:</strong><br/>" }; string[] lista4 = { "<br/><strong>Comentario Final:</strong><br/>" }; // Se combina el resultado de CA con la cadena de Array var answerCA = finalAtt2.Zip(lista, (n, w) => new { Number = n, Word = w }); var answerCA2 = finalAtt.Zip(lista2, (n, w) => new { Number = n, Word = w }); var answerCA3 = finalAtt3.Zip(lista3, (n, w) => new { Number = n, Word = w }); var answerCA4 = finalAtt4.Zip(lista4, (n, w) => new { Number = n, Word = w }); // Tipo de Solicitud foreach (var nw in answerCA) { // Se imprime los resultados junto con la cadena de array, aquí se elimina el <AttrValue></AttrValue> resultadoFinal += String.Join(" ", nw.Word.ToString() + nw.Number.Value); } // Asignado a:, descripción del usuario y el estado del caso. foreach (var nw in answerCA2) { // Se imprime los resultados junto con la cadena de array, aquí se elimina el <AttrValue></AttrValue> resultadoFinal += String.Join(" ", nw.Word.ToString() + nw.Number.Value); } // Se valida si el tipo de solicitud es Resuelto o Cerrado if (resultadoFinal.Contains("Resuelto") || resultadoFinal.Contains("Cerrado")) { // Si tiene el estado Resuelto o Cerrado se consulta el comentario final, hecho por el agente humano foreach (var nw in answerCA4) { // Se imprime los resultados junto con la cadena de array, aquí se elimina el <AttrValue></AttrValue> resultadoFinal += String.Join(" ", nw.Word.ToString() + nw.Number.Value); } resultadoFinal += $"<div><strong>Fecha de última actualización:</strong>{timeConvert}</div>"; } else { if (resultadoFinal.Contains("Abierto")) { } else { // Si contiene otro estado, como Abierto, Re-Abierto, en proceso, genera la lista de todos los comentarios del proceso resultadoFinal += $"<div><strong>Fecha de última actualización:</strong>{timeConvert}</div>"; var data = ""; foreach (var nw in finalAtt3) { // Validamos si la respuesta fue hecha por el sistema. if (nw.Value.Contains("AHD") || nw.Value.Contains("Transferir")) { // Si fue hecha por el sistema, lo ignora y no lo imprime resultadoFinal += ""; } else { // Si el comentario fue hecho por un agente humano, lo imprime. foreach (var item in finalAtt6) { data = item.Value; } } } resultadoFinal += data; resultadoFinal += "<br/><strong>Comentario en Proceso:</strong><br/>"; } } // Cierra sesión ca.logout(login); // Retorna la consulta del ticket return(resultadoFinal); }
public ActionResult Index() { if (Request["autoAgent"] != null) { //Check user roles if (User.IsInRole("Usuario")) { //Redirect to respective index view return(RedirectToAction("Index", "Chat", new { autoAgent = "true" })); } } //Check user roles if (User.IsInRole("Usuario")) { //Redirect to respective index view return(RedirectToAction("Index", "Chat")); } //Check user roles if (User.IsInRole("Agente")) { //Redirect to respective index view return(RedirectToAction("Index", "Agent")); } if (User.IsInRole("Entrenador")) { return(RedirectToAction("Index", "Coach")); } if (User.IsInRole("Supervisor")) { return(RedirectToAction("Index", "Supervisor")); } if (Request["resultados"] != null && Request["email"] != null && Request["name"] != null) { // Variable de la pregunta del usuario string text2 = Request["resultados"]; byte[] data2 = Convert.FromBase64String(text2); string questionUser = System.Text.Encoding.UTF8.GetString(data2); // Correo del usuario consultado en Webex Teams string text1 = Request["email"]; byte[] data1 = Convert.FromBase64String(text1); string emailUser = System.Text.Encoding.UTF8.GetString(data1); string name = Request["name"]; // SamiEntities db = new SamiEntities(); // Get Data Connection CA // Query conexion usuarios var userName = (from users in _db.AspNetUsers where users.UserName == name select users).First(); // Query conexión CA var connectionCA = (from connCa in _db.ConexionCAs where connCa.IdCompania == userName.CompanyId select connCa).First(); // Query si ya fue calificado var qualifity = (from califica in _db.ChatReportSamis where califica.UserName == name orderby califica.Id descending select califica).First(); // Variables var answers = ""; var ticket = ""; string[] separar; string casoID = ""; string descripcion = ""; string estado = ""; var returnVal = ""; if (qualifity.No_Caso != null) { returnVal = "/Error_Page"; } if (questionUser == "Si, quedé satisfecho con la calificación") { // Se crea el caso //Registrar casos service manager var caseManager = new CasosGenerado { Numero_Caso = casoID, Usuario = name, Descripcion = descripcion, Estado = estado, Plataforma = "Webex" }; db.CasosGenerados.Add(caseManager); db.SaveChanges(); returnVal = "/Success"; } else if (questionUser == "No, deseo generar caso abierto") { // Se crea el ticket var caseManager = new CasosGenerado { Numero_Caso = casoID, Usuario = name, Descripcion = descripcion, Estado = estado, Plataforma = "Webex" }; db.CasosGenerados.Add(caseManager); db.SaveChanges(); returnVal = "/Error"; } return(RedirectToAction(returnVal, "BOT", new { nombre = name, idCase = casoID })); } return(View()); }