private void CargaDatosDashboard() { try { int?idGrupo = ddlGrupo.SelectedIndex <= BusinessVariables.ComboBoxCatalogo.IndexSeleccione ? (int?)null : int.Parse(ddlGrupo.SelectedValue); int?idUsuario = ddlAgente.SelectedIndex <= BusinessVariables.ComboBoxCatalogo.IndexSeleccione ? (int?)null : int.Parse(ddlAgente.SelectedValue); DashboardAgente datos = _servicioDashBoard.GetDashboardAgente(idGrupo, idUsuario); lblTitlePeriodo.Text = string.Format(" {0} - {1}", datos.FechaFinPeriodoActual.ToString("dd/MM/yyyy"), datos.FechaInicioPeriodoActual.ToString("dd/MM/yyyy")); lblTicketsAcumulados.Text = datos.TotalTickets.ToString(); lblTicketsAbiertos7dias.Text = datos.TicketsAbiertos.ToString(); lblTicketsCreados7dias.Text = datos.TicketsCreados.ToString(); lblTicketsResueltos7dias.Text = datos.TicketsResuletos.ToString(); lblTicketsResCreados7dias.Text = string.Format("{0} %", datos.TicketsResuletosVsCreados); lblTicketsReabiertos7dias.Text = string.Format("{0} %", datos.TicketsResuletosVsReabiertos); lblTiempoPromedioPrimeraRespuestaActual.Text = datos.PromedioPrimeraRespuestaActual; lblIndicadorTiempoPromedioPrimeraRespuestaActual.CssClass = datos.DiferenciaPromedioRespuestaPorcentaje == 0 ? "fa fa-minus" : (datos.DiferenciaPromedioRespuestaPorcentaje < 0 ? "icon-down-dir-fontello fontGreen " : "icon-up-dir-fontello fontRed"); lblTiempoPromedioPrimeraRespuestaPorcentaje.Text = datos.DiferenciaPromedioRespuestaPorcentaje == 0 ? "" : string.Format("{0} %", datos.DiferenciaPromedioRespuestaPorcentaje.ToString("0.##")); lblTiempoPromedioPrimeraRespuestaPorcentaje.CssClass = datos.DiferenciaPromedioRespuestaPorcentaje == 0 ? "fa fa-minus margin-right-15" : (datos.DiferenciaPromedioRespuestaPorcentaje < 0 ? "fontGreen" : "fontRed"); lblTiempoPromedioPrimeraRespuestaAnterior.Text = datos.PromedioPrimeraRespuestaAnterior; lblTiempoPromedioResolucionActual.Text = datos.PromedioTiempoResolucionActual; lblIndicadorTiempoPromedioResolucionActual.CssClass = datos.PromedioTiempoResolucionPorcentaje == 0 ? "fa fa-minus" : (datos.PromedioTiempoResolucionPorcentaje < 0 ? "icon-down-dir-fontello fontGreen" : "icon-up-dir-fontello fontRed"); lblTiempoPromedioResolucionPorcentaje.Text = datos.PromedioTiempoResolucionPorcentaje == 0 ? "" : string.Format("{0} %", datos.PromedioTiempoResolucionPorcentaje.ToString("0.##")); lblTiempoPromedioResolucionPorcentaje.CssClass = datos.PromedioTiempoResolucionPorcentaje == 0 ? "fa fa-minus margin-right-15" : (datos.PromedioTiempoResolucionPorcentaje < 0 ? "fontRed" : "fontGreen"); lblTiempoPromedioResolucionAnterior.Text = datos.PromedioTiempoResolucionAnterior; lblResolucionAlPrimerContactoPromedioActual.Text = datos.PromedioResolucionPrimercontactoActual; lblIndicadorResolucionAlPrimerContactoPromedioActual.CssClass = datos.PromedioResolucionPrimercontactoPorcentaje == 0 ? "fa fa-minus" : (datos.PromedioResolucionPrimercontactoPorcentaje < 0 ? "icon-down-dir-fontello fontRed" : "icon-up-dir-fontello fontGreen"); lblResolucionAlPrimerContactoPromedioPorcentaje.Text = datos.PromedioResolucionPrimercontactoPorcentaje == 0 ? "" : string.Format("{0} %", datos.PromedioResolucionPrimercontactoPorcentaje.ToString("0.##")); lblResolucionAlPrimerContactoPromedioPorcentaje.CssClass = datos.PromedioResolucionPrimercontactoPorcentaje == 0 ? "fa fa-minus margin-right-15" : (datos.PromedioResolucionPrimercontactoPorcentaje < 0 ? "fontRed" : "fontGreen"); lblResolucionAlPrimerContactoPromedioAnterior.Text = datos.PromedioResolucionPrimercontactoAnterior; lblIntervencionesAgenteActual.Text = datos.PromedioIntervencionesAgenteActual.ToString(); lblIndicadorIntervencionesAgenteActual.CssClass = datos.PromedioIntervencionesAgentePorcentaje == 0 ? "fa fa-minus" : (datos.PromedioIntervencionesAgentePorcentaje < 0 ? "icon-down-dir-fontello fontGreen" : "icon-up-dir-fontello fontRed"); lblIntervencionesAgentePorcentaje.Text = datos.PromedioIntervencionesAgentePorcentaje == 0 ? "" : string.Format("{0} %", datos.PromedioIntervencionesAgentePorcentaje.ToString("0.##")); lblIntervencionesAgentePorcentaje.CssClass = datos.PromedioIntervencionesAgentePorcentaje == 0 ? "fa fa-minus margin-right-15" : (datos.PromedioIntervencionesAgentePorcentaje < 0 ? "fontGreen" : "fontRed"); lblIntervencionesAgenteAnterior.Text = datos.PromedioIntervencionesAgenteAnterior.ToString(); lblClientesUnicosAtendidosActual.Text = datos.ClientesAtendidosActual.ToString(); lblIndicadorClientesUnicosAtendidosActual.CssClass = datos.ClientesAtendidosAnterior == 0 ? "fa fa-minus" : (datos.ClientesAtendidosAnterior < 0 ? "icon-down-dir-fontello fontRed" : "icon-up-dir-fontello fontGreen"); lblClientesUnicosAtendidosPorcentaje.Text = datos.ClientesAtendidosPorcentaje == 0 ? "" : string.Format("{0} %", datos.ClientesAtendidosPorcentaje.ToString("0.##")); lblClientesUnicosAtendidosPorcentaje.CssClass = datos.ClientesAtendidosPorcentaje == 0 ? "fa fa-minus margin-right-15" : (datos.ClientesAtendidosPorcentaje < 0 ? "fontRed" : "fontGreen"); lblClientesUnicosAtendidosAnterior.Text = datos.ClientesAtendidosAnterior.ToString(); GeneraGraficaPie(rhcTicketsAbiertos, datos.GraficoTicketsAbiertos, false); GeneraGraficaStackedBar(rhcTicketsPrioridad, datos.GraficoTicketsPrioridad); GeneraGraficaPie(rhcTicketsCanal, datos.GraficoTicketsCanal, true); GeneraGraficaArea(datos.GraficoTicketsCreadosResueltos); rptMetricasGrupo.DataSource = datos.GruposMetricas; rptMetricasGrupo.DataBind(); } catch (Exception ex) { throw new Exception(ex.Message); } }
public DashboardAgente GetDashboardAgente(int?idGrupo, int?idUsuario) { DashboardAgente result; DataBaseModelContext db = new DataBaseModelContext(); try { result = new DashboardAgente(); List <int> lstEstatusCreado = new List <int> { (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Abierto, (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.ReAbierto, (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.EnEspera }; List <int> lstEstatusAbierto = new List <int> { (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Abierto, (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.ReAbierto, (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.EnEspera }; List <int> lstEstatusResuelto = new List <int> { (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Resuelto, (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Cerrado }; //Paramtreoo dias periodo int daysPeriod = ObtenerDiasPeriodo(); //Fechas periodoActual DateTime startCurrentDate = Convert.ToDateTime(DateTime.Now.AddDays(-1).ToShortDateString() + " 23:59:59"); DateTime endCurrentDate = Convert.ToDateTime(startCurrentDate.AddDays(-daysPeriod).ToShortDateString()); result.FechaInicioPeriodoActual = startCurrentDate; result.FechaFinPeriodoActual = endCurrentDate; //Fechas Periodo anterior DateTime startPreviuosDate = Convert.ToDateTime(endCurrentDate.AddDays(-1).ToShortDateString() + " 23:59:59"); DateTime endPreviousDate = Convert.ToDateTime(startPreviuosDate.AddDays(-daysPeriod).ToShortDateString()); result.FechaInicioPeriodoAnterior = startPreviuosDate; result.FechaFinPeriodoAnterior = endPreviousDate; var qryCurrentTickets = from t in db.Ticket join tgu in db.TicketGrupoUsuario on t.Id equals tgu.IdTicket where t.FechaHoraAlta <= startCurrentDate && t.FechaHoraAlta >= endCurrentDate select new { t, tgu }; var qryPreviousTickets = from t in db.Ticket join tgu in db.TicketGrupoUsuario on t.Id equals tgu.IdTicket where t.FechaHoraAlta <= startPreviuosDate && t.FechaHoraAlta >= endPreviousDate select new { t, tgu }; if (idGrupo != null) { qryCurrentTickets = from q in qryCurrentTickets where q.tgu.IdGrupoUsuario == idGrupo select q; qryPreviousTickets = from q in qryPreviousTickets where q.tgu.IdGrupoUsuario == idGrupo select q; } if (idUsuario != null) { List <int> idTicketsToco = db.TicketAsignacion.Where(w => w.IdUsuarioAsignado == idUsuario).Select(s => s.IdTicket).Distinct().ToList(); qryCurrentTickets = from q in qryCurrentTickets where idTicketsToco.Contains(q.t.Id) select q; qryPreviousTickets = from q in qryPreviousTickets where idTicketsToco.Contains(q.t.Id) select q; } List <int> lstCreatedTicketsCurrent = qryCurrentTickets.Select(s => s.t.Id).Distinct().ToList(); List <int> lstCreatedTicketsPrevious = qryPreviousTickets.Select(s => s.t.Id).Distinct().ToList(); List <int> ticketResuletos = db.Ticket.Where(c => lstCreatedTicketsCurrent.Contains(c.Id) && lstEstatusResuelto.Contains(c.IdEstatusTicket)).Select(s => s.Id).Distinct().ToList(); result.TotalTickets = db.Ticket.Count(c => c.FechaHoraAlta <= startCurrentDate && lstEstatusAbierto.Contains(c.IdEstatusTicket)); result.TicketsAbiertos = db.Ticket.Count(c => lstCreatedTicketsCurrent.Contains(c.Id) && lstEstatusAbierto.Contains(c.IdEstatusTicket)); result.TicketsCreados = lstCreatedTicketsCurrent.Count; result.TicketsResuletos = ticketResuletos.Count(); result.TicketsResuletosVsCreados = result.TicketsCreados > 0 ? Math.Truncate(double.Parse((decimal.Parse(result.TicketsResuletos.ToString()) / decimal.Parse(result.TicketsCreados.ToString())).ToString()) * 100) : 0; result.TotalTicketsReabiertos = db.TicketAsignacion.Where(w => ticketResuletos.Contains(w.IdTicket) && w.IdEstatusAsignacion == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.ReAbierto).Distinct().Count(); result.TicketsResuletosVsReabiertos = result.TotalTicketsReabiertos > 0 ? Math.Truncate(double.Parse((decimal.Parse(result.TicketsResuletos.ToString()) / decimal.Parse(result.TotalTicketsReabiertos.ToString())).ToString()) * 100) : 0; #region Primera Respuesta //Primera Respuesta Periodo Actual List <double> currentDiffResponse = new List <double>(); List <int> currentTicketsResponse = db.TicketConversacion.Where(w => lstCreatedTicketsCurrent.Contains(w.IdTicket) && w.IdUsuario != w.Ticket.IdUsuarioLevanto).Select(s => s.IdTicket).Distinct().ToList(); foreach (int idticket in currentTicketsResponse) { TicketConversacion firstCommentResponse = db.TicketConversacion.Where(w => w.IdTicket == idticket && w.IdUsuario != w.Ticket.IdUsuarioLevanto).OrderBy(o => o.FechaGeneracion).FirstOrDefault(); if (firstCommentResponse != null) { Ticket currentTicketResponse = db.Ticket.SingleOrDefault(s => s.Id == idticket); if (currentTicketResponse != null) { currentDiffResponse.Add((firstCommentResponse.FechaGeneracion - currentTicketResponse.FechaHoraAlta).TotalSeconds); } } } double currentAvgSecondsResponse = currentDiffResponse.Count > 0 ? currentDiffResponse.Average(a => a) : 0; TimeSpan currentTimeResponse = currentDiffResponse.Count > 0 ? TimeSpan.FromSeconds(currentAvgSecondsResponse) : TimeSpan.FromSeconds(0); result.PromedioPrimeraRespuestaSegundosActual = currentAvgSecondsResponse; result.PromedioPrimeraRespuestaActual = string.Format("{0}:{1}", int.Parse(Math.Truncate(decimal.Parse(currentTimeResponse.TotalHours.ToString("0.##"))).ToString()), Math.Abs(currentTimeResponse.Minutes).ToString().PadLeft(2, '0')); //Primera Respuesta PeriodoAnterior List <double> previousDiffResponse = new List <double>(); List <int> previousTicketsResponse = db.TicketConversacion.Where(w => lstCreatedTicketsPrevious.Contains(w.IdTicket) && w.IdUsuario != w.Ticket.IdUsuarioLevanto).Select(s => s.IdTicket).Distinct().ToList(); foreach (int idticket in previousTicketsResponse) { TicketConversacion firstCommentResponse = db.TicketConversacion.Where(w => w.IdTicket == idticket && w.IdUsuario != w.Ticket.IdUsuarioLevanto).OrderBy(o => o.FechaGeneracion).FirstOrDefault(); if (firstCommentResponse != null) { Ticket previousTicketResponse = db.Ticket.SingleOrDefault(s => s.Id == idticket); if (previousTicketResponse != null) { previousDiffResponse.Add((firstCommentResponse.FechaGeneracion - previousTicketResponse.FechaHoraAlta).TotalSeconds); } } } double previousAvgSecondsResponse = previousDiffResponse.Count > 0 ? previousDiffResponse.Average(a => a) : 0; TimeSpan previousTimeResponse = previousDiffResponse.Count > 0 ? TimeSpan.FromSeconds(previousDiffResponse.Average(a => a)) : TimeSpan.FromSeconds(0); decimal previousAvgHourMinResponse = decimal.Parse(string.Format("{0}.{1}", int.Parse(Math.Truncate(decimal.Parse(previousTimeResponse.TotalHours.ToString("0.##"))).ToString()), Math.Abs(previousTimeResponse.Minutes))); result.PromedioPrimeraRespuestaSegundosAnterior = previousAvgSecondsResponse; result.PromedioPrimeraRespuestaAnterior = string.Format("{0}:{1}", int.Parse(Math.Truncate(decimal.Parse(previousTimeResponse.TotalHours.ToString("0.##"))).ToString()), Math.Abs(previousTimeResponse.Minutes).ToString().PadLeft(2, '0')); double diffPeriodsSecondsResponse = result.PromedioPrimeraRespuestaSegundosActual - result.PromedioPrimeraRespuestaSegundosAnterior; result.DiferenciaPromedioRespuestaPorcentaje = previousAvgHourMinResponse == 0 ? 0 : (diffPeriodsSecondsResponse / previousAvgSecondsResponse) * 100; #endregion Primera Respuesta #region Tiempo Resolucion //Tiempo Resolucion Periodo Actual List <double> currentDiffSolvedSeconds = new List <double>(); List <int> currentTicketsSolved = db.TicketEstatus.Where(w => lstCreatedTicketsCurrent.Contains(w.IdTicket) && w.IdEstatus == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Resuelto).Select(s => s.IdTicket).Distinct().ToList(); foreach (int idticket in currentTicketsSolved) { TicketEstatus firstSolved = db.TicketEstatus.Where(w => w.IdTicket == idticket && w.IdEstatus == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Resuelto).OrderBy(o => o.FechaMovimiento).FirstOrDefault(); if (firstSolved != null) { Ticket ticket = db.Ticket.SingleOrDefault(s => s.Id == idticket); if (ticket != null) { currentDiffSolvedSeconds.Add((firstSolved.FechaMovimiento - ticket.FechaHoraAlta).TotalSeconds); } } } double currentAvgSecondsSolved = currentDiffSolvedSeconds.Count > 0 ? currentDiffSolvedSeconds.Average(a => a) : 0; TimeSpan currentTimeSolved = TimeSpan.FromSeconds(currentAvgSecondsSolved); result.PromedioTiempoResolucionSegundosActual = currentAvgSecondsSolved; result.PromedioTiempoResolucionActual = string.Format("{0}:{1}", int.Parse(Math.Truncate(decimal.Parse(currentTimeSolved.TotalHours.ToString("0.##"))).ToString()), Math.Abs(currentTimeSolved.Minutes).ToString().PadLeft(2, '0')); //Tiempo Resolucion Periodo Anterior List <double> previousDiffSolvedSeconds = new List <double>(); List <int> previousTicketsSolved = db.TicketEstatus.Where(w => lstCreatedTicketsPrevious.Contains(w.IdTicket) && w.IdEstatus == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Resuelto).Select(s => s.IdTicket).Distinct().ToList(); foreach (int idticket in previousTicketsSolved) { TicketEstatus firstPreviousSolved = db.TicketEstatus.Where(w => w.IdTicket == idticket).OrderBy(o => o.FechaMovimiento).FirstOrDefault(); if (firstPreviousSolved != null) { Ticket ticketPreviousSolved = db.Ticket.SingleOrDefault(s => s.Id == idticket); if (ticketPreviousSolved != null) { previousDiffSolvedSeconds.Add((firstPreviousSolved.FechaMovimiento - ticketPreviousSolved.FechaHoraAlta).TotalSeconds); } } } double previousAvgSecondsSolved = previousDiffSolvedSeconds.Count > 0 ? previousDiffSolvedSeconds.Average(a => a) : 0; TimeSpan previousTimeSolved = TimeSpan.FromSeconds(previousAvgSecondsSolved); decimal previousAvgHourMinSolved = decimal.Parse(string.Format("{0}.{1}", int.Parse(Math.Truncate(decimal.Parse(previousTimeSolved.TotalHours.ToString("0.##"))).ToString()), Math.Abs(previousTimeSolved.Minutes))); result.PromedioTiempoResolucionSegundosAnterior = previousAvgSecondsSolved; result.PromedioTiempoResolucionAnterior = string.Format("{0}:{1}", int.Parse(Math.Truncate(decimal.Parse(previousTimeSolved.TotalHours.ToString("0.##"))).ToString()), Math.Abs(previousTimeSolved.Minutes).ToString().PadLeft(2, '0')); double diffPeriodsSecondsSolved = result.PromedioTiempoResolucionSegundosActual - result.PromedioTiempoResolucionSegundosAnterior; result.PromedioTiempoResolucionPorcentaje = previousAvgHourMinSolved == 0 ? 0 : (diffPeriodsSecondsSolved / previousAvgSecondsSolved) * 100; #endregion Tiempo Resolucion #region Tiempo Resolucion Primer Contacto //Tiempo Resolucion Primer Contacto Actual List <double> currentDiffFirstContactSeconds = new List <double>(); List <int> currentTicketsFirstContact = db.TicketEstatus.Where(w => lstCreatedTicketsCurrent.Contains(w.IdTicket) && w.IdEstatus == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Resuelto).Select(s => s.IdTicket).Distinct().ToList(); foreach (int idticket in currentTicketsFirstContact) { TicketEstatus firstFirstContact = db.TicketEstatus.Where(w => w.IdTicket == idticket && w.IdEstatus == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Resuelto) .OrderBy(o => o.FechaMovimiento) .FirstOrDefault(); if (firstFirstContact != null && !db.TicketEstatus.Any(a => a.IdTicket == idticket && a.Id > firstFirstContact.Id)) { Ticket ticketFirstContact = db.Ticket.SingleOrDefault(s => s.Id == idticket); if (ticketFirstContact != null) { currentDiffFirstContactSeconds.Add((firstFirstContact.FechaMovimiento - ticketFirstContact.FechaHoraAlta).TotalSeconds); } } } double currentAvgSecondsFirstContact = currentDiffFirstContactSeconds.Count > 0 ? currentDiffFirstContactSeconds.Average(a => a) : 0; TimeSpan currentTimeFirstContact = TimeSpan.FromSeconds(currentAvgSecondsFirstContact); result.PromedioResolucionPrimercontactoSegundosActual = currentAvgSecondsFirstContact; result.PromedioResolucionPrimercontactoActual = string.Format("{0}:{1}", int.Parse(Math.Truncate(decimal.Parse(currentTimeFirstContact.TotalHours.ToString("0.##"))).ToString()), Math.Abs(currentTimeFirstContact.Minutes).ToString().PadLeft(2, '0')); //Tiempo Resolucion Primer Contacto Anterior List <double> previousDiffFirstContactSeconds = new List <double>(); List <int> previousTicketsFirstContact = db.TicketEstatus.Where(w => lstCreatedTicketsPrevious.Contains(w.IdTicket) && w.IdEstatus == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Resuelto).Select(s => s.IdTicket).Distinct().ToList(); foreach (int idticket in previousTicketsFirstContact) { TicketEstatus firstPreviousFirstContact = db.TicketEstatus.Where(w => w.IdTicket == idticket && w.IdEstatus == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Resuelto).OrderBy(o => o.FechaMovimiento).FirstOrDefault(); if (firstPreviousFirstContact != null && !db.TicketEstatus.Any(a => a.IdTicket == idticket && a.Id > firstPreviousFirstContact.Id)) { Ticket ticketPreviousFirstContact = db.Ticket.SingleOrDefault(s => s.Id == idticket); if (ticketPreviousFirstContact != null) { previousDiffFirstContactSeconds.Add((firstPreviousFirstContact.FechaMovimiento - ticketPreviousFirstContact.FechaHoraAlta).TotalSeconds); } } } double previousAvgSecondsFirstContact = previousDiffFirstContactSeconds.Count > 0 ? previousDiffFirstContactSeconds.Average(a => a) : 0; TimeSpan previousTimeFirstContact = TimeSpan.FromSeconds(previousAvgSecondsFirstContact); decimal previousAvgHourMinFirstContact = decimal.Parse(string.Format("{0}.{1}", int.Parse(Math.Truncate(decimal.Parse(previousTimeFirstContact.TotalHours.ToString("0.##"))).ToString()), Math.Abs(previousTimeFirstContact.Minutes))); result.PromedioResolucionPrimercontactoSegundosAnterior = previousAvgSecondsFirstContact; result.PromedioResolucionPrimercontactoAnterior = string.Format("{0}:{1}", int.Parse(Math.Truncate(decimal.Parse(previousTimeFirstContact.TotalHours.ToString("0.##"))).ToString()), Math.Abs(previousTimeFirstContact.Minutes).ToString().PadLeft(2, '0')); double diffPeriodsSecondsFirstContact = result.PromedioResolucionPrimercontactoSegundosActual - result.PromedioResolucionPrimercontactoSegundosAnterior; result.PromedioResolucionPrimercontactoPorcentaje = previousAvgHourMinFirstContact == 0 ? 0 : (diffPeriodsSecondsFirstContact / previousAvgSecondsFirstContact) * 100; #endregion Tiempo Resolucion Primer Contacto #region Intervenciones Agente //Intervenciones Agente Primer Contacto Actual List <int> currentInterventionsAgents = new List <int>(); List <int> currentTicketsInterventionsAgents = db.TicketAsignacion.Where(w => lstCreatedTicketsCurrent.Contains(w.IdTicket) && lstEstatusResuelto.Contains(w.Ticket.IdEstatusTicket) && w.IdUsuarioAsignado != w.Ticket.IdUsuarioLevanto).Select(s => s.IdTicket).Distinct().ToList(); foreach (int idticket in currentTicketsInterventionsAgents) { List <int?> firstFirstContact = db.TicketAsignacion.Where(w => w.IdTicket == idticket && w.IdUsuarioAsignado != w.Ticket.IdUsuarioLevanto && w.IdUsuarioAsignado != null).Select(s => s.IdUsuarioAsignado).Distinct().ToList(); if (firstFirstContact.Count > 0) { currentInterventionsAgents.Add(firstFirstContact.Count); } } result.PromedioIntervencionesAgenteActual = currentInterventionsAgents.Count > 0 ? currentInterventionsAgents.Average(a => a) : 0; //Intervenciones Agente Primer Contacto Anterior List <int> previousInterventionsAgents = new List <int>(); List <int> previousTicketsInterventionsAgents = db.TicketAsignacion.Where(w => lstCreatedTicketsPrevious.Contains(w.IdTicket) && lstEstatusResuelto.Contains(w.Ticket.IdEstatusTicket) && w.IdUsuarioAsignado != w.Ticket.IdUsuarioLevanto).Select(s => s.IdTicket).Distinct().ToList(); foreach (int idticket in previousTicketsInterventionsAgents) { List <int?> firstFirstContactprevious = db.TicketAsignacion.Where(w => w.IdTicket == idticket && w.IdUsuarioAsignado != w.Ticket.IdUsuarioLevanto && w.IdUsuarioAsignado != null).Select(s => s.IdUsuarioAsignado).Distinct().ToList(); if (firstFirstContactprevious.Count > 0) { previousInterventionsAgents.Add(firstFirstContactprevious.Count); } } result.PromedioIntervencionesAgenteAnterior = previousInterventionsAgents.Count > 0 ? previousInterventionsAgents.Average(a => a) : 0; result.PromedioIntervencionesAgentePorcentaje = Math.Abs(result.PromedioIntervencionesAgenteAnterior) == 0 ? 0 : ((result.PromedioIntervencionesAgenteActual - result.PromedioIntervencionesAgenteAnterior) / result.PromedioIntervencionesAgenteAnterior) * 100; #endregion Intervenciones Agente Primer Contacto #region Clientes Unicos result.ClientesAtendidosActual = db.Ticket.Where(w => lstCreatedTicketsCurrent.Contains(w.Id)).Select(s => s.IdUsuarioLevanto).Distinct().ToList().Count; result.ClientesAtendidosAnterior = db.Ticket.Where(w => lstCreatedTicketsPrevious.Contains(w.Id)).Select(s => s.IdUsuarioLevanto).Distinct().ToList().Count; result.ClientesAtendidosPorcentaje = Math.Abs(result.ClientesAtendidosAnterior) == 0 ? 0 : ((result.ClientesAtendidosActual - result.ClientesAtendidosAnterior) / result.ClientesAtendidosAnterior) * 100; #endregion Clientes Unicos #region graficos DataTable dtTicketsAbiertos = new DataTable("dt"); dtTicketsAbiertos.Columns.Add(new DataColumn("Id", typeof(int))); dtTicketsAbiertos.Columns.Add(new DataColumn("Descripcion", typeof(string))); dtTicketsAbiertos.Columns.Add(new DataColumn("Total", typeof(decimal))); var ticketsAbiertos = db.Ticket.Where(w => lstCreatedTicketsCurrent.Contains(w.Id)).Join(db.TipoArbolAcceso, t => t.IdTipoArbolAcceso, taa => taa.Id, (t, taa) => new { taa.Id, taa.Descripcion }).GroupBy(g => new { g.Id, g.Descripcion } ).Select(s => new GraficoConteo { Id = s.Key.Id, Descripcion = s.Key.Descripcion, Total = s.Count() }); foreach (GraficoConteo datos in db.Ticket.Where(w => lstCreatedTicketsCurrent.Contains(w.Id)).Join(db.TipoArbolAcceso, t => t.IdTipoArbolAcceso, taa => taa.Id, (t, taa) => new { taa.Id, taa.Descripcion }).GroupBy(g => new { g.Id, g.Descripcion }).Select(s => new GraficoConteo { Id = s.Key.Id, Descripcion = s.Key.Descripcion, Total = s.Count() })) { dtTicketsAbiertos.Rows.Add(datos.Id, datos.Descripcion, datos.Total); } result.GraficoTicketsAbiertos = dtTicketsAbiertos; DataTable dtTicketsPrioridad = new DataTable("dt"); dtTicketsPrioridad.Columns.Add(new DataColumn("Descripcion", typeof(string))); dtTicketsPrioridad.Columns.Add(new DataColumn("Problemas", typeof(decimal))); dtTicketsPrioridad.Columns.Add(new DataColumn("Servicios", typeof(decimal))); foreach (string impacto in db.Impacto.Select(s => s.Descripcion).Distinct()) { dtTicketsPrioridad.Rows.Add(impacto); } foreach (GraficoConteo datos in db.Ticket.Where(w => lstCreatedTicketsCurrent.Contains(w.Id) && w.IdTipoArbolAcceso == (int)BusinessVariables.EnumTipoArbol.ReportarProblemas) .Join(db.Impacto, t => t.IdImpacto, i => i.Id, (t, i) => new { i.Id, i.Descripcion }).GroupBy(g => new { g.Id, g.Descripcion }) .Select(s => new GraficoConteo { Id = s.Key.Id, Descripcion = s.Key.Descripcion, Total = s.Count() })) { foreach (DataRow row in dtTicketsPrioridad.Rows) { if (row[0].ToString() == datos.Descripcion) { for (int c = 0; c < dtTicketsPrioridad.Columns.Count; c++) { if (dtTicketsPrioridad.Columns[c].ColumnName == "Problemas") { row[c] = datos.Total; break; } } } } } foreach (GraficoConteo datos in db.Ticket.Where(w => lstCreatedTicketsCurrent.Contains(w.Id) && w.IdTipoArbolAcceso == (int)BusinessVariables.EnumTipoArbol.SolicitarServicio) .Join(db.Impacto, t => t.IdImpacto, i => i.Id, (t, i) => new { i.Id, i.Descripcion }).GroupBy(g => new { g.Id, g.Descripcion }) .Select(s => new GraficoConteo { Id = s.Key.Id, Descripcion = s.Key.Descripcion, Total = s.Count() })) { foreach (DataRow row in dtTicketsPrioridad.Rows) { if (row[0].ToString() == datos.Descripcion) { for (int c = 0; c < dtTicketsPrioridad.Columns.Count; c++) { if (dtTicketsPrioridad.Columns[c].ColumnName == "Servicios") { row[c] = datos.Total; break; } } } } } foreach (DataRow row in dtTicketsPrioridad.Rows) { for (int c = 0; c < dtTicketsPrioridad.Columns.Count; c++) { if (row[c].ToString() == string.Empty) { row[c] = 0; } } } result.GraficoTicketsPrioridad = dtTicketsPrioridad; DataTable dtTicketsCanal = new DataTable("dt"); dtTicketsCanal.Columns.Add(new DataColumn("Id", typeof(int))); dtTicketsCanal.Columns.Add(new DataColumn("Descripcion", typeof(string))); dtTicketsCanal.Columns.Add(new DataColumn("Color", typeof(string))); dtTicketsCanal.Columns.Add(new DataColumn("Total", typeof(decimal))); foreach (GraficoConteo datos in db.Ticket.Where(w => lstCreatedTicketsCurrent.Contains(w.Id)).Join(db.Canal, t => t.IdCanal, c => c.Id, (t, c) => new { c.Id, c.Descripcion, c.ColorGrafico }).GroupBy(g => new { g.Id, g.Descripcion, g.ColorGrafico }).Select(s => new GraficoConteo { Id = s.Key.Id, Descripcion = s.Key.Descripcion, Color = s.Key.ColorGrafico, Total = s.Count() })) { dtTicketsCanal.Rows.Add(datos.Id, datos.Descripcion, datos.Color, datos.Total); } result.GraficoTicketsCanal = dtTicketsCanal; DataTable dtTicketsCreadosAbiertos = new DataTable("dt"); dtTicketsCreadosAbiertos.Columns.Add(new DataColumn("Estatus", typeof(string))); for (int i = 0; i <= ObtenerDiasPeriodo(); i++) { DataColumn col = new DataColumn { //DefaultValue = 0, DataType = typeof(decimal), ColumnName = endCurrentDate.AddDays(i).ToShortDateString() }; dtTicketsCreadosAbiertos.Columns.Add(col); } for (int i = 0; i <= ObtenerDiasPeriodo(); i++) { DateTime fInicio = Convert.ToDateTime(endCurrentDate.AddDays(i).ToShortDateString() + " 00:00:00"); DateTime fFin = Convert.ToDateTime(fInicio.AddDays(1).ToShortDateString()); //Tickets Creados var test = db.Ticket.Where(w => lstCreatedTicketsCurrent.Contains(w.Id) && w.FechaHoraAlta >= fInicio && w.FechaHoraAlta < fFin); foreach (GraficoConteo datos in db.Ticket.Where(w => lstCreatedTicketsCurrent.Contains(w.Id) && w.FechaHoraAlta >= fInicio && w.FechaHoraAlta < fFin).GroupBy(g => new { Descripcion = "Creados" }).Select(s => new GraficoConteo { Descripcion = "Creados", Total = s.Count() })) { int row = 0; if (dtTicketsCreadosAbiertos.Rows.Count > 0) { bool encontroColumna = false; for (int j = 0; j < dtTicketsCreadosAbiertos.Rows.Count; j++) { if (dtTicketsCreadosAbiertos.Rows[j][0].ToString() != datos.Descripcion) { continue; } encontroColumna = true; break; } if (!encontroColumna) { dtTicketsCreadosAbiertos.Rows.Add(datos.Descripcion); } for (int j = 0; j < dtTicketsCreadosAbiertos.Rows.Count; j++) { if (dtTicketsCreadosAbiertos.Rows[j][0].ToString() != datos.Descripcion) { continue; } for (int c = 0; c < dtTicketsCreadosAbiertos.Columns.Count; c++) { if (dtTicketsCreadosAbiertos.Columns[c].ColumnName == fInicio.ToShortDateString()) { dtTicketsCreadosAbiertos.Rows[j][c] = datos.Total; break; } } } } else { dtTicketsCreadosAbiertos.Rows.Add(datos.Descripcion); for (int c = 0; c < dtTicketsCreadosAbiertos.Columns.Count; c++) { if (dtTicketsCreadosAbiertos.Columns[c].ColumnName == fInicio.ToShortDateString()) { dtTicketsCreadosAbiertos.Rows[0][c] = datos.Total; break; } } } } //Tickets Resuletos foreach (GraficoConteo datos in db.Ticket.Where(w => lstCreatedTicketsCurrent.Contains(w.Id) && w.FechaHoraAlta >= fInicio && w.FechaHoraAlta <= fFin && lstEstatusResuelto.Contains(w.IdEstatusTicket)).Join(db.EstatusTicket, t => t.IdEstatusTicket, e => e.Id, (t, e) => new { e.Id, e.Descripcion }).GroupBy(g => new { g.Id, g.Descripcion }).Select(s => new GraficoConteo { Id = s.Key.Id, Descripcion = s.Key.Descripcion, Total = s.Count() })) { int row = 0; if (dtTicketsCreadosAbiertos.Rows.Count > 0) { bool encontroColumna = false; for (int j = 0; j < dtTicketsCreadosAbiertos.Rows.Count; j++) { if (dtTicketsCreadosAbiertos.Rows[j][0].ToString() != datos.Descripcion) { continue; } encontroColumna = true; break; } if (!encontroColumna) { dtTicketsCreadosAbiertos.Rows.Add(datos.Descripcion); } for (int j = 0; j < dtTicketsCreadosAbiertos.Rows.Count; j++) { if (dtTicketsCreadosAbiertos.Rows[j][0].ToString() != datos.Descripcion) { continue; } for (int c = 0; c < dtTicketsCreadosAbiertos.Columns.Count; c++) { if (dtTicketsCreadosAbiertos.Columns[c].ColumnName == fInicio.ToShortDateString()) { dtTicketsCreadosAbiertos.Rows[j][c] = datos.Total; break; } } } } else { dtTicketsCreadosAbiertos.Rows.Add(datos.Descripcion); for (int c = 0; c < dtTicketsCreadosAbiertos.Columns.Count; c++) { if (dtTicketsCreadosAbiertos.Columns[c].ColumnName == fInicio.ToShortDateString()) { dtTicketsCreadosAbiertos.Rows[0][c] = datos.Total; break; } } } } } foreach (DataRow row in dtTicketsCreadosAbiertos.Rows) { for (int j = 0; j < dtTicketsCreadosAbiertos.Columns.Count; j++) { if (row[j].ToString() == string.Empty) { row[j] = "0"; } } } result.GraficoTicketsCreadosResueltos = dtTicketsCreadosAbiertos; #endregion graficos #region MetricasGrupos List <int> lstEnumImpacto = db.Impacto.Where(w => w.Descripcion == BusinessVariables.EnumImpacto.Alto).Select(s => s.Id).Distinct().ToList(); List <HelperMetricas> metrics = db.GrupoUsuario.Join(db.TicketGrupoUsuario, gu => gu.Id, tgu => tgu.IdGrupoUsuario, (gu, tgu) => new { gu, tgu }) .Join(db.Ticket, @t1 => @t1.tgu.IdTicket, t => t.Id, (@t1, t) => new { @t1, t }) .Where(@t1 => @[email protected] == (int)BusinessVariables.EnumTiposGrupos.Agente && lstCreatedTicketsCurrent.Contains(@t1.t.Id)) .GroupBy(g => new { idticket = g.t.Id, idgrupo = g.t1.gu.Id, g.t1.gu.Descripcion }) .Select(s => new { IdTicket = s.Key.idticket, IdGrupo = s.Key.idgrupo, DescripcionGrupo = s.Key.Descripcion }) .GroupBy(g => new { g.IdGrupo, g.DescripcionGrupo }) .Select(s => new HelperMetricas { IdGrupo = s.Key.IdGrupo, DescripcionGrupo = s.Key.DescripcionGrupo, TotalActual = s.Count() }) .OrderByDescending(o => o.TotalActual) .Take(5) .ToList(); foreach (HelperMetricas metricas in metrics) { List <HelperMetricas> metricasAnterior = db.GrupoUsuario.Join(db.TicketGrupoUsuario, gu => gu.Id, tgu => tgu.IdGrupoUsuario, (gu, tgu) => new { gu, tgu }) .Join(db.Ticket, @t1 => @t1.tgu.IdTicket, t => t.Id, (@t1, t) => new { @t1, t }) .Where(@t1 => @[email protected] == (int)BusinessVariables.EnumTiposGrupos.Agente && lstCreatedTicketsPrevious.Contains(@t1.t.Id) && @t1.t1.gu.Id == metricas.IdGrupo) .GroupBy(g => new { idticket = g.t.Id, idgrupo = g.t1.gu.Id, g.t1.gu.Descripcion }) .Select(s => new { IdTicket = s.Key.idticket, IdGrupo = s.Key.idgrupo, DescripcionGrupo = s.Key.Descripcion }) .GroupBy(g => new { g.IdGrupo, g.DescripcionGrupo }) .Select(s => new HelperMetricas { IdGrupo = s.Key.IdGrupo, DescripcionGrupo = s.Key.DescripcionGrupo, TotalActual = s.Count() }) .OrderByDescending(o => o.TotalActual) .ToList(); metricas.TotalAnterior = lstCreatedTicketsPrevious.Count <= 0 ? 0 : metricasAnterior.Count <= 0 ? 0 : metricasAnterior.First().TotalActual; metricas.TotalPorcentaje = metricas.TotalAnterior == 0 ? 0 : ((metricas.TotalActual - metricas.TotalAnterior) + 100); metricas.TotalAbiertosActual = db.Ticket.Count(w => lstCreatedTicketsCurrent.Contains(w.Id) && w.IdEstatusTicket == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Abierto); metricas.TotalAbiertosAnterior = db.Ticket.Count(w => lstCreatedTicketsPrevious.Contains(w.Id) && w.IdEstatusTicket == (int)BusinessVariables.EnumeradoresKiiniNet.EnumEstatusTicket.Abierto); metricas.TotalAbiertosPorcentaje = metricas.TotalAbiertosAnterior == 0 ? 0 : ((metricas.TotalAbiertosActual - metricas.TotalAbiertosAnterior) / metricas.TotalAbiertosAnterior) * 100; metricas.TotalAbiertosActual = db.Ticket.Count(w => lstCreatedTicketsCurrent.Contains(w.Id) && lstEnumImpacto.Contains(w.IdImpacto)); metricas.TotalAbiertosAnterior = db.Ticket.Count(w => lstCreatedTicketsPrevious.Contains(w.Id) && lstEnumImpacto.Contains(w.IdImpacto)); metricas.TotalAbiertosPorcentaje = metricas.TotalAbiertosAnterior == 0 ? 0 : ((metricas.TotalAbiertosActual - metricas.TotalAbiertosAnterior) / metricas.TotalAbiertosAnterior) * 100; } #endregion MetricasGrupos result.GruposMetricas = metrics; } catch (Exception ex) { throw new Exception(ex.Message); } finally { db.Dispose(); } return(result); }