using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Informes;
using Exferia_KairosPRO._1_Modelos;
using Exferia_KairosPRO._2_Datos;
using Exferia_KairosPRO_EF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exferia_KairosPRO.General
{
    public class Verificacion_Fichaje_EnvioEmail
    {
        #region Variables privadas
        private TMP_Emails_FichajesIncidencias_Datos g_obj_TMP_Emails_FichajesIncidencias_Datos = new TMP_Emails_FichajesIncidencias_Datos();
        private TMP_Emails_Informes_PorFechas_Datos g_obj_TMP_Emails_Informes_PorFechas_Datos = new TMP_Emails_Informes_PorFechas_Datos();
        private TMP_Emails_RecordatorioFichajes_Datos g_obj_TMP_Emails_RecordatorioFichajes_Datos = new TMP_Emails_RecordatorioFichajes_Datos();
        private KRS_Empleados_Datos g_obj_KRS_Empleados_Datos = new KRS_Empleados_Datos();
        private KRS_AusenciasProgramadas_Datos g_obj_KRS_AusenciasProgramadas_Datos = new KRS_AusenciasProgramadas_Datos();
        private KRS_DiasFestivos_Datos g_obj_KRS_DiasFestivos_Datos = new KRS_DiasFestivos_Datos();
        private KRSS_Fichajes_Datos g_obj_KRSS_Fichajes_Datos = new KRSS_Fichajes_Datos();
        private KRS_JornadasCabecera_Datos g_obj_KRS_JornadasCabecera_Datos = new KRS_JornadasCabecera_Datos();
        private KRS_JornadasLinea_Datos g_obj_KRS_JornadasLinea_Datos = new KRS_JornadasLinea_Datos();
        #endregion

        public void Fichajes_Invalidos(long _lng_CodigoCliente)
        {
            try
            {
                //Emails pendiente de Enviar de validacion de fichajes
                List<TMP_Emails_FichajesIncidencias> lst_TMP_Emails_FichajesIncidencias = g_obj_TMP_Emails_FichajesIncidencias_Datos.Obtener_Listado(_lng_CodigoCliente);

                if (lst_TMP_Emails_FichajesIncidencias != null && lst_TMP_Emails_FichajesIncidencias.Count > 0)
                {
                    //Validar los fichajes por Empleado
                    DateTime? dtt_FechaFichaje = null;
                    foreach (TMP_Emails_FichajesIncidencias mdl_TMP_Emails_FichajesIncidencias in lst_TMP_Emails_FichajesIncidencias)
                    {
                        INTERNO_KairosPRO_FichajeIncidencias_Modelo mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo = null;
                        List<INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo> lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo = new List<INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo>();

                        KRS_Empleados mdl_KRS_Empleados = g_obj_KRS_Empleados_Datos.Obtener_Modelo_Por_Id(mdl_TMP_Emails_FichajesIncidencias.idEmpleado,_lng_CodigoCliente,true,true );

                        if (mdl_KRS_Empleados != null)
                        {
                            mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo = new INTERNO_KairosPRO_FichajeIncidencias_Modelo();

                            //Datos del Empleado
                            mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Empleado_Nombre = mdl_KRS_Empleados.nombre;
                            mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Empleado_Foto = null;
                            if (mdl_KRS_Empleados.KRS_EmpleadosFotos != null && mdl_KRS_Empleados.KRS_EmpleadosFotos.Count > 0)
                            {
                                mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Empleado_Foto = mdl_KRS_Empleados.KRS_EmpleadosFotos.FirstOrDefault().foto;
                            }

                            //Datos del Fichaje
                            if (mdl_TMP_Emails_FichajesIncidencias.idFichaje != null)
                            {
                                KRSS_Fichajes mdl_KRSS_Fichajes = g_obj_KRSS_Fichajes_Datos.Obtener_Modelo_Por_Id(mdl_TMP_Emails_FichajesIncidencias.idFichaje.Value, _lng_CodigoCliente,true,true);
                                if (mdl_KRSS_Fichajes != null)
                                {
                                    dtt_FechaFichaje = mdl_KRSS_Fichajes.fechaHora;
                                    mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Fichaje_Observaciones = mdl_KRSS_Fichajes.observaciones;

                                    //Datos del Dispositivo
                                    if (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null)
                                    {
                                        mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Dispositivo_Marca = mdl_KRSS_Fichajes.KRSS_DispositivosModelo.marca;
                                        mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Dispositivo_Modelo = mdl_KRSS_Fichajes.KRSS_DispositivosModelo.modelo;
                                        mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Dispositivo_MAC = mdl_KRSS_Fichajes.KRSS_DispositivosModelo.mac;
                                    }


                                    mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Fichaje_Foto = null;
                                    if (mdl_KRSS_Fichajes.KRSS_FichajesFotos != null && mdl_KRSS_Fichajes.KRSS_FichajesFotos.Count > 0)
                                    {
                                        mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Fichaje_Foto = mdl_KRSS_Fichajes.KRSS_FichajesFotos.FirstOrDefault().foto;
                                    }

                                }
                            }

                            //Datos de la Jornada
                            if (mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera != null)
                            {
                                KRS_JornadasCabecera mdl_KRS_JornadasCabecera = g_obj_KRS_JornadasCabecera_Datos.Obtener_Modelo_Por_Id(mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera.Value,_lng_CodigoCliente,false);
                                if (mdl_KRS_JornadasCabecera != null)
                                {
                                    mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Jornada_TiempoTeorio = mdl_KRS_JornadasCabecera.tiempoTeorico;
                                }
                            }

                            mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo.Jornada_Dia = mdl_TMP_Emails_FichajesIncidencias.fecha;

                            //FUERA DE JORNADA ###############################################################################################################
                            if (mdl_TMP_Emails_FichajesIncidencias.incidencia_Tipo.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_FUERAJORNADA))
                            {
                                //Buscar las Jornadas Lineas
                                bool bol_FechaHoraFichaje_Utilizados = false;
                                if (mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera != null)
                                {
                                    List<KRS_JornadasLinea> lst_KRS_JornadasLinea = g_obj_KRS_JornadasLinea_Datos.Obtener_ModeloListado_Por_JornadaCabeceraCodigoCliente(mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera.Value, _lng_CodigoCliente);

                                    if (lst_KRS_JornadasLinea != null && lst_KRS_JornadasLinea.Count > 0)
                                    {
                                        string str_Tipo = "";

                                        TimeSpan obj_Jornada = lst_KRS_JornadasLinea[0].hora;
                                        DateTime dtt_DiaActual = mdl_TMP_Emails_FichajesIncidencias.fecha;

                                        foreach (KRS_JornadasLinea mdl_KRS_JornadasLinea in lst_KRS_JornadasLinea)
                                        {
                                            //TIPO DE JORNADA LINEA ..............................................................
                                            str_Tipo = "";

                                            //Ausencia Obligada
                                            if (mdl_KRS_JornadasLinea.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA))
                                            {
                                                str_Tipo = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_AUSENCIAOBLIGADA;
                                            }
                                            //Flexible
                                            else if (mdl_KRS_JornadasLinea.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_FLEXIBLE))
                                            {
                                                str_Tipo = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_FLEXIBLE;
                                            }
                                            //Presencia obligada
                                            else if (mdl_KRS_JornadasLinea.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_PRESENCIAOBLIGADA))
                                            {
                                                str_Tipo = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_PRESENCIAOBLIGADA;
                                            }
                                            //.....................................................................................

                                            //Cambio de Dia ......................................................
                                            if (obj_Jornada > mdl_KRS_JornadasLinea.hora)
                                            {
                                                dtt_DiaActual = dtt_DiaActual.AddDays(1);
                                            }

                                            obj_Jornada = mdl_KRS_JornadasLinea.hora;
                                            //....................................................................

                                            //Incidencia del Fichaje
                                            DateTime dtt_FechaJornadaLinea = new DateTime(dtt_DiaActual.Year, dtt_DiaActual.Month, dtt_DiaActual.Day, obj_Jornada.Hours, obj_Jornada.Minutes, 0);

                                            if (bol_FechaHoraFichaje_Utilizados == false && dtt_FechaJornadaLinea >= dtt_FechaFichaje.Value)
                                            {
                                                lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo.Add(new INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo(new TimeSpan(dtt_FechaFichaje.Value.Hour, dtt_FechaFichaje.Value.Minute, 0), "", true, mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion));

                                                bol_FechaHoraFichaje_Utilizados = true;
                                            }


                                            lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo.Add(new INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo(mdl_KRS_JornadasLinea.hora, str_Tipo, false, ""));
                                        }
                                    }
                                }

                                //Si no está en ninugn rango de jornada se pone solo, el ultimo
                                if (bol_FechaHoraFichaje_Utilizados == false)
                                {
                                    lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo.Add(new INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo(new TimeSpan(dtt_FechaFichaje.Value.Hour, dtt_FechaFichaje.Value.Minute, 0), "", true, mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion));
                                }
                            }
                            //NO HAY NINGUN FICHAJE Y DEBERIA HABERLO #############################################################################################
                            else if (mdl_TMP_Emails_FichajesIncidencias.incidencia_Tipo.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_NOHAYFICHAJE))
                            {
                                //Buscar las Jornadas Lineas
                                if (mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera != null)
                                {
                                    List<KRS_JornadasLinea> lst_KRS_JornadasLinea = g_obj_KRS_JornadasLinea_Datos.Obtener_ModeloListado_Por_JornadaCabeceraCodigoCliente( mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera.Value, _lng_CodigoCliente);

                                    if (lst_KRS_JornadasLinea != null && lst_KRS_JornadasLinea.Count > 0)
                                    {
                                        string str_Tipo = "";
                                        string str_Incidencia = "";
                                        bool bol_TieneIncidencia = false;
                                        foreach (KRS_JornadasLinea mdl_KRS_JornadasLinea in lst_KRS_JornadasLinea)
                                        {
                                            str_Incidencia = "";
                                            bol_TieneIncidencia = false;
                                            str_Tipo = "";
                                            //TIPO DE JORNADA LINEA ..............................................................

                                            //Ausencia Obligada
                                            if (mdl_KRS_JornadasLinea.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA))
                                            {
                                                str_Tipo = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_AUSENCIAOBLIGADA;
                                            }
                                            //Flexible
                                            else if (mdl_KRS_JornadasLinea.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_FLEXIBLE))
                                            {
                                                str_Tipo = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_FLEXIBLE;
                                            }
                                            //Presencia obligada
                                            else if (mdl_KRS_JornadasLinea.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_PRESENCIAOBLIGADA))
                                            {
                                                str_Tipo = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_PRESENCIAOBLIGADA;
                                            }
                                            //.....................................................................................

                                            if (mdl_TMP_Emails_FichajesIncidencias.idJornadaLinea != null)
                                            {
                                                if (mdl_KRS_JornadasLinea.id.Equals(mdl_TMP_Emails_FichajesIncidencias.idJornadaLinea.Value))
                                                {
                                                    str_Incidencia = mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion;
                                                    bol_TieneIncidencia = true;
                                                }
                                            }

                                            lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo.Add(new INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo(mdl_KRS_JornadasLinea.hora, str_Tipo, bol_TieneIncidencia, str_Incidencia));
                                        }
                                    }
                                }
                            }
                            //HAY UN FICHAJE Y NO DEBERIA HABERLO ########################################################################################################
                            else if (mdl_TMP_Emails_FichajesIncidencias.incidencia_Tipo.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_HAYFICHAJENODEBERIA_AUSENCIAPROGRAMA) ||
                                     mdl_TMP_Emails_FichajesIncidencias.incidencia_Tipo.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_HAYFICHAJENODEBERIA_DIAFESTIVO))
                            {
                                lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo.Add(new INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo(new TimeSpan(dtt_FechaFichaje.Value.Hour, dtt_FechaFichaje.Value.Minute, 0), "", true, mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion));
                            }
                            //TIPO INCORRECTO DE FICHAJE, E SUNA ENTRADA Y DEBERIA HABER UNA SALIDA Y VICEVERSA ###################################################################
                            else if (mdl_TMP_Emails_FichajesIncidencias.incidencia_Tipo.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_TIPOINCORRECTO_ENTRADASALIDA))
                            {
                                //Buscar las Jornadas Lineas
                                bool bol_FechaHoraFichaje_Utilizados = false;
                                if (mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera != null)
                                {
                                    List<KRS_JornadasLinea> lst_KRS_JornadasLinea = g_obj_KRS_JornadasLinea_Datos.Obtener_ModeloListado_Por_JornadaCabeceraCodigoCliente(mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera.Value, _lng_CodigoCliente);

                                    if (lst_KRS_JornadasLinea != null && lst_KRS_JornadasLinea.Count > 0)
                                    {
                                        string str_Tipo = "";

                                        TimeSpan obj_Jornada = lst_KRS_JornadasLinea[0].hora;
                                        DateTime dtt_DiaActual = mdl_TMP_Emails_FichajesIncidencias.fecha;

                                        foreach (KRS_JornadasLinea mdl_KRS_JornadasLinea in lst_KRS_JornadasLinea)
                                        {
                                            //TIPO DE JORNADA LINEA ..............................................................
                                            str_Tipo = "";

                                            //Ausencia Obligada
                                            if (mdl_KRS_JornadasLinea.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA))
                                            {
                                                str_Tipo = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_AUSENCIAOBLIGADA;
                                            }
                                            //Flexible
                                            else if (mdl_KRS_JornadasLinea.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_FLEXIBLE))
                                            {
                                                str_Tipo = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_FLEXIBLE;
                                            }
                                            //Presencia obligada
                                            else if (mdl_KRS_JornadasLinea.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_PRESENCIAOBLIGADA))
                                            {
                                                str_Tipo = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_PRESENCIAOBLIGADA;
                                            }
                                            //.....................................................................................

                                            //Cambio de Dia ......................................................
                                            if (obj_Jornada > mdl_KRS_JornadasLinea.hora)
                                            {
                                                dtt_DiaActual = dtt_DiaActual.AddDays(1);
                                            }

                                            obj_Jornada = mdl_KRS_JornadasLinea.hora;
                                            //....................................................................

                                            //Incidencia del Fichaje
                                            DateTime dtt_FechaJornadaLinea = new DateTime(dtt_DiaActual.Year, dtt_DiaActual.Month, dtt_DiaActual.Day, obj_Jornada.Hours, obj_Jornada.Minutes, 0);

                                            if (bol_FechaHoraFichaje_Utilizados == false && dtt_FechaJornadaLinea >= dtt_FechaFichaje.Value)
                                            {
                                                lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo.Add(new INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo(new TimeSpan(dtt_FechaFichaje.Value.Hour, dtt_FechaFichaje.Value.Minute, 0), "", true, mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion));

                                                bol_FechaHoraFichaje_Utilizados = true;
                                            }


                                            lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo.Add(new INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo(mdl_KRS_JornadasLinea.hora, str_Tipo, false, ""));
                                        }
                                    }
                                }

                                //Si no está en ninugn rango de jornada se pone solo, el ultimo
                                if (bol_FechaHoraFichaje_Utilizados == false)
                                {
                                    lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo.Add(new INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo(new TimeSpan(dtt_FechaFichaje.Value.Hour, dtt_FechaFichaje.Value.Minute, 0), "", true, mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion));
                                }
                            }
                            if (mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo != null)
                            {
                                if (Verificacion_Fichajes_Email.Enviar_FichajeIncidencia_Jornada(_lng_CodigoCliente, mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo, lst_INTERNO_KairosPRO_FichajeIncidencias_Jornada_Modelo,mdl_KRS_Empleados))
                                {
                                    //Se borra el registro de base de datos
                                    g_obj_TMP_Emails_FichajesIncidencias_Datos.Borrar(mdl_TMP_Emails_FichajesIncidencias.id, _lng_CodigoCliente);
                                }
                            }
                        }
                        else
                        {
                            mdl_INTERNO_KairosPRO_FichajeIncidencias_Modelo = null;
                            //No hay Empleado
                            Control_Errores.Errores_Log("No hay empleado", null, nameof(Verificacion_Fichaje_EnvioEmail) + "/" + nameof(Fichajes_Invalidos));
                        }

                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichaje_EnvioEmail) + "/" + nameof(Fichajes_Invalidos));
            }
        }

        #region Informes por Fechas
        public void Informes_PorFechas(long _lng_CodigoCliente)
        {
            try
            {
                List<long> lst_idEmpresa = g_obj_KRS_Empleados_Datos.Obtener_Empresas_Segun_CodigoCliente(_lng_CodigoCliente);

                if (lst_idEmpresa!=null && lst_idEmpresa.Count>0)
                {
                    foreach (long lng_idEmpresa in lst_idEmpresa)
                    {
                        //Emails pendiente de Enviar de Informes Tipo Diario ##################################################################################################################################################################
                        List<TMP_Emails_Informes_PorFechas> lst_TMP_Emails_Informes_PorFechas_DIARIO = g_obj_TMP_Emails_Informes_PorFechas_Datos.Obtener_Listado(_lng_CodigoCliente, Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_DIARIO.Id);
                        if (lst_TMP_Emails_Informes_PorFechas_DIARIO != null && lst_TMP_Emails_Informes_PorFechas_DIARIO.Count > 0)
                        {
                            List<KRS_Empleados> lst_KRS_Empleados = null;
                            foreach (TMP_Emails_Informes_PorFechas mdl_TMP_Emails_Informes_PorFechas in lst_TMP_Emails_Informes_PorFechas_DIARIO)
                            {
                                lst_KRS_Empleados = g_obj_KRS_Empleados_Datos.Obtener_ModeloListado(mdl_TMP_Emails_Informes_PorFechas.codigoCliente);

                                if (lst_KRS_Empleados != null && lst_KRS_Empleados.Count > 0)
                                {
                                    Informes_PorFechas_Diario(mdl_TMP_Emails_Informes_PorFechas, lst_KRS_Empleados, lng_idEmpresa);
                                }
                            }
                        }
                        //#####################################################################################################################################################################################################################

                        //Emails pendiente de Enviar de Informes Tipo Semanal ##################################################################################################################################################################
                        List<TMP_Emails_Informes_PorFechas> lst_TMP_Emails_Informes_PorFechas_SEMANAL = g_obj_TMP_Emails_Informes_PorFechas_Datos.Obtener_Listado(_lng_CodigoCliente, Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_SEMANAL.Id);
                        if (lst_TMP_Emails_Informes_PorFechas_SEMANAL != null && lst_TMP_Emails_Informes_PorFechas_SEMANAL.Count > 0)
                        {
                            List<KRS_Empleados> lst_KRS_Empleados = null;
                            foreach (TMP_Emails_Informes_PorFechas mdl_TMP_Emails_Informes_PorFechas in lst_TMP_Emails_Informes_PorFechas_SEMANAL)
                            {
                                lst_KRS_Empleados = g_obj_KRS_Empleados_Datos.Obtener_ModeloListado(mdl_TMP_Emails_Informes_PorFechas.codigoCliente);

                                if (lst_KRS_Empleados != null && lst_KRS_Empleados.Count > 0)
                                {
                                    Informes_PorFechas_Semanal(mdl_TMP_Emails_Informes_PorFechas, lst_KRS_Empleados, lng_idEmpresa);
                                }
                            }
                        }
                        //#####################################################################################################################################################################################################################

                        //Emails pendiente de Enviar de Informes Tipo Mensual ##################################################################################################################################################################
                        List<TMP_Emails_Informes_PorFechas> lst_TMP_Emails_Informes_PorFechas_MENSUAL = g_obj_TMP_Emails_Informes_PorFechas_Datos.Obtener_Listado(_lng_CodigoCliente, Variables.G_MDL_INFORMES_KAIROSPRO_DETALLEFICHAJE_MENSUAL.Id);
                        if (lst_TMP_Emails_Informes_PorFechas_MENSUAL != null && lst_TMP_Emails_Informes_PorFechas_MENSUAL.Count > 0)
                        {
                            List<KRS_Empleados> lst_KRS_Empleados = null;
                            foreach (TMP_Emails_Informes_PorFechas mdl_TMP_Emails_Informes_PorFechas in lst_TMP_Emails_Informes_PorFechas_MENSUAL)
                            {
                                lst_KRS_Empleados = g_obj_KRS_Empleados_Datos.Obtener_ModeloListado(mdl_TMP_Emails_Informes_PorFechas.codigoCliente);

                                if (lst_KRS_Empleados != null && lst_KRS_Empleados.Count > 0)
                                {
                                    Informes_PorFechas_Mensual(mdl_TMP_Emails_Informes_PorFechas, lst_KRS_Empleados, lng_idEmpresa);
                                }
                            }
                        }
                        //#####################################################################################################################################################################################################################

                        //Emails pendiente de Enviar de Informes Tipo Mensual TotalDispositivos ###############################################################################################################################################
                        List<TMP_Emails_Informes_PorFechas> lst_TMP_Emails_Informes_PorFechas_MENSUAL_DISPOSITIVOS = g_obj_TMP_Emails_Informes_PorFechas_Datos.Obtener_Listado(_lng_CodigoCliente, Variables.G_MDL_INFORMES_KAIROSPRO_FICHAJE_MENSUAL_TOTALDISPOSITIVOS.Id);
                        if(lst_TMP_Emails_Informes_PorFechas_MENSUAL_DISPOSITIVOS != null && lst_TMP_Emails_Informes_PorFechas_MENSUAL_DISPOSITIVOS.Count > 0)
                        {
                            //List<KRS_Empleados> lst_KRS_Empleados = null;
                            foreach(TMP_Emails_Informes_PorFechas mdl_TMP_Emails_Informes_PorFechas in lst_TMP_Emails_Informes_PorFechas_MENSUAL_DISPOSITIVOS)
                            {
                                Informes_PorFechas_Mensual_TotalDispositivos(mdl_TMP_Emails_Informes_PorFechas, lng_idEmpresa);
                            }
                        }
                        //#####################################################################################################################################################################################################################

                        //Emails pendiente de Enviar de Informes Tipo Diario RecordatorioFichajes ###############################################################################################################################################
                        List<TMP_Emails_RecordatorioFichajes> lst_TMP_Emails_RecordatorioFichajes_DIARIO_RECORDATORIO = g_obj_TMP_Emails_RecordatorioFichajes_Datos.Obtener_Listado(_lng_CodigoCliente);
                        if(lst_TMP_Emails_RecordatorioFichajes_DIARIO_RECORDATORIO != null && lst_TMP_Emails_RecordatorioFichajes_DIARIO_RECORDATORIO.Count > 0)
                        {
                            foreach (TMP_Emails_RecordatorioFichajes mdl_TMP_Emails_RecordatorioFichajes in lst_TMP_Emails_RecordatorioFichajes_DIARIO_RECORDATORIO)
                            {
                                Informes_PorFechas_Diario_RecordatorioFichaje(mdl_TMP_Emails_RecordatorioFichajes);
                            }
                        }
                        //#####################################################################################################################################################################################################################
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichaje_EnvioEmail) + "/" + nameof(Informes_PorFechas));
            }

        }

        private void Informes_PorFechas_Diario(TMP_Emails_Informes_PorFechas _mdl_TMP_Emails_Informes_PorFechas, List<KRS_Empleados> _lst_KRS_Empleados,long _lng_idEmpresa)
        {
            List<INTERNO_KairosPRO_Detalle_Fichaje_Modelo> lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo = new List<INTERNO_KairosPRO_Detalle_Fichaje_Modelo>();
            DateTime dtt_FechaDesde_BusquedaFichaje = _mdl_TMP_Emails_Informes_PorFechas.fechaDesde;
            DateTime dtt_FechaHasta_BusquedaFichaje = _mdl_TMP_Emails_Informes_PorFechas.fechaHasta;

            INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = null;
            List<KRSS_Fichajes> lst_KRSS_Fichajes = null;
            KRS_AusenciasProgramadas mdl_KRS_AusenciasProgramadas = null;
            KRS_DiasFestivos mdl_KRS_DiasFestivos = null;

            TimeSpan? obj_tms_Nulo = null;
            bool bol_TienePresenciaProgramada = false;

            foreach (KRS_Empleados mdl_KRS_Empleados in _lst_KRS_Empleados)
            {
                mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = null;
                lst_KRSS_Fichajes = null;
                mdl_KRS_AusenciasProgramadas = null;
                mdl_KRS_DiasFestivos = null;
                bol_TienePresenciaProgramada = false;

                //BUscar la Jornada Cabecera para ese dia .........................................................................................................................
                //1º -> Por Presencias Programas
                mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_PresenciasProgramadas_ParaVerificacion(mdl_KRS_Empleados.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente, _mdl_TMP_Emails_Informes_PorFechas.fechaDesde);
                //2º Por JornadaCabcera Directamente
                if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo == null)
                {
                    mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_ParaVerificacion(mdl_KRS_Empleados.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente, _mdl_TMP_Emails_Informes_PorFechas.fechaDesde);
                }
                else
                {
                    bol_TienePresenciaProgramada = true;
                }

                TimeSpan? obj_TimeSpan = null;
                if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                {
                    obj_TimeSpan = mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico;
                }
                //..................................................................................................................................................................

                //Ver si el empleado tiene fecha de baja, y si es asi, que sea superior al afeha hasta, sino no se pone en el informe
                if (mdl_KRS_Empleados.fechaBaja == null || mdl_KRS_Empleados.fechaBaja.Value > dtt_FechaHasta_BusquedaFichaje)
                {
                    //Obtener los fichajes
                    lst_KRSS_Fichajes = g_obj_KRSS_Fichajes_Datos.Obtener_ModeloListado_Por_CodigoClienteEmpleadoFechaEmpresa(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, mdl_KRS_Empleados.id, dtt_FechaDesde_BusquedaFichaje, dtt_FechaHasta_BusquedaFichaje, _lng_idEmpresa);
                    if (lst_KRSS_Fichajes != null)
                    {

                        foreach (KRSS_Fichajes mdl_KRSS_Fichajes in lst_KRSS_Fichajes.OrderBy(m => m.fechaHora).ToList())
                        {

                            lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                        mdl_KRS_Empleados.nombre,
                                                                                                                        obj_TimeSpan,
                                                                                                                        mdl_KRSS_Fichajes.fechaHora,
                                                                                                                        mdl_KRSS_Fichajes.entradaSalida,
                                                                                                                        (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null ? mdl_KRSS_Fichajes.KRSS_DispositivosModelo.marca : ""),
                                                                                                                        (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null ? mdl_KRSS_Fichajes.KRSS_DispositivosModelo.modelo : ""),
                                                                                                                        (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null ? mdl_KRSS_Fichajes.KRSS_DispositivosModelo.mac : ""),
                                                                                                                        false,
                                                                                                                        ""
                                                                                                                        ));


                        }
                    }
                    //Ver si hay que grabar un registro para ese dia
                    else
                    {
                        //Si tuviera una presencia programada y no tiene fichajes
                        if (bol_TienePresenciaProgramada && mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                        {
                            lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                            mdl_KRS_Empleados.nombre,
                                                                                                                            (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null ? mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico : obj_tms_Nulo),
                                                                                                                            _mdl_TMP_Emails_Informes_PorFechas.fechaDesde,
                                                                                                                            "",
                                                                                                                            "",
                                                                                                                            "",
                                                                                                                            "",
                                                                                                                            true,
                                                                                                                            "No hay fichajes"
                                                                                                                            ));
                        }
                        //Ver si tiene una Ausencia Programada
                        else
                        {
                            mdl_KRS_AusenciasProgramadas = g_obj_KRS_AusenciasProgramadas_Datos.Obtener_Modelo_Por_EmpleadoClienteFecha_SinHoras(mdl_KRS_Empleados.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente, _mdl_TMP_Emails_Informes_PorFechas.fechaDesde,true);
                            if (mdl_KRS_AusenciasProgramadas != null)
                            {
                                lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                                    mdl_KRS_Empleados.nombre,
                                                                                                                                    (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null ? mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico : obj_tms_Nulo),
                                                                                                                                    _mdl_TMP_Emails_Informes_PorFechas.fechaDesde,
                                                                                                                                    "",
                                                                                                                                    "",
                                                                                                                                    "",
                                                                                                                                    "",
                                                                                                                                    true,
                                                                                                                                    "Ausencia programada: " + mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.descripcion
                                                                                                                                    ));
                            }
                            //Ver si tiene un dia festivo
                            else
                            {
                                mdl_KRS_DiasFestivos = g_obj_KRS_DiasFestivos_Datos.Obtener_Modelo_Por_CodigoClienteFecha(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, _mdl_TMP_Emails_Informes_PorFechas.fechaDesde);
                                if (mdl_KRS_DiasFestivos != null)
                                {
                                    lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                                    mdl_KRS_Empleados.nombre,
                                                                                                                                    (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null ? mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico : obj_tms_Nulo),
                                                                                                                                    _mdl_TMP_Emails_Informes_PorFechas.fechaDesde,
                                                                                                                                    "",
                                                                                                                                    "",
                                                                                                                                    "",
                                                                                                                                    "",
                                                                                                                                    true,
                                                                                                                                    "Día festivo: " + mdl_KRS_DiasFestivos.descripcion
                                                                                                                                    ));


                                }
                                //Ver si tiene que tener una Jornada
                                else
                                {
                                    if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                                    {
                                        lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                                        mdl_KRS_Empleados.nombre,
                                                                                                                                        (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null ? mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico : obj_tms_Nulo),
                                                                                                                                        _mdl_TMP_Emails_Informes_PorFechas.fechaDesde,
                                                                                                                                        "",
                                                                                                                                        "",
                                                                                                                                        "",
                                                                                                                                        "",
                                                                                                                                        true,
                                                                                                                                        "No hay fichajes"
                                                                                                                                        ));
                                    }
                                }
                            }
                        }
                    }
                }
            }

            //Enviar Email
            if (lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo != null && lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Count > 0)
            {
                if (Verificacion_Fichajes_Email.Enviar_DetalleFichaje(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo, _mdl_TMP_Emails_Informes_PorFechas.fechaDesde, _mdl_TMP_Emails_Informes_PorFechas.fechaHasta))
                {
                    //Se borra el registro de base de datos
                    g_obj_TMP_Emails_Informes_PorFechas_Datos.Borrar(_mdl_TMP_Emails_Informes_PorFechas.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente);
                }
            }
            else
            {
                //Se borra el registro de base de datos
                g_obj_TMP_Emails_Informes_PorFechas_Datos.Borrar(_mdl_TMP_Emails_Informes_PorFechas.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente);
            }
        }

        private void Informes_PorFechas_Semanal(TMP_Emails_Informes_PorFechas _mdl_TMP_Emails_Informes_PorFechas, List<KRS_Empleados> _lst_KRS_Empleados,long _lng_idEmpresa)
        {
            List<INTERNO_KairosPRO_Detalle_Fichaje_Modelo> lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo = new List<INTERNO_KairosPRO_Detalle_Fichaje_Modelo>();
            DateTime dtt_FechaDesde_RangoFechas = _mdl_TMP_Emails_Informes_PorFechas.fechaDesde;
            DateTime dtt_FechaHasta_RangoFechas = _mdl_TMP_Emails_Informes_PorFechas.fechaHasta;

            INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = null;
            List<KRSS_Fichajes> lst_KRSS_Fichajes = null;
            KRS_AusenciasProgramadas mdl_KRS_AusenciasProgramadas = null;
            KRS_DiasFestivos mdl_KRS_DiasFestivos = null;

            TimeSpan? obj_tms_Nulo = null;
            DateTime dtt_FechaDesde_BusquedaFichaje = dtt_FechaDesde_RangoFechas;
            DateTime dtt_FechaHasta_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddHours(23).AddMinutes(59);

            bool bol_TienePresenciaProgramada = false;
            foreach (KRS_Empleados mdl_KRS_Empleados in _lst_KRS_Empleados)
            {
                dtt_FechaDesde_BusquedaFichaje = dtt_FechaDesde_RangoFechas;
                dtt_FechaHasta_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddHours(23).AddMinutes(59);

                for (int int_Contador = 0; int_Contador < 7; int_Contador++)
                {
                    bol_TienePresenciaProgramada = false;

                    mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = null;
                    lst_KRSS_Fichajes = null;
                    mdl_KRS_AusenciasProgramadas = null;
                    mdl_KRS_DiasFestivos = null;

                    //BUscar la Jornada Cabecera para ese dia .........................................................................................................................
                    //1º -> Por Presencias Programas
                    mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_PresenciasProgramadas_ParaVerificacion(mdl_KRS_Empleados.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente, dtt_FechaDesde_BusquedaFichaje);
                    //2º Por JornadaCabcera DIrectamente
                    if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo == null)
                    {
                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_ParaVerificacion(mdl_KRS_Empleados.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente, dtt_FechaDesde_BusquedaFichaje);
                    }
                    else
                    {
                        bol_TienePresenciaProgramada = true;
                    }

                    TimeSpan? obj_TimeSpan = null;
                    if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                    {
                        obj_TimeSpan = mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico;
                    }
                    //..................................................................................................................................................................

                    //Obtener los fichajes
                    lst_KRSS_Fichajes = g_obj_KRSS_Fichajes_Datos.Obtener_ModeloListado_Por_CodigoClienteEmpleadoFechaEmpresa(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, mdl_KRS_Empleados.id, dtt_FechaDesde_BusquedaFichaje, dtt_FechaHasta_BusquedaFichaje, _lng_idEmpresa);
                    if (lst_KRSS_Fichajes != null)
                    {

                        foreach (KRSS_Fichajes mdl_KRSS_Fichajes in lst_KRSS_Fichajes.OrderBy(m => m.fechaHora).ToList())
                        {

                            lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                        mdl_KRS_Empleados.nombre,
                                                                                                                      obj_TimeSpan,
                                                                                                                      mdl_KRSS_Fichajes.fechaHora,
                                                                                                                      mdl_KRSS_Fichajes.entradaSalida,
                                                                                                                      (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null ? mdl_KRSS_Fichajes.KRSS_DispositivosModelo.marca : ""),
                                                                                                                       (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null ? mdl_KRSS_Fichajes.KRSS_DispositivosModelo.modelo : ""),
                                                                                                                      (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null ? mdl_KRSS_Fichajes.KRSS_DispositivosModelo.mac : ""),
                                                                                                                      false,
                                                                                                                      ""
                                                                                                                      ));

                        }
                    }
                    //Ver si hay que grabar un registro para ese dia
                    else
                    {
                        //Si tuviera una presencia programada y no tiene fichajes
                        if (bol_TienePresenciaProgramada && mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                        {
                            lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                          mdl_KRS_Empleados.nombre,
                                                                                                                          (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null ? mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico : obj_tms_Nulo),
                                                                                                                          dtt_FechaDesde_BusquedaFichaje,
                                                                                                                          "",
                                                                                                                           "",
                                                                                                                           "",
                                                                                                                           "",
                                                                                                                           true,
                                                                                                                           "No hay fichajes"
                                                                                                                          ));
                        }
                        //Ver si tiene una Ausencia Programada
                        else
                        {
                            mdl_KRS_AusenciasProgramadas = g_obj_KRS_AusenciasProgramadas_Datos.Obtener_Modelo_Por_EmpleadoClienteFecha_SinHoras(mdl_KRS_Empleados.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente, dtt_FechaDesde_BusquedaFichaje,true);
                            if (mdl_KRS_AusenciasProgramadas != null)
                            {
                                lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                                  mdl_KRS_Empleados.nombre,
                                                                                                                                  null,
                                                                                                                                  dtt_FechaDesde_BusquedaFichaje,
                                                                                                                                  "",
                                                                                                                                   "",
                                                                                                                                   "",
                                                                                                                                   "",
                                                                                                                                   true,
                                                                                                                                  "Ausencia programada: " + mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.descripcion
                                                                                                                                  ));
                            }
                            //Ver si tiene un dia festivo
                            else
                            {
                                mdl_KRS_DiasFestivos = g_obj_KRS_DiasFestivos_Datos.Obtener_Modelo_Por_CodigoClienteFecha(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, dtt_FechaDesde_BusquedaFichaje);
                                if (mdl_KRS_DiasFestivos != null)
                                {
                                    lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                                  mdl_KRS_Empleados.nombre,
                                                                                                                                  null,
                                                                                                                                  dtt_FechaDesde_BusquedaFichaje,
                                                                                                                                  "",
                                                                                                                                   "",
                                                                                                                                   "",
                                                                                                                                   "",
                                                                                                                                   true,
                                                                                                                                  "Día festivo: " + mdl_KRS_DiasFestivos.descripcion
                                                                                                                                  ));


                                }
                                //Ver si tiene que tener una Jornada
                                else
                                {
                                    //Tiene Jornada pero no hay fichajes
                                    if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                                    {
                                        lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                                      mdl_KRS_Empleados.nombre,
                                                                                                                                      (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null ? mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico : obj_tms_Nulo),
                                                                                                                                      dtt_FechaDesde_BusquedaFichaje,
                                                                                                                                      "",
                                                                                                                                       "",
                                                                                                                                       "",
                                                                                                                                       "",
                                                                                                                                       true,
                                                                                                                                       "No hay fichajes"
                                                                                                                                      ));
                                    }
                                }
                            }
                        }
                    }

                    dtt_FechaDesde_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddDays(1);
                    dtt_FechaHasta_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddHours(23).AddMinutes(59);
                }
            }

            //Enviar Email
            if (lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo != null && lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Count > 0)
            {
                if (Verificacion_Fichajes_Email.Enviar_DetalleFichaje(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo, _mdl_TMP_Emails_Informes_PorFechas.fechaDesde, _mdl_TMP_Emails_Informes_PorFechas.fechaHasta))
                {
                    //Se borra el registro de base de datos
                    g_obj_TMP_Emails_Informes_PorFechas_Datos.Borrar(_mdl_TMP_Emails_Informes_PorFechas.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente);
                }
            }
            else
            {
                //Se borra el registro de base de datos
                g_obj_TMP_Emails_Informes_PorFechas_Datos.Borrar(_mdl_TMP_Emails_Informes_PorFechas.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente);
            }
        }

        private void Informes_PorFechas_Mensual(TMP_Emails_Informes_PorFechas _mdl_TMP_Emails_Informes_PorFechas, List<KRS_Empleados> _lst_KRS_Empleados,long _lng_idEmpresa)
        {
            List<INTERNO_KairosPRO_Detalle_Fichaje_Modelo> lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo = new List<INTERNO_KairosPRO_Detalle_Fichaje_Modelo>();
            DateTime dtt_FechaDesde_RangoFechas = _mdl_TMP_Emails_Informes_PorFechas.fechaDesde;
            DateTime dtt_FechaHasta_RangoFechas = _mdl_TMP_Emails_Informes_PorFechas.fechaHasta;

            INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = null;
            List<KRSS_Fichajes> lst_KRSS_Fichajes = null;
            KRS_AusenciasProgramadas mdl_KRS_AusenciasProgramadas = null;
            KRS_DiasFestivos mdl_KRS_DiasFestivos = null;

            TimeSpan? obj_tms_Nulo = null;
            DateTime dtt_FechaDesde_BusquedaFichaje = dtt_FechaDesde_RangoFechas;
            DateTime dtt_FechaHasta_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddHours(23).AddMinutes(59);

            bool bol_TienePresenciaProgramada = false;

            foreach (KRS_Empleados mdl_KRS_Empleados in _lst_KRS_Empleados)
            {
                dtt_FechaDesde_BusquedaFichaje = dtt_FechaDesde_RangoFechas;
                dtt_FechaHasta_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddHours(23).AddMinutes(59);

                for (int int_Contador = 0; int_Contador < DateTime.DaysInMonth(dtt_FechaDesde_RangoFechas.Year, dtt_FechaDesde_RangoFechas.Month); int_Contador++)
                {
                    bol_TienePresenciaProgramada = false;

                    mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = null;
                    lst_KRSS_Fichajes = null;
                    mdl_KRS_AusenciasProgramadas = null;
                    mdl_KRS_DiasFestivos = null;



                    //BUscar la Jornada Cabecera para ese dia .........................................................................................................................
                    //1º -> Por Presencias Programas
                    mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_PresenciasProgramadas_ParaVerificacion(mdl_KRS_Empleados.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente, dtt_FechaDesde_BusquedaFichaje);
                    //2º Por JornadaCabcera DIrectamente
                    if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo == null)
                    {
                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_ParaVerificacion(mdl_KRS_Empleados.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente, dtt_FechaDesde_BusquedaFichaje);
                    }
                    else
                    {
                        bol_TienePresenciaProgramada = true;
                    }

                    TimeSpan? obj_TimeSpan = null;
                    if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                    {
                        obj_TimeSpan = mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico;
                    }
                    //..................................................................................................................................................................

                    //Obtener los fichajes
                    lst_KRSS_Fichajes = g_obj_KRSS_Fichajes_Datos.Obtener_ModeloListado_Por_CodigoClienteEmpleadoFechaEmpresa(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, 
                                                                                                                            mdl_KRS_Empleados.id, 
                                                                                                                            dtt_FechaDesde_BusquedaFichaje, 
                                                                                                                            dtt_FechaHasta_BusquedaFichaje,
                                                                                                                            _lng_idEmpresa);

                    if (lst_KRSS_Fichajes != null)
                    {
                        foreach (KRSS_Fichajes mdl_KRSS_Fichajes in lst_KRSS_Fichajes.OrderBy(m => m.fechaHora).ToList())
                        {

                            lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                        mdl_KRS_Empleados.nombre,
                                                                                                                      obj_TimeSpan,
                                                                                                                      mdl_KRSS_Fichajes.fechaHora,
                                                                                                                      mdl_KRSS_Fichajes.entradaSalida,
                                                                                                                      (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null ? mdl_KRSS_Fichajes.KRSS_DispositivosModelo.marca : ""),
                                                                                                                       (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null ? mdl_KRSS_Fichajes.KRSS_DispositivosModelo.modelo : ""),
                                                                                                                      (mdl_KRSS_Fichajes.KRSS_DispositivosModelo != null ? mdl_KRSS_Fichajes.KRSS_DispositivosModelo.mac : ""),
                                                                                                                      false,
                                                                                                                      ""
                                                                                                                      ));


                        }
                    }
                    //Ver si hay que grabar un registro para ese dia
                    else
                    {
                        //Tiene JOrnada pero no hay fichajes
                        if (bol_TienePresenciaProgramada && mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                        {
                            lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                          mdl_KRS_Empleados.nombre,
                                                                                                                          (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null ? mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico : obj_tms_Nulo),
                                                                                                                          dtt_FechaDesde_BusquedaFichaje,
                                                                                                                          "",
                                                                                                                           "",
                                                                                                                           "",
                                                                                                                           "",
                                                                                                                           true,
                                                                                                                           "No hay fichajes"
                                                                                                                          ));
                        }
                        //Ver si tiene una Ausencia Programada
                        else
                        {
                            mdl_KRS_AusenciasProgramadas = g_obj_KRS_AusenciasProgramadas_Datos.Obtener_Modelo_Por_EmpleadoClienteFecha_SinHoras(mdl_KRS_Empleados.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente, dtt_FechaDesde_BusquedaFichaje,true);
                            if (mdl_KRS_AusenciasProgramadas != null)
                            {
                                lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                                  mdl_KRS_Empleados.nombre,
                                                                                                                                  null,
                                                                                                                                  dtt_FechaDesde_BusquedaFichaje,
                                                                                                                                  "",
                                                                                                                                   "",
                                                                                                                                   "",
                                                                                                                                   "",
                                                                                                                                   true,
                                                                                                                                  "Ausencia programada: " + mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.descripcion
                                                                                                                                  ));
                            }
                            //Ver si tiene un dia festivo
                            else
                            {
                                mdl_KRS_DiasFestivos = g_obj_KRS_DiasFestivos_Datos.Obtener_Modelo_Por_CodigoClienteFecha(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, dtt_FechaDesde_BusquedaFichaje);
                                if (mdl_KRS_DiasFestivos != null)
                                {
                                    lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                                  mdl_KRS_Empleados.nombre,
                                                                                                                                  null,
                                                                                                                                  dtt_FechaDesde_BusquedaFichaje,
                                                                                                                                  "",
                                                                                                                                   "",
                                                                                                                                   "",
                                                                                                                                   "",
                                                                                                                                   true,
                                                                                                                                  "Día festivo: " + mdl_KRS_DiasFestivos.descripcion
                                                                                                                                  ));


                                }
                                //Ver si tiene que tener una Jornada
                                else
                                {
                                    //Tiene JOrnada pero no hay fichajes
                                    if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                                    {
                                        lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Add(new INTERNO_KairosPRO_Detalle_Fichaje_Modelo(mdl_KRS_Empleados.id,
                                                                                                                                      mdl_KRS_Empleados.nombre,
                                                                                                                                      (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null ? mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.tiempoTeorico : obj_tms_Nulo),
                                                                                                                                      dtt_FechaDesde_BusquedaFichaje,
                                                                                                                                      "",
                                                                                                                                       "",
                                                                                                                                       "",
                                                                                                                                       "",
                                                                                                                                       true,
                                                                                                                                       "No hay fichajes"
                                                                                                                                      ));
                                    }
                                }
                            }
                        }
                    }

                    dtt_FechaDesde_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddDays(1);
                    dtt_FechaHasta_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddHours(23).AddMinutes(59);
                }
            }

            //Enviar Email
            if (lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo != null && lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo.Count > 0)
            {
                if (Verificacion_Fichajes_Email.Enviar_DetalleFichaje(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, lst_INTERNO_KairosPRO_Detalle_Fichaje_Modelo, _mdl_TMP_Emails_Informes_PorFechas.fechaDesde, _mdl_TMP_Emails_Informes_PorFechas.fechaHasta))
                {
                    //Se borra el registro de base de datos
                    g_obj_TMP_Emails_Informes_PorFechas_Datos.Borrar(_mdl_TMP_Emails_Informes_PorFechas.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente);
                }
            }
            else
            {
                //Se borra el registro de base de datos
                g_obj_TMP_Emails_Informes_PorFechas_Datos.Borrar(_mdl_TMP_Emails_Informes_PorFechas.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente);
            }
        }

        public void Informes_PorFechas_Mensual_TotalDispositivos(TMP_Emails_Informes_PorFechas _mdl_TMP_Emails_Informes_PorFechas,long _lng_idEmpresa)
        {
            List<INTERNO_KairosPRO_Fichaje_PorFechas_TotalDispositivos_Modelo> lst_INTERNO_KairosPRO_Fichaje_PorFechas_TotalDispositivos = new List<INTERNO_KairosPRO_Fichaje_PorFechas_TotalDispositivos_Modelo>();
            DateTime dtt_FechaDesde_RangoFechas = _mdl_TMP_Emails_Informes_PorFechas.fechaDesde;
            DateTime dtt_FechaHasta_RangoFechas = _mdl_TMP_Emails_Informes_PorFechas.fechaHasta;

            //Obtener los fichajes
            lst_INTERNO_KairosPRO_Fichaje_PorFechas_TotalDispositivos = g_obj_KRSS_Fichajes_Datos.Obtener_Listado_Fichajes_Dispositivos(_mdl_TMP_Emails_Informes_PorFechas.codigoCliente, _mdl_TMP_Emails_Informes_PorFechas.fechaDesde, _mdl_TMP_Emails_Informes_PorFechas.fechaHasta, _lng_idEmpresa);

            //Enviar Email
            if (lst_INTERNO_KairosPRO_Fichaje_PorFechas_TotalDispositivos != null && lst_INTERNO_KairosPRO_Fichaje_PorFechas_TotalDispositivos.Count > 0)
            {
                
                if (Verificacion_Fichajes_Email.Enviar_Fichaje_TotalDispositivos(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO_EXFERIA, lst_INTERNO_KairosPRO_Fichaje_PorFechas_TotalDispositivos, _mdl_TMP_Emails_Informes_PorFechas.fechaDesde, _mdl_TMP_Emails_Informes_PorFechas.fechaHasta, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente))
                {
                    //Se borra el registro de base de datos
                    g_obj_TMP_Emails_Informes_PorFechas_Datos.Borrar(_mdl_TMP_Emails_Informes_PorFechas.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente);
                }
            }
            else
            {
                //Se borra el registro de base de datos
                g_obj_TMP_Emails_Informes_PorFechas_Datos.Borrar(_mdl_TMP_Emails_Informes_PorFechas.id, _mdl_TMP_Emails_Informes_PorFechas.codigoCliente);
            }
        }

        public void Informes_PorFechas_Diario_RecordatorioFichaje(TMP_Emails_RecordatorioFichajes _mdl_TMP_Emails_RecordatorioFichajes)
        {
            //Obtener el Empleado
            KRS_Empleados mdl_KRS_Empleados = g_obj_KRS_Empleados_Datos.Obtener_Modelo_Por_Id(_mdl_TMP_Emails_RecordatorioFichajes.idEmpleado , _mdl_TMP_Emails_RecordatorioFichajes.codigoCliente,false,false);

            //Si no existe el empleado
            if (mdl_KRS_Empleados != null)
            {
                //si no tiene email
                if (mdl_KRS_Empleados.email.Trim().Length > 0)
                {
                    if (Verificacion_Fichajes_Email.Enviar_Fichaje_Recordatorio(_mdl_TMP_Emails_RecordatorioFichajes.codigoCliente, _mdl_TMP_Emails_RecordatorioFichajes, mdl_KRS_Empleados.email))
                    {
                        //se borra el registro de baso de datos
                        g_obj_TMP_Emails_RecordatorioFichajes_Datos.Borrar(_mdl_TMP_Emails_RecordatorioFichajes.id, _mdl_TMP_Emails_RecordatorioFichajes.codigoCliente);
                    }
                }
                else
                {
                    //se crea un mensaje en el log indicando que el empleado no tiene correo con su idCliente por si hiciera falta
                    Control_Errores.Errores_Log(Variables_KairosPRO.G_STR_TMP_RECORDATORIO_NOTIENEEMAIL(mdl_KRS_Empleados.nombre +"(" + (mdl_KRS_Empleados.id) + ")"), nameof(TMP_Emails_RecordatorioFichajes.codigoCliente) + ": " + _mdl_TMP_Emails_RecordatorioFichajes.codigoCliente.ToString());

                    //se borra el registro de baso de datos
                    g_obj_TMP_Emails_RecordatorioFichajes_Datos.Borrar(_mdl_TMP_Emails_RecordatorioFichajes.id, _mdl_TMP_Emails_RecordatorioFichajes.codigoCliente);
                }
            }
            //Si no existe el empleado se borra ya que nunca se envia el correo
            else
            {
                //se borra el registro de baso de datos
                g_obj_TMP_Emails_RecordatorioFichajes_Datos.Borrar(_mdl_TMP_Emails_RecordatorioFichajes.id, _mdl_TMP_Emails_RecordatorioFichajes.codigoCliente);
            }
        }
        #endregion
    }
}
