public void EjecutarNotificaciones()
        {
            try
            {
                EscalamientoModel  escalamiento = new EscalamientoModel();
                List <TicketModel> ticket       = notificacionesDataAccess.GetData();

                foreach (TicketModel i in ticket)
                {
                    TicketModel elemento = i;

                    if (elemento.UltimoEscalamiento == 0)
                    {
                        TiempoDeAtencionModel tiempoDeAtencion = CalculaTiempoAtencion(elemento.FechaRecepcion, elemento.HorasAtencion);

                        if (!tiempoDeAtencion.EnTiempo)
                        {
                            PrimerEscalamiento(elemento);
                            escalamiento.TicketId          = elemento.TicketId;
                            escalamiento.FechaEscalamiento = DateTime.Now;
                            escalamiento.TipoEscalamiento  = 1;
                            notificacionesDataAccess.SetData(escalamiento);
                        }
                    }

                    if (elemento.UltimoEscalamiento == 1)
                    {
                        TiempoDeAtencionModel tiempoDeAtencion = CalculaTiempoAtencion(elemento.FechaRecepcion, elemento.HorasAtencion + elemento.HorasSegundoEscalamiento);

                        if (!tiempoDeAtencion.EnTiempo) // Se verifica que la fecha actual sea mayor a la fecha maxima de entrega de correo
                        {
                            SegundoEscalamiento(elemento);
                            escalamiento.TicketId          = elemento.TicketId;
                            escalamiento.FechaEscalamiento = DateTime.Now;
                            escalamiento.TipoEscalamiento  = 2;
                            notificacionesDataAccess.SetData(escalamiento);
                        }
                    }
                }
            }
            catch (DataAccessException)
            {
                //throw new DataAccessException(e.ToString());
            }
            catch (MailException)
            {
                //throw new MailException(e.ToString());
            }
            catch (Exception)
            {
                //throw new Exception(e.ToString());
            }
        }
        public TiempoDeAtencionModel CalculaTiempoAtencion(DateTime fechaRecepcion, int horasAtencion)
        {
            try
            {
                TiempoDeAtencionModel tiempoAtencion = new TiempoDeAtencionModel();

                int totalHoras            = 0;
                var diasLaborables        = 0;
                var fechaActual           = DateTime.Now;
                var horaFechaActual       = DateTime.Now.Hour;
                var minutoFechaActual     = DateTime.Now.Minute;
                var horaFechaRecepcion    = fechaRecepcion.Hour;
                var minutosFechaRecepcion = (fechaRecepcion.Minute == 0) ? 60 : fechaRecepcion.Minute;

                if (fechaRecepcion.Date <= fechaActual.Date)
                {
                    TiempoDeAtencionModel tiempoActualTranscurrido = new TiempoDeAtencionModel();

                    var fechaRecepcionEspejo    = fechaRecepcion.AddDays(1);
                    var diasInhabiles           = notificacionesDataAccess.ConsultarTotalDiasInhabiles(fechaRecepcion);
                    var diaFechaRecepcion       = fechaRecepcion.Date < fechaActual.Date && (horaFechaRecepcion == 8 && (minutosFechaRecepcion == 0 || minutosFechaRecepcion == 60)) ? 1 : 0;
                    var horasFaltantesDeHorario = 0;

                    if (fechaRecepcion.Date != fechaActual.Date)
                    {
                        if (horaFechaRecepcion == 8 && (minutosFechaRecepcion == 0 || minutosFechaRecepcion == 60))
                        {
                            horasFaltantesDeHorario = 0;
                        }
                        else if (horaFechaRecepcion == 8 && minutosFechaRecepcion > 0 && minutosFechaRecepcion < 60 || horaFechaRecepcion >= 8)
                        {
                            horasFaltantesDeHorario = 17 - fechaRecepcion.Hour;
                            horasFaltantesDeHorario = (fechaRecepcion.Minute > 0) ? horasFaltantesDeHorario - 1 : horasFaltantesDeHorario;
                        }
                    }

                    while (fechaRecepcionEspejo.Date < fechaActual.Date)
                    {
                        if (fechaRecepcionEspejo.DayOfWeek != DayOfWeek.Saturday && fechaRecepcionEspejo.DayOfWeek != DayOfWeek.Sunday)
                        {
                            diasLaborables++;
                        }
                        fechaRecepcionEspejo = fechaRecepcionEspejo.AddDays(1);
                    }

                    if (notificacionesDataAccess.EsDiaInhabil())
                    {
                        diasLaborables++;
                        diasLaborables = (diasLaborables - diasInhabiles) + diaFechaRecepcion;
                        totalHoras     = (fechaRecepcion.Date == fechaActual.Date) ? 0 : horasFaltantesDeHorario;
                    }
                    else
                    {
                        if (fechaActual.DayOfWeek != DayOfWeek.Saturday && fechaActual.DayOfWeek != DayOfWeek.Sunday)
                        {
                            if (fechaRecepcion.Date == fechaActual.Date)
                            {
                                tiempoActualTranscurrido.Dias = (fechaRecepcion.Hour == 8 && fechaRecepcion.Minute == 0 && horaFechaActual >= 17) ? 1 : 0;
                            }
                            else
                            {
                                tiempoActualTranscurrido.Dias = horaFechaActual < 17 ? 0 : 1;
                            }

                            if ((fechaRecepcion.Date == fechaActual.Date || fechaRecepcion.Date != fechaActual.Date) && horaFechaActual < 8)
                            {
                                tiempoActualTranscurrido.Horas = 0;
                            }
                            else if (horaFechaActual == 8 && horaFechaRecepcion == 8 && fechaRecepcion.Minute <= minutoFechaActual)
                            {
                                tiempoActualTranscurrido.Horas = fechaRecepcion.Date != fechaActual.Date ? 1 : 0;
                            }
                            else if ((fechaRecepcion.Date == fechaActual.Date || fechaRecepcion.Date != fechaActual.Date) && horaFechaRecepcion == 8 && minutosFechaRecepcion == 0)
                            {
                                tiempoActualTranscurrido.Horas = (horaFechaActual >= 17) ? 0 : horaFechaActual - 8;
                                tiempoActualTranscurrido.Horas = (fechaRecepcion.Date != fechaActual.Date) ? tiempoActualTranscurrido.Horas + 1 : tiempoActualTranscurrido.Horas;
                            }
                            else if (fechaRecepcion.Date == fechaActual.Date && (horaFechaRecepcion == 8 && minutosFechaRecepcion >= 0 && minutosFechaRecepcion < 60 || horaFechaRecepcion > 8))
                            {
                                if (horaFechaActual > 17)
                                {
                                    tiempoActualTranscurrido.Horas = (minutosFechaRecepcion > 0 && minutosFechaRecepcion < 60) ? 17 - horaFechaRecepcion - 1 : 17 - horaFechaRecepcion;
                                }
                                else
                                {
                                    tiempoActualTranscurrido.Horas = (fechaRecepcion.Minute <= minutoFechaActual) ? horaFechaActual - horaFechaRecepcion : horaFechaActual - horaFechaRecepcion - 1;
                                }
                            }
                            else if (fechaRecepcion.Date != fechaActual.Date && (horaFechaRecepcion == 8 && minutosFechaRecepcion > 0 && minutosFechaRecepcion < 60 || horaFechaRecepcion > 8))
                            {
                                if (horaFechaActual >= 17)
                                {
                                    tiempoActualTranscurrido.Horas = 0;
                                }
                                else
                                {
                                    tiempoActualTranscurrido.Horas = (minutosFechaRecepcion <= minutoFechaActual) ? horaFechaActual - 7 : horaFechaActual - 8;
                                }
                            }
                            else if (fechaRecepcion.Date != fechaActual.Date && horaFechaActual >= 8)
                            {
                                if (horaFechaActual == 8 && minutoFechaActual == 0 || horaFechaActual > 17)
                                {
                                    tiempoActualTranscurrido.Horas = 0;
                                }
                                else if (horaFechaActual == 8 && minutoFechaActual != 0)
                                {
                                    tiempoActualTranscurrido.Horas = fechaRecepcion.Minute <= minutoFechaActual ? 1 : 0;
                                }
                                else if (horaFechaActual >= 8 && horaFechaActual <= 17)
                                {
                                    tiempoActualTranscurrido.Horas = fechaRecepcion.Minute <= minutoFechaActual ? horaFechaActual - 8 : horaFechaActual - 9;
                                }
                            }
                            else if (fechaRecepcion.Date == fechaActual.Date && fechaActual.Hour < 17)
                            {
                                tiempoActualTranscurrido.Horas = horaFechaActual - 8;
                            }
                        }
                        else
                        {
                            tiempoActualTranscurrido.Horas = 0;
                            tiempoActualTranscurrido.Dias  = 0;
                        }

                        diasLaborables = (tiempoActualTranscurrido.Horas + horasFaltantesDeHorario >= 9) ? diasLaborables + 1 : diasLaborables;
                        diasLaborables = (diasLaborables - diasInhabiles) + tiempoActualTranscurrido.Dias + diaFechaRecepcion;
                        totalHoras     = (tiempoActualTranscurrido.Horas + horasFaltantesDeHorario >= 9) ? (tiempoActualTranscurrido.Horas + horasFaltantesDeHorario) - 9 : tiempoActualTranscurrido.Horas + horasFaltantesDeHorario;
                    }
                }

                var minutos = (horaFechaActual >= 17) ? 60 : minutoFechaActual;

                tiempoAtencion.Dias     = diasLaborables;
                tiempoAtencion.Horas    = totalHoras;
                tiempoAtencion.EnTiempo = horasAtencion > (diasLaborables * 9) + totalHoras || ((horasAtencion == (diasLaborables * 9) + totalHoras) && minutosFechaRecepcion == minutos);

                return(tiempoAtencion);
            }
            catch (Exception e)
            {
                throw new Exception("Hubo un error al realizar el conteo de horas", e);
            }
        }
        public IList <ReporteModel> ConsultarTicketsReporte(ReporteModel reporteModel)
        {
            try
            {
                iGenericDataAccess.OpenConnection();
                string filtroConsultaReporte = String.Empty;

                VwTicketsRepSelTicketsReporte vwTicketsRep = new VwTicketsRepSelTicketsReporte
                {
                    DescripcionEstatus = reporteModel.DescripcionEstatus
                };

                if (!string.IsNullOrEmpty(reporteModel.FechaInicio) && !string.IsNullOrEmpty(reporteModel.FechaFin))
                {
                    filtroConsultaReporte = "CAST(FechaRegistro AS DATE) >= CAST( '" + reporteModel.FechaInicio + "' AS DATE) AND CAST(FechaRegistro AS DATE) <= CAST('" + reporteModel.FechaFin + "' AS DATE)";
                }

                IList <VwTicketsRepSelTicketsReporte> vwTicketsReporte = iGenericDataAccess.Consultar(
                    vwTicketsRep,
                    new OptionsQueryZero()
                {
                    ExcludeNumericsDefaults = true,
                    ExcludeBool             = true,
                    WhereComplementary      = filtroConsultaReporte
                });
                iGenericDataAccess.CloseConnection();

                IList <ReporteModel> ticketsList    = new List <ReporteModel>();
                TiempoAtencionModel  tiempoAtencion = new TiempoAtencionModel();

                for (int i = 0; i < vwTicketsReporte.Count; i++)
                {
                    TiempoDeAtencionModel tiempoDeAtencion = iSeguimientoTicketsDataAccess.CalculaTiempoAtencion(vwTicketsReporte[i].FechaRecepcion, vwTicketsReporte[i].HorasAtencion, (vwTicketsReporte[i].FechaCierre == "N/A") ? DateTime.Now : Convert.ToDateTime(vwTicketsReporte[i].FechaCierre, fotmato));

                    tiempoAtencion.DiasInhabiles  = vwTicketsReporte[i].DiasInhabiles;
                    tiempoAtencion.FechaRecepcion = vwTicketsReporte[i].FechaRecepcion;

                    ReporteModel reporteModelFinal = new ReporteModel
                    {
                        TicketId           = vwTicketsReporte[i].TicketId,
                        FechaRegistro      = DateToString(vwTicketsReporte[i].FechaRegistro),
                        FechaRecepcion     = DateToString(vwTicketsReporte[i].FechaRecepcion),
                        FechaCierre        = vwTicketsReporte[i].FechaCierre,
                        Cliente            = vwTicketsReporte[i].Cliente,
                        Caratula           = vwTicketsReporte[i].Caratula,
                        DescripcionTicket  = vwTicketsReporte[i].DescripcionTicket,
                        NombrePer          = vwTicketsReporte[i].NombrePer,
                        PaternoPer         = string.IsNullOrEmpty(vwTicketsReporte[i].PaternoPer) ? string.Empty : vwTicketsReporte[i].PaternoPer,
                        MaternoPer         = string.IsNullOrEmpty(vwTicketsReporte[i].MaternoPer) ? string.Empty : vwTicketsReporte[i].MaternoPer,
                        HorasAtencion      = vwTicketsReporte[i].HorasAtencion,
                        DescripcionEstatus = vwTicketsReporte[i].DescripcionEstatus,
                        TiempoAtencion     = tiempoDeAtencion.Dias + " dia(s) , " + tiempoDeAtencion.Horas + " hora(s)",
                        CveEstatus         = vwTicketsReporte[i].CveEstatus,
                        NumTicket          = i + 1,
                        AseguradoraId      = vwTicketsReporte[i].AseguradoraId,
                        Nombre             = (vwTicketsReporte[i].AseguradoraId == 0) ? "NA" : vwTicketsReporte[i].Nombre,
                        NumeroOt           = vwTicketsReporte[i].NumeroOt,
                        NumeroOtSics       = vwTicketsReporte[i].NumeroOtSics,
                        EstatusAtencion    = tiempoDeAtencion.EnTiempo
                    };

                    ticketsList.Add(reporteModelFinal);
                }

                return(ticketsList.OrderBy(x => x.TicketId).ToList());
            }
            catch (Exception e)
            {
                iGenericDataAccess.CloseConnection();
                throw new DalException(CodesTickets.ERR_00_01, e);
            }
        }