using Exferia_Aplicacion.General;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_KairosPRO._1_Modelos;
using Exferia_KairosPRO._2_Datos;
using Exferia_KairosPRO_EF;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Exferia_KairosPRO.General
{
    public class Verificacion_Fichajes
    {
        #region Variables privadas
        private long g_lng_CodigoCliente = -1;
        private DateTime g_dtt_Validacion;
        private KRS_Empleados g_mdl_KRS_Empleados = null;
        private bool g_bol_Grabar_Diccionarios_XML = false;
       // private List<INTERNO_VerificacionFichajes_JornadasLinea_Modelo> g_lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo = null;

        private KRS_DiasFestivos_Datos g_obj_KRS_DiasFestivos_Datos = new KRS_DiasFestivos_Datos();
        private KRS_JornadasCabecera_Datos g_obj_KRS_JornadasCabecera_Datos = new KRS_JornadasCabecera_Datos();
        private KRS_AusenciasProgramadas_Datos g_obj_KRS_AusenciasProgramadas_Datos = new KRS_AusenciasProgramadas_Datos();
        private KRSS_Fichajes_Datos g_obj_KRSS_Fichajes_Datos = new KRSS_Fichajes_Datos();
        private KRS_JornadasLinea_Datos g_obj_KRS_JornadasLinea_Datos = new KRS_JornadasLinea_Datos();
        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 KRSS_DispositivosModelo_Datos g_obj_KRSS_DispositivosModelo_Datos = new KRSS_DispositivosModelo_Datos();
        #endregion

        public void Proceso(long _lng_CodigoCliente, DateTime _dtt_Validacion, KRS_Empleados _mdl_KRS_Empleados,bool _bol_Grabar_Diccionarios_XML,long _lng_idEmpresa)
        {
            try
            {
                g_lng_CodigoCliente = _lng_CodigoCliente;
                g_dtt_Validacion = _dtt_Validacion;
                g_mdl_KRS_Empleados = _mdl_KRS_Empleados;
                g_bol_Grabar_Diccionarios_XML = _bol_Grabar_Diccionarios_XML;

                if (g_bol_Grabar_Diccionarios_XML == false)
                {
                    Variables_KairosPRO.G_DCT_JORNADASLINEASHORAINICIALYAVALIDADAS.Clear();
                    Variables_KairosPRO.G_DCT_JORNADASLINEASHORAINICIALYAVALIDADAS.Add(g_lng_CodigoCliente, new List<INTERNO_VerificacionFichajes_JornadaHoraInicialEmpleado_Validada_Modelo>());

                    Variables_KairosPRO.G_DCT_JORNADASLINEASHORAFINALYAVALIDADAS.Clear();
                    Variables_KairosPRO.G_DCT_JORNADASLINEASHORAFINALYAVALIDADAS.Add(g_lng_CodigoCliente, new List<INTERNO_VerificacionFichajes_JornadaHoraFinalEmpleado_Validada_Modelo>());

                    Variables_KairosPRO.G_DCT_DETALLEFICHAJEYAVALIDADOS.Clear();
                    Variables_KairosPRO.G_DCT_DETALLEFICHAJEYAVALIDADOS.Add(g_lng_CodigoCliente, new List<INTERNO_VerificacionFichajes_InformeDetalleFichaje_Validado_Modelo>());
                }

                DateTime dtt_Fecha_Calculada_Validacion = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(g_dtt_Validacion, g_mdl_KRS_Empleados.usoHorario);

                //Si la fecha de baja no es nula y es inferior a la fecha a validar nose pone el fichaje
                if (g_mdl_KRS_Empleados.fechaBaja == null || 
                    g_mdl_KRS_Empleados.fechaBaja.Value > dtt_Fecha_Calculada_Validacion)
                {
                    //Presencias Programadas .................................................................................
                    INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_PresenciasProgramadas_ParaVerificacion(g_mdl_KRS_Empleados.id, _lng_CodigoCliente, dtt_Fecha_Calculada_Validacion);
                    if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS != null)
                    {
                        Validacion_Jornada(g_mdl_KRS_Empleados.id,
                                            dtt_Fecha_Calculada_Validacion,
                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS,
                                            _lng_idEmpresa);
                    }
                    //Mirar Ausencias Programadas por Dia.................................................................................
                    else
                    {
                        KRS_AusenciasProgramadas mdl_KRS_AusenciasProgramadas = g_obj_KRS_AusenciasProgramadas_Datos.Obtener_Modelo_Por_EmpleadoClienteFecha_SinHoras(g_mdl_KRS_Empleados.id, _lng_CodigoCliente, dtt_Fecha_Calculada_Validacion,true);
                        if (mdl_KRS_AusenciasProgramadas != null)
                        {
                            Validacion_AusenciasProgramadas(g_mdl_KRS_Empleados.id,
                                                            dtt_Fecha_Calculada_Validacion,
                                                            mdl_KRS_AusenciasProgramadas,
                                                            _lng_idEmpresa);
                        }
                        //Mirar Dias Festivos .................................................................................
                        else
                        {
                            KRS_DiasFestivos mdl_KRS_DiasFestivos = g_obj_KRS_DiasFestivos_Datos.Obtener_Modelo_Por_CodigoClienteFecha(_lng_CodigoCliente, dtt_Fecha_Calculada_Validacion);
                            if (mdl_KRS_DiasFestivos != null)
                            {
                                Validacion_DiasFestivos(g_mdl_KRS_Empleados.id,
                                                        dtt_Fecha_Calculada_Validacion,
                                                        mdl_KRS_DiasFestivos,
                                                        _lng_idEmpresa);
                            }
                            //Mirar la Jornada .................................................................................
                            else
                            {
                                INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_ParaVerificacion(g_mdl_KRS_Empleados.id, _lng_CodigoCliente, dtt_Fecha_Calculada_Validacion);
                                if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                                {
                                    Validacion_Jornada(g_mdl_KRS_Empleados.id,
                                                        dtt_Fecha_Calculada_Validacion,
                                                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                        _lng_idEmpresa);
                                }
                                //Si hubieran fichaje para este dia, estarian todos incorrectos
                                else
                                {
                                    Validacion_Fichajes_SinNadaAsignado(g_mdl_KRS_Empleados.id,
                                                                        dtt_Fecha_Calculada_Validacion,
                                                                        _lng_idEmpresa);
                                }
                            }
                        }
                    }
                }
                //.......................................................................................................... 
                
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichajes) + "/" + nameof(Proceso));
            }
        }
        
        private void Validacion_Jornada(long _lng_idEmpleado,
                                        DateTime _dtt_Actual,
                                        INTERNO_Verificacion_JornadasCabecera_Modelo _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                        long _lng_idEmpresa)
        {
            try
            {
                DateTime dtt_FechaHoraActual = new DateTime(_dtt_Actual.Year, _dtt_Actual.Month, _dtt_Actual.Day,_dtt_Actual.Hour, _dtt_Actual.Minute, 0);


                //Dia de fichaje
                DateTime dtt_FechaDesde_BusquedaFichaje = Buscar_FechaInicial_BusquedaFichajes(_dtt_Actual);
                DateTime dtt_FechaHasta_BusquedaFichaje = Buscar_FechaFinal_BusquedaFichajes(_dtt_Actual);

                //Obtener todos los Fichajes del Dia
                List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo = g_obj_KRSS_Fichajes_Datos.Obtener_Listado_ParaVerificacionFichajes(g_lng_CodigoCliente, _lng_idEmpleado, dtt_FechaDesde_BusquedaFichaje, dtt_FechaHasta_BusquedaFichaje, _lng_idEmpresa);

                if (g_bol_Grabar_Diccionarios_XML==false && lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo!=null)
                {
                   lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m=>m.validado!=null).ToList().ForEach(m => m.validado = -1);
                }

                //JornadasLinea
                List<INTERNO_VerificacionFichajes_JornadasLinea_Modelo> lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo = g_obj_KRS_JornadasLinea_Datos.Obtener_JornadasLineas_ParaVerificacionFichajes(_mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,g_lng_CodigoCliente);

                //JornadasLineas Ya Validadas ...........................................
                long lng_UltimaJornadaValidada = -1;
                
                List<INTERNO_VerificacionFichajes_JornadaHoraFinalEmpleado_Validada_Modelo> lst_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo = null;
                if (Variables_KairosPRO.G_DCT_JORNADASLINEASHORAFINALYAVALIDADAS.Count > 0)
                {
                    lst_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo = Variables_KairosPRO.G_DCT_JORNADASLINEASHORAFINALYAVALIDADAS[g_lng_CodigoCliente];

                    if (lst_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo != null)
                    {
                        INTERNO_VerificacionFichajes_JornadaHoraFinalEmpleado_Validada_Modelo mdl_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo = lst_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo
                                                                                                                .Where(m => m.IdEmpleado.Equals(_lng_idEmpleado) &&
                                                                                                                            m.IdEmpresa.Equals(_lng_idEmpresa) &&
                                                                                                                            m.Fecha.ToString("dd/MM/yyyy").Equals(_dtt_Actual.ToString("dd/MM/yyyy"))).FirstOrDefault();
                        if (mdl_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo != null)
                        {
                            lng_UltimaJornadaValidada = mdl_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo.IdJornadaLinea;
                        }
                        //Sino tiene nada ese dia y la jornadacabecera tiene saltodia y se salto de dia busco en el dia anterior
                        else
                        {
                            if (_dtt_Actual.Date>_mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Date)
                            {
                                mdl_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo = lst_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo
                                                                                                               .Where(m =>  m.IdEmpleado.Equals(_lng_idEmpleado) &&
                                                                                                                            m.IdEmpresa.Equals(_lng_idEmpresa) &&
                                                                                                                            m.Fecha.ToString("dd/MM/yyyy").Equals(_dtt_Actual.AddDays(-1).ToString("dd/MM/yyyy"))).FirstOrDefault();

                                if (mdl_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo != null)
                                {
                                    lng_UltimaJornadaValidada = mdl_INTERNO_JornadaHoraFinalEmpleado_Validada_Modelo.IdJornadaLinea;
                                }
                            }
                        }
                    }
                }
                //.....................................................................

                if (lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo != null)
                {
                    int int_Contador = 1;
                    bool bol_JornadaLinea_Inicial = false;

                    bool bol_Tipo_JornadaAnterior_Flexible = false;


                    long lng_Tipo_JornadaLinea_Inicio = -1;
                    long lng_Tipo_JornadaLinea_Fin = -1;

                    bool bol_Salir_Bucle = false;
                    bool bol_ValidarFechas_Inferiores = false;

                    bool bol_ValidarHora_Inicial_JornadaLinea = false;
                    bool bol_ValidarHora_Final_JornadaLinea = false;

                    //Se utiliza esta variable para saber cuando cambia de dia la jornada
                    DateTime? dtt_JornadaLinea_Inicio_Calculo = null;
                    DateTime? dtt_JornadaLinea_Fin_Calculo = null;

                    #region Actualizar las jornadaLinea con los datos de las Ausencias programadas por horas si existieran
                    Funciones_KairosPRO.Obtener_JornadaLineas_ConSolicitudesDeAusentismoPorHoras(_lng_idEmpleado, dtt_FechaHoraActual,ref lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                    #endregion

                    foreach (INTERNO_VerificacionFichajes_JornadasLinea_Modelo mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo in lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo)
                    {
                        bol_Salir_Bucle = false;
                        bol_ValidarFechas_Inferiores = false;

                        bol_JornadaLinea_Inicial = false;
                        if (int_Contador == 1)
                        {
                            bol_JornadaLinea_Inicial = true;
                        }

                        //RANGO DE FECHAS Y HORAS ............
                        #region  INICIO
                        //Tipo
                        lng_Tipo_JornadaLinea_Inicio = mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.tipo;

                        if (dtt_JornadaLinea_Inicio_Calculo != null)
                        {
                            //Si la Linea salta de dia, se suma 1 dia
                            if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.saltaDia!=null &&
                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.saltaDia.Value)
                            {
                                dtt_JornadaLinea_Inicio_Calculo = dtt_JornadaLinea_Inicio_Calculo.Value.AddDays(1);
                            }
                        }
                        else
                        {
                            dtt_JornadaLinea_Inicio_Calculo = _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada;
                        }
                        DateTime dtt_JornadaLinea_Inicio =new DateTime(dtt_JornadaLinea_Inicio_Calculo.Value.Year,
                                                                        dtt_JornadaLinea_Inicio_Calculo.Value.Month,
                                                                        dtt_JornadaLinea_Inicio_Calculo.Value.Day,
                                                                        mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora.Hours,
                                                                        mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora.Minutes,
                                                                        0);
                        #endregion
                        #region FIN
                        DateTime dtt_JornadaLinea_Fin;
                        lng_Tipo_JornadaLinea_Fin = -1;

                        if (lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.Count > int_Contador)
                        {
                            //Tipo
                            lng_Tipo_JornadaLinea_Fin = lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador].tipo;

                            if (dtt_JornadaLinea_Fin_Calculo != null)
                            {
                                //Si la Linea salta de dia, se suma 1 dia
                                if (lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador].saltaDia != null &&
                                     lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador].saltaDia.Value)
                                {
                                    dtt_JornadaLinea_Fin_Calculo = dtt_JornadaLinea_Fin_Calculo.Value.AddDays(1);
                                }
                            }
                            else
                            {
                                //Si la Linea salta de dia, se suma 1 dia
                                if (lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador].saltaDia != null &&
                                     lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador].saltaDia.Value)
                                {
                                    dtt_JornadaLinea_Fin_Calculo = _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.AddDays(1);
                                }
                                else
                                {
                                    dtt_JornadaLinea_Fin_Calculo = _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada;
                                }
                                
                            }

                            dtt_JornadaLinea_Fin = new DateTime(dtt_JornadaLinea_Fin_Calculo.Value.Year,
                                                                dtt_JornadaLinea_Fin_Calculo.Value.Month,
                                                                dtt_JornadaLinea_Fin_Calculo.Value.Day,
                                                                lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador].hora.Hours,
                                                                lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador].hora.Minutes,
                                                                0);
                        }
                        else//Es el ultimo registro
                        {
                            //Si la hora es las 00:00:00 se sustituye por 23:59:59
                            if (_mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.horaCambioDia.Hours == 0 &&
                                _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.horaCambioDia.Minutes == 0)
                            {
                                dtt_JornadaLinea_Fin = new DateTime(dtt_JornadaLinea_Inicio.Year,
                                                                    dtt_JornadaLinea_Inicio.Month,
                                                                    dtt_JornadaLinea_Inicio.Day,
                                                                    23,
                                                                    59,
                                                                    59);
                            }
                            else
                            {
                                dtt_JornadaLinea_Fin = new DateTime(dtt_JornadaLinea_Inicio.Year,
                                                                    dtt_JornadaLinea_Inicio.Month,
                                                                    dtt_JornadaLinea_Inicio.Day,
                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.horaCambioDia.Hours,
                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.horaCambioDia.Minutes,
                                                                    59);
                            }
                        }
                        #endregion

                        #region INICIO Y FIN,CALCULAR RANGOS FE FECHAS CORRECTAMENTE
                        
                        //Si no es la ultuima jornada se resta un segundo
                        if (lng_Tipo_JornadaLinea_Fin != -1)
                        {
                            dtt_JornadaLinea_Fin = dtt_JornadaLinea_Fin.AddSeconds(-1);
                        }
                        #endregion

                        if (lng_UltimaJornadaValidada == -1 || 
                            lng_UltimaJornadaValidada < mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id)
                        {
                            bol_ValidarHora_Inicial_JornadaLinea = Validar_Hora_Inicio(dtt_JornadaLinea_Inicio, _dtt_Actual, _dtt_Actual);
                            bol_ValidarHora_Final_JornadaLinea = Validar_Hora_Fin(dtt_JornadaLinea_Fin, _dtt_Actual, _dtt_Actual, _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada);

                            //La hora actual de validacion tiene que ser mayor o igual a la hora Inicial de la jornada linea
                            if (bol_ValidarHora_Inicial_JornadaLinea)
                            {
                                if (bol_ValidarHora_Final_JornadaLinea)
                                {
                                    //TIPO AUSENCIA OBLIGATORIA @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                    if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA))
                                    {
                                        Validacion_Jornada_AusenciaObligatoria(_lng_idEmpleado,
                                                                               _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                                               mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                               _dtt_Actual,
                                                                               bol_JornadaLinea_Inicial,
                                                                               dtt_JornadaLinea_Inicio,
                                                                               dtt_JornadaLinea_Fin,
                                                                               ref lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                               bol_Tipo_JornadaAnterior_Flexible,
                                                                               _lng_idEmpresa,
                                                                               lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                                    }
                                    //TIPO FLEXIBLE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                    else if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_FLEXIBLE))
                                    {
                                        Validacion_Jornada_Flexible(_lng_idEmpleado,
                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                                    mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                    _dtt_Actual,
                                                                    lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                    int_Contador,
                                                                    dtt_JornadaLinea_Inicio,
                                                                    dtt_JornadaLinea_Fin,
                                                                    ref lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                    _lng_idEmpresa);
                                    }
                                    //TIPO PRESENCIA OBLIGADA @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                    else
                                    {
                                        Validacion_Jornada_PresenciaObligatoria(_lng_idEmpleado,
                                                                              _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                                              mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                              _dtt_Actual,
                                                                              bol_JornadaLinea_Inicial,
                                                                              dtt_JornadaLinea_Inicio,
                                                                              dtt_JornadaLinea_Fin,
                                                                              ref lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                              bol_Tipo_JornadaAnterior_Flexible,
                                                                              _lng_idEmpresa,
                                                                              lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                                    }
                                }
                                else
                                {
                                    bol_ValidarFechas_Inferiores = true;
                                }

                                //Grabar en diccionario la jornada final ya validada
                                //Si la fecha actual es mayor que la fecha inicial de la jornadaLinea, significa que cambio de dia, pero esta en la misma jornada
                                if (_dtt_Actual.Date>_mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Date)
                                {
                                    Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_JornadaLineaHoraFinalYaValidadas( g_lng_CodigoCliente,
                                                                                                                                _lng_idEmpleado,
                                                                                                                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id,
                                                                                                                                _dtt_Actual,
                                                                                                                                g_bol_Grabar_Diccionarios_XML,
                                                                                                                                _lng_idEmpresa);
                                    
                                }
                                else
                                {
                                    if (_mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Date < _dtt_Actual.Date)
                                    {
                                        Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_JornadaLineaHoraFinalYaValidadas(g_lng_CodigoCliente,
                                                                                                            _lng_idEmpleado,
                                                                                                            mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id,
                                                                                                            _dtt_Actual,
                                                                                                            g_bol_Grabar_Diccionarios_XML,
                                                                                                            _lng_idEmpresa);
                                    }
                                    else
                                    {

                                        

                                        if (dtt_JornadaLinea_Fin <= dtt_FechaHoraActual)
                                        {
                                            Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_JornadaLineaHoraFinalYaValidadas(g_lng_CodigoCliente,
                                                                                                            _lng_idEmpleado,
                                                                                                            mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id,
                                                                                                            _dtt_Actual,
                                                                                                            g_bol_Grabar_Diccionarios_XML,
                                                                                                            _lng_idEmpresa);

                                        }
                                    }
                                }
                            }
                            //Hay Fichajes por debajo de la hora y no estan validados, comprobar si son correctos
                            else
                            {
                                bol_Salir_Bucle = true;
                                bol_ValidarFechas_Inferiores = true;
                            }
                        }
                        else
                        {
                            bol_ValidarFechas_Inferiores = true;
                        }


                        //TIPO AUSENCIA OBLIGATORIA @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                        if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA))
                        {
                            bol_Tipo_JornadaAnterior_Flexible = false;
                        }
                        //TIPO FLEXIBLE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                        else if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_FLEXIBLE))
                        {
                            bol_Tipo_JornadaAnterior_Flexible = true;
                        }
                        //TIPO PRESENCIA OBLIGADA @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                        else
                        {
                            bol_Tipo_JornadaAnterior_Flexible = false;
                        }

                        if (bol_ValidarFechas_Inferiores)
                        {
                            //Se hace un bucle , por si se salta de dia, que el order de las fechas sea el correcto
                            if (lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo != null && 
                                lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Count > 0)
                            {
                                //Solo los fichajes que sean de fecha inferior a la hora inicial de la jornadaLinea que se esta validando ................................
                                List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_FILTRADO = null;

                                if (_dtt_Actual >= dtt_JornadaLinea_Fin)
                                {
                                    lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_FILTRADO = lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => m.fechaHora <= dtt_JornadaLinea_Fin).ToList();
                                }
                                //............................................................................................................................................

                                if (lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_FILTRADO != null)
                                {
                                    bool bol_Validar_HoraIncial_JornadaLinea_FECHASINERIORES = false;
                                    bool bol_Validar_HoraFinal_JornadaLinea_FECHASINERIORES = false;

                                    foreach (INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo in lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_FILTRADO.Where(m => (g_bol_Grabar_Diccionarios_XML ? m.validado == null : (m.validado != null && m.validado.Value == -1))).OrderBy(m => m.fechaHora))
                                    {
                                        int int_Contador_PARAFICHAJESNOVALIDADOS = 1;

                                        long lng_Tipo_JornadaLinea_Inicio_NOVALIDADOS = -1;
                                        long lng_Tipo_JornadaLinea_Fin_NOVALIDADOS = -1;

                                        bool bol_Tipo_JornadaAnterior_Flexible_NOVALIDADOS = false;

                                        //Se utiliza esta variable para saber cuando cambia de dia la jornada
                                        DateTime? dtt_JornadaLinea_INICIO_NOVALIDADOS_CALCULOS = null;
                                        DateTime? dtt_JornadaLinea_FIN_NOVALIDADOS_CALCULOS = null;

                                        //Buscar en que jornadaLinea se pone
                                        foreach (INTERNO_VerificacionFichajes_JornadasLinea_Modelo mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS in lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo)
                                        {
                                            bol_JornadaLinea_Inicial = false;
                                            if (int_Contador_PARAFICHAJESNOVALIDADOS == 1)
                                            {
                                                bol_JornadaLinea_Inicial = true;
                                            }

                                            //Ver Hora Final .........................................................................
                                            #region  INICIO
                                            //Tipo
                                            lng_Tipo_JornadaLinea_Inicio_NOVALIDADOS = mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS.tipo;

                                            if (dtt_JornadaLinea_INICIO_NOVALIDADOS_CALCULOS != null)
                                            {
                                                //Si la Linea salta de dia, se suma 1 dia
                                                if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS.saltaDia != null &&
                                                    mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS.saltaDia.Value)
                                                {
                                                    dtt_JornadaLinea_INICIO_NOVALIDADOS_CALCULOS = dtt_JornadaLinea_INICIO_NOVALIDADOS_CALCULOS.Value.AddDays(1);
                                                }
                                            }
                                            else
                                            {
                                                dtt_JornadaLinea_INICIO_NOVALIDADOS_CALCULOS = _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada;
                                            }
                                            DateTime dtt_JornadaLinea_Inicio_NOVALIDADOS = new DateTime(dtt_JornadaLinea_INICIO_NOVALIDADOS_CALCULOS.Value.Year,
                                                                                                        dtt_JornadaLinea_INICIO_NOVALIDADOS_CALCULOS.Value.Month,
                                                                                                        dtt_JornadaLinea_INICIO_NOVALIDADOS_CALCULOS.Value.Day,
                                                                                                        mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS.hora.Hours,
                                                                                                        mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS.hora.Minutes,
                                                                                                        0);
                                            #endregion

                                            #region FIN
                                            DateTime dtt_JornadaLinea_Fin_NOVALIDADOS;
                                            lng_Tipo_JornadaLinea_Fin_NOVALIDADOS = -1;

                                            if (lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.Count > int_Contador_PARAFICHAJESNOVALIDADOS)
                                            {
                                                //Tipo
                                                lng_Tipo_JornadaLinea_Fin_NOVALIDADOS = lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador_PARAFICHAJESNOVALIDADOS].tipo;

                                                if (dtt_JornadaLinea_FIN_NOVALIDADOS_CALCULOS != null)
                                                {
                                                    //Si la Linea salta de dia, se suma 1 dia
                                                    if (lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador_PARAFICHAJESNOVALIDADOS].saltaDia != null &&
                                                         lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador_PARAFICHAJESNOVALIDADOS].saltaDia.Value)
                                                    {
                                                        dtt_JornadaLinea_FIN_NOVALIDADOS_CALCULOS = dtt_JornadaLinea_FIN_NOVALIDADOS_CALCULOS.Value.AddDays(1);
                                                    }
                                                }
                                                else
                                                {
                                                    //Si la Linea salta de dia, se suma 1 dia
                                                    if (lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador_PARAFICHAJESNOVALIDADOS].saltaDia != null &&
                                                         lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador_PARAFICHAJESNOVALIDADOS].saltaDia.Value)
                                                    {
                                                        dtt_JornadaLinea_FIN_NOVALIDADOS_CALCULOS = _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.AddDays(1);
                                                    }
                                                    else
                                                    {
                                                        dtt_JornadaLinea_FIN_NOVALIDADOS_CALCULOS = _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada;
                                                    }

                                                }

                                                dtt_JornadaLinea_Fin_NOVALIDADOS = new DateTime(dtt_JornadaLinea_FIN_NOVALIDADOS_CALCULOS.Value.Year,
                                                                                                dtt_JornadaLinea_FIN_NOVALIDADOS_CALCULOS.Value.Month,
                                                                                                dtt_JornadaLinea_FIN_NOVALIDADOS_CALCULOS.Value.Day,
                                                                                                lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador_PARAFICHAJESNOVALIDADOS].hora.Hours,
                                                                                                lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador_PARAFICHAJESNOVALIDADOS].hora.Minutes,
                                                                                                0);
                                            }
                                            else//Es el ultimo registro
                                            {
                                                //Si la hora es las 00:00:00 se sustituye por 23:59:59
                                                if (_mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.horaCambioDia.Hours == 0 &&
                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.horaCambioDia.Minutes == 0)
                                                {
                                                    dtt_JornadaLinea_Fin_NOVALIDADOS = new DateTime(dtt_JornadaLinea_Inicio_NOVALIDADOS.Year,
                                                                                                    dtt_JornadaLinea_Inicio_NOVALIDADOS.Month,
                                                                                                    dtt_JornadaLinea_Inicio_NOVALIDADOS.Day,
                                                                                                    23,
                                                                                                    59,
                                                                                                    59);
                                                }
                                                else
                                                {
                                                    dtt_JornadaLinea_Fin_NOVALIDADOS = new DateTime(dtt_JornadaLinea_Inicio_NOVALIDADOS.Year,
                                                                                                    dtt_JornadaLinea_Inicio_NOVALIDADOS.Month,
                                                                                                    dtt_JornadaLinea_Inicio_NOVALIDADOS.Day,
                                                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.horaCambioDia.Hours,
                                                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.horaCambioDia.Minutes,
                                                                                                    59);
                                                }
                                            }
                                            #endregion

                                            #region INICIO Y FIN,CALCULAR RANGOS FE FECHAS CORRECTAMENTE
                                            //Si no es la ultuima jornada se resta un segundo
                                            if (lng_Tipo_JornadaLinea_Fin_NOVALIDADOS != -1)
                                            {
                                                dtt_JornadaLinea_Fin_NOVALIDADOS = dtt_JornadaLinea_Fin_NOVALIDADOS.AddSeconds(-1);
                                            }
                                            #endregion

                                            bol_Validar_HoraIncial_JornadaLinea_FECHASINERIORES = Validar_Hora_Inicio(dtt_JornadaLinea_Inicio_NOVALIDADOS,  _dtt_Actual, mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora);
                                            bol_Validar_HoraFinal_JornadaLinea_FECHASINERIORES = Validar_Hora_Fin(dtt_JornadaLinea_Fin_NOVALIDADOS, _dtt_Actual, mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora, _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada);

                                            if (bol_Validar_HoraIncial_JornadaLinea_FECHASINERIORES &&
                                                bol_Validar_HoraFinal_JornadaLinea_FECHASINERIORES)
                                            {

                                                //TIPO AUSENCIA OBLIGATORIA @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                                if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA))
                                                {
                                                    Validacion_Jornada_AusenciaObligatoria(_lng_idEmpleado,
                                                                                           _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                                                           mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS,
                                                                                           _dtt_Actual,
                                                                                           bol_JornadaLinea_Inicial,
                                                                                           dtt_JornadaLinea_Inicio_NOVALIDADOS,
                                                                                           dtt_JornadaLinea_Fin_NOVALIDADOS,
                                                                                           ref lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                                           bol_Tipo_JornadaAnterior_Flexible_NOVALIDADOS,
                                                                                           _lng_idEmpresa,
                                                                                           lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                                                }
                                                //TIPO FLEXIBLE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                                else if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_FLEXIBLE))
                                                {
                                                    Validacion_Jornada_Flexible(_lng_idEmpleado,
                                                                                _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS,
                                                                                _dtt_Actual,
                                                                                lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                                int_Contador,
                                                                                dtt_JornadaLinea_Inicio_NOVALIDADOS,
                                                                                dtt_JornadaLinea_Fin_NOVALIDADOS,
                                                                                ref lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                                _lng_idEmpresa);
                                                }
                                                //TIPO PRESENCIA OBLIGADA @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                                else
                                                {
                                                    Validacion_Jornada_PresenciaObligatoria(_lng_idEmpleado,
                                                                                          _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                                                          mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS,
                                                                                          _dtt_Actual,
                                                                                          bol_JornadaLinea_Inicial,
                                                                                          dtt_JornadaLinea_Inicio_NOVALIDADOS,
                                                                                          dtt_JornadaLinea_Fin_NOVALIDADOS,
                                                                                          ref lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                                          bol_Tipo_JornadaAnterior_Flexible_NOVALIDADOS,
                                                                                          _lng_idEmpresa,
                                                                                          lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                                                }


                                                break;
                                            }

                                            //TIPO AUSENCIA OBLIGATORIA @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                            if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA))
                                            {
                                                bol_Tipo_JornadaAnterior_Flexible_NOVALIDADOS = false;
                                            }
                                            //TIPO FLEXIBLE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                            else if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_PARAFICHAJESNOVALIDADOS.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_FLEXIBLE))
                                            {
                                                bol_Tipo_JornadaAnterior_Flexible_NOVALIDADOS = true;
                                            }
                                            //TIPO PRESENCIA OBLIGADA @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
                                            else
                                            {
                                                bol_Tipo_JornadaAnterior_Flexible_NOVALIDADOS = false;
                                            }

                                            int_Contador_PARAFICHAJESNOVALIDADOS += 1;
                                        }
                                    }
                                }
                            }



                            if (bol_Salir_Bucle)
                            {
                                break;
                            }
                        }


                        int_Contador += 1;


                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichajes) + "" + nameof(Validacion_Jornada));
            }
        }

        private void Validacion_Jornada_AusenciaObligatoria(long _lng_idEmpleado,
                                                           INTERNO_Verificacion_JornadasCabecera_Modelo _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                           INTERNO_VerificacionFichajes_JornadasLinea_Modelo _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                           DateTime _dtt_Actual,
                                                           bool _bol_JornadaLinea_Inicial,
                                                           DateTime _dtt_JornadaLinea_Inicial,
                                                           DateTime _dtt_JornadaLinea_Final,
                                                           ref List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                           bool _bol_Tipo_JornadaLinea_Anterior_Flexible,
                                                           long _lng_idEmpresa,
                                                           List<INTERNO_VerificacionFichajes_JornadasLinea_Modelo> _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo)
        {
            //DEBERIA TENER UNA SALIDA , SINO ERROR @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            bool bol_ComprobarIncidencia = true;

            List<INTERNO_VerificacionFichajes_JornadaHoraInicialEmpleado_Validada_Modelo> lst_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo = Variables_KairosPRO.G_DCT_JORNADASLINEASHORAINICIALYAVALIDADAS[g_lng_CodigoCliente];
            if (lst_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo != null)
            {
                INTERNO_VerificacionFichajes_JornadaHoraInicialEmpleado_Validada_Modelo mdl_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo_ULTIMOREGISTRO = lst_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo.Where(m => m.IdEmpleado.Equals(_lng_idEmpleado) &&
                                                                                                                                                                                                                                  m.IdEmpresa.Equals(_lng_idEmpresa) &&
                                                                                                                                                                                                                                  m.Fecha.ToString("dd/MM/yyyy").Equals(_dtt_Actual.ToString("dd/MM/yyyy")) &&
                                                                                                                                                                                                                                  m.IdJornadaLinea.Equals(_mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id)).LastOrDefault();

                if (mdl_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo_ULTIMOREGISTRO != null)
                {
                    bol_ComprobarIncidencia = false;
                }
            }

            if (bol_ComprobarIncidencia)
            {
                bool bol_Hayincidencia = false;

                if (_bol_JornadaLinea_Inicial == false)
                {
                    //jornada anterior a la anterior
                    INTERNO_VerificacionFichajes_JornadasLinea_Modelo mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR = null;
                    if (_lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo != null && _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.Count > 0)
                    {
                        int int_Contador = 0;
                        int int_Contador_2 = 0;
                        foreach (INTERNO_VerificacionFichajes_JornadasLinea_Modelo mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo in _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo)
                        {
                            if (int_Contador==2)
                            {
                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR = _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Contador_2-2];
                            }
                            else
                            {
                                int_Contador += 1;
                            }
                           
                            int_Contador_2 += 1;

                            if (_mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id.Equals(mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id))
                            {
                                break;
                            }
                        }
                    }

                    //Buscar el ultimo fichaje antes de ahora
                    INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ANTERIOR = Buscar_UltimoFichaje_AntesHora(_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, _dtt_JornadaLinea_Inicial);

                    //Si el anterior es Flexible y el anterior del anterior es Ausencia el ultimo fichaje tiene que ser una entrada, sino es incorrecto
                    if (_bol_Tipo_JornadaLinea_Anterior_Flexible && 
                        mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR !=null &&
                        mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA) &&
                        (
                            mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ANTERIOR == null ||
                            (
                                mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ANTERIOR!=null &&
                                !mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ANTERIOR.entradaSalida.Equals(Variables_KairosPRO.G_STR_FICHAJE_ENTRADA)
                            )
                        )
                    )
                    {
                        bol_Hayincidencia = true;
                    }
                    //Si la jornadalinea anterior fue de tipo Flexible y esta a nulo es un error
                    else if (mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ANTERIOR == null && 
                             _bol_Tipo_JornadaLinea_Anterior_Flexible)
                    {
                        bol_Hayincidencia = true;
                    }
                }

                if (bol_Hayincidencia)
                {
                    Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_NOHAYFICHAJE,
                                                                g_lng_CodigoCliente,
                                                                _lng_idEmpleado,
                                                                null,
                                                                _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                _dtt_Actual,
                                                                Variables_KairosPRO.G_STR_FICHAJE_SALIDA,
                                                                _lng_idEmpresa,
                                                                _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                }


                Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_JornadaLineaHoraInicialYaValidadas(g_lng_CodigoCliente,
                                                                                                             _lng_idEmpleado,
                                                                                                             _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id,
                                                                                                             _dtt_Actual,
                                                                                                             g_bol_Grabar_Diccionarios_XML,
                                                                                                             _lng_idEmpresa);
            }
            //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

            //REVISAR LOS FICHAJE QUE HAY CONTENIDOS EN ESTA JORNADALINEA ###################################################################
            if (_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo != null && 
                _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Count > 0)
            {
                bool bol_HoraInicio = false;
                bool bol_HoraFin = false;
                //Se hace un bucle , por si se salta de dia, que el order de las fechas sea el correcto
                foreach (INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo in _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => (g_bol_Grabar_Diccionarios_XML ? m.validado == null : (m.validado != null && m.validado.Value == -1))).OrderBy(m => m.fechaHora))
                {
                    //VALIDAR HORA INICIO y FIN ....................................................
                    bol_HoraInicio = Validar_Hora_Inicio(_dtt_JornadaLinea_Inicial,  _dtt_Actual, mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora );
                    bol_HoraFin = Validar_Hora_Fin(_dtt_JornadaLinea_Final, _dtt_Actual, mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora, _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada);

                    if (bol_HoraInicio)
                    {
                        if (bol_HoraFin)
                        {
                            //Si la fecha de fichaje es diferente a la fecha de jornadaInicio se graba la incidencia
                            if (!mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora.Equals(_dtt_JornadaLinea_Inicial))
                            {
                                Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_FUERAJORNADA,
                                                                       g_lng_CodigoCliente,
                                                                       _lng_idEmpleado,
                                                                       mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id,
                                                                       _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                       _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                       _dtt_Actual,
                                                                       mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.entradaSalida,
                                                                       _lng_idEmpresa,
                                                                       _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                       _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);

                                //Fichaje Validado .......................................................................................................................
                                g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 1,g_lng_CodigoCliente);
                                mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 1;
                                //........................................................................................................................................
                            }
                            else
                            {

                                //Si es una entrada en vez de una salida es un Error
                                if (mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.entradaSalida.Equals(Variables_KairosPRO.G_STR_FICHAJE_ENTRADA))
                                {
                                    Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_TIPOINCORRECTO_ENTRADASALIDA,
                                                                                   g_lng_CodigoCliente,
                                                                                   _lng_idEmpleado,
                                                                                   mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id,
                                                                                   _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                                   _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                                   _dtt_Actual,
                                                                                   Variables_KairosPRO.G_STR_FICHAJE_ENTRADA,
                                                                                   _lng_idEmpresa,
                                                                                   _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                                   _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);

                                    g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 1, g_lng_CodigoCliente);
                                    mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 1;

                                }
                                else
                                {
                                    g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 0, g_lng_CodigoCliente);
                                    mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 0;
                                }
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }

            //Verificar si el ultimo rgistro no es una salida esta incorrecto
            if (bol_ComprobarIncidencia)
            {
                INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMAVERIFICACION = Buscar_UltimoFichaje_AntesHora(_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, _dtt_JornadaLinea_Inicial);

                if (
                     (
                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMAVERIFICACION == null &&
                        _bol_JornadaLinea_Inicial == false &&
                        _bol_Tipo_JornadaLinea_Anterior_Flexible == false
                     ) 
                     ||
                     (  mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMAVERIFICACION != null &&
                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMAVERIFICACION.entradaSalida.Equals(Variables_KairosPRO.G_STR_FICHAJE_ENTRADA)
                     )
                    )
                {
                    Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_NOHAYFICHAJE,
                                                                    g_lng_CodigoCliente,
                                                                    _lng_idEmpleado,
                                                                    null,
                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                    _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                    _dtt_Actual,
                                                                    Variables_KairosPRO.G_STR_FICHAJE_SALIDA,
                                                                    _lng_idEmpresa,
                                                                    _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                    _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                }
            }
        }
        private void Validacion_Jornada_Flexible(long _lng_idEmpleado,
                                                 INTERNO_Verificacion_JornadasCabecera_Modelo _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                 INTERNO_VerificacionFichajes_JornadasLinea_Modelo _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                 DateTime _dtt_Actual,
                                                 List<INTERNO_VerificacionFichajes_JornadasLinea_Modelo> _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                 int _int_Contador,
                                                 DateTime _dtt_JornadaLinea_Inicial,
                                                 DateTime _dtt_JornadaLinea_Final,
                                                 ref List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                 long _lng_idEmpresa)
        {
            //Hay algun Fichaje
            if (_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo != null && _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Count > 0)
            {
                //Ver el tipo de flexibilidad que es para saber que deberia esperar entrada o salida .......................
                //Entrada -> 1
                //Salida  -> 2
                string str_TipoFichajeEsperado_ES = Variables_KairosPRO.G_STR_FICHAJE_ENTRADA;
                if (_lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[_int_Contador].tipo == Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA)
                {
                    str_TipoFichajeEsperado_ES = Variables_KairosPRO.G_STR_FICHAJE_SALIDA;
                }
                //............................................................................................................

                List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_FLEXIBLE = _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => (g_bol_Grabar_Diccionarios_XML ? m.validado == null : (m.validado != null && m.validado.Value == -1))).OrderBy(m => m.fechaHora).ToList();

                if (lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_FLEXIBLE != null && lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_FLEXIBLE.Count > 0)
                {
                    INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMOFICHAJE_ANTESHORA = null;

                    bool bol_HoraInicio = false;
                    bool bol_HoraFin = false;

                    //Se hace un bucle , por si se salta de dia, que el order de las fechas sea el correcto
                    foreach (INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo in lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_FLEXIBLE)
                    {
                        //VALIDAR HORA INICIO y FIN ....................................................
                        bol_HoraInicio = Validar_Hora_Inicio(_dtt_JornadaLinea_Inicial,  _dtt_Actual, mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora);
                        bol_HoraFin = Validar_Hora_Fin(_dtt_JornadaLinea_Final, _dtt_Actual, mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora, _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada);

                        if (bol_HoraInicio)
                        {
                            if (bol_HoraFin)
                            {
                                mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMOFICHAJE_ANTESHORA = Buscar_UltimoFichaje_AntesHora(_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora);

                                //No hay nada antes del fichaje
                                if (mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMOFICHAJE_ANTESHORA == null)
                                {
                                    //Espera un entrada y el fichaje es una entrada, esta correcto
                                    if (str_TipoFichajeEsperado_ES == Variables_KairosPRO.G_STR_FICHAJE_ENTRADA &&
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.entradaSalida == Variables_KairosPRO.G_STR_FICHAJE_ENTRADA)
                                    {
                                        //Fichaje Validado .......................................................................................................................
                                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 0, g_lng_CodigoCliente);
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 0;
                                        //........................................................................................................................................
                                    }
                                    //Espera un salida y el fichaje es una salida, esta correcto
                                    else if (str_TipoFichajeEsperado_ES == Variables_KairosPRO.G_STR_FICHAJE_SALIDA &&
                                            mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.entradaSalida == Variables_KairosPRO.G_STR_FICHAJE_SALIDA)
                                    {
                                        //Fichaje Validado .......................................................................................................................
                                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 0, g_lng_CodigoCliente);
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 0;
                                        //........................................................................................................................................
                                    }
                                    else
                                    {
                                        //Fichaje Validado .......................................................................................................................
                                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 1, g_lng_CodigoCliente);
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 1;
                                        //........................................................................................................................................

                                        Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_TIPOINCORRECTO_ENTRADASALIDA,
                                                                                    g_lng_CodigoCliente,
                                                                                    _lng_idEmpleado,
                                                                                    mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id,
                                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                                    _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                                    _dtt_Actual,
                                                                                    str_TipoFichajeEsperado_ES,
                                                                                    _lng_idEmpresa,
                                                                                    _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                                    _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                                    }
                                }
                                //Hay algo antes del fichaje
                                else
                                {
                                    //Espera un entrada y el fichaje es una entrada y lo ultimo que hay es una salida, esta correcto
                                    if (str_TipoFichajeEsperado_ES == Variables_KairosPRO.G_STR_FICHAJE_ENTRADA &&
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.entradaSalida == Variables_KairosPRO.G_STR_FICHAJE_ENTRADA &&
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMOFICHAJE_ANTESHORA.entradaSalida.Equals(Variables_KairosPRO.G_STR_FICHAJE_SALIDA))
                                    {
                                        //Fichaje Validado .......................................................................................................................
                                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 0, g_lng_CodigoCliente);
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 0;
                                        //........................................................................................................................................
                                    }
                                    //Espera un salida y el fichaje es una salida y lo ultimo que hay es una entrada, esta correcto
                                    else if (str_TipoFichajeEsperado_ES == Variables_KairosPRO.G_STR_FICHAJE_SALIDA &&
                                            mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.entradaSalida == Variables_KairosPRO.G_STR_FICHAJE_SALIDA &&
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMOFICHAJE_ANTESHORA.entradaSalida.Equals(Variables_KairosPRO.G_STR_FICHAJE_ENTRADA))
                                    {
                                        //Fichaje Validado .......................................................................................................................
                                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 0, g_lng_CodigoCliente);
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 0;
                                        //........................................................................................................................................
                                    }
                                    else
                                    {
                                        //Fichaje Validado .......................................................................................................................
                                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 1, g_lng_CodigoCliente);
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 1;
                                        //........................................................................................................................................

                                        Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_TIPOINCORRECTO_ENTRADASALIDA,
                                                                                    g_lng_CodigoCliente,
                                                                                    _lng_idEmpleado,
                                                                                    mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id,
                                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                                    _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                                    _dtt_Actual,
                                                                                    str_TipoFichajeEsperado_ES,
                                                                                    _lng_idEmpresa,
                                                                                    _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                                    _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                                    }
                                }
                            }
                            else
                            {
                                break;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
        }
        private void Validacion_Jornada_PresenciaObligatoria(
                                                 long _lng_idEmpleado,
                                                 INTERNO_Verificacion_JornadasCabecera_Modelo _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo,
                                                 INTERNO_VerificacionFichajes_JornadasLinea_Modelo _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                 DateTime _dtt_Actual,
                                                 bool _bol_JornadaLinea_Inicial,
                                                 DateTime _dtt_JornadaLinea_Inicial,
                                                 DateTime _dtt_JornadaLinea_Fin,
                                                 ref List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                 bool _bol_Tipo_JornadaLinea_Anterior_Flexible,
                                                 long _lng_idEmpresa,
                                                 List<INTERNO_VerificacionFichajes_JornadasLinea_Modelo> _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo)
        {

            //DEBERIA TENER UNA ENTRADA , SINO ERROR @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
            bool bol_ComprobarIncidencia = true;

            List<INTERNO_VerificacionFichajes_JornadaHoraInicialEmpleado_Validada_Modelo> lst_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo = Variables_KairosPRO.G_DCT_JORNADASLINEASHORAINICIALYAVALIDADAS[g_lng_CodigoCliente];
            if (lst_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo != null)
            {
                INTERNO_VerificacionFichajes_JornadaHoraInicialEmpleado_Validada_Modelo mdl_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo_ULTIMOREGISTRO = lst_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo.Where(m =>   m.IdEmpleado.Equals(_lng_idEmpleado) &&
                                                                                                                                                                                                                                    m.IdEmpresa.Equals(_lng_idEmpresa) &&
                                                                                                                                                                                                                                    m.Fecha.ToString("dd/MM/yyyy").Equals(_dtt_Actual.ToString("dd/MM/yyyy")) &&
                                                                                                                                                                                                                                    m.IdJornadaLinea.Equals(_mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id)).LastOrDefault();

                if (mdl_INTERNO_JornadaHoraInicialEmpleado_Validada_Modelo_ULTIMOREGISTRO != null)
                {
                    bol_ComprobarIncidencia = false;
                }
            }

            if (bol_ComprobarIncidencia)
            {
                bool bol_Hayincidencia = false;

                INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo = Buscar_UltimoFichaje_AntesHora(_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, _dtt_JornadaLinea_Inicial);

                //Si la jornadalinea anterior fue de tipo Flexible y esta a nulo es un error
                if (mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo == null &&
                    _bol_Tipo_JornadaLinea_Anterior_Flexible)
                {
                    bol_Hayincidencia = true;
                }

                if (bol_Hayincidencia)
                {
                    Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_NOHAYFICHAJE,
                                                                g_lng_CodigoCliente,
                                                                _lng_idEmpleado,
                                                                null,
                                                                _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                _dtt_Actual,
                                                                Variables_KairosPRO.G_STR_FICHAJE_ENTRADA,
                                                                _lng_idEmpresa,
                                                                _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                }


                Verificacion_Fichajes_Diccionarios.Actualizar_Diccionario_JornadaLineaHoraInicialYaValidadas(g_lng_CodigoCliente,
                                                                                                    _lng_idEmpleado,
                                                                                                    _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id,
                                                                                                    _dtt_Actual,
                                                                                                    g_bol_Grabar_Diccionarios_XML,
                                                                                                    _lng_idEmpresa);
            }
            //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

            //Hay algun Fichaje
            if (_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo != null && 
                _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Count > 0)
            {
                List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_PRESENCIAOBLIGATORIA = _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => (g_bol_Grabar_Diccionarios_XML ? m.validado == null : (m.validado != null && m.validado.Value == -1))).OrderBy(m => m.fechaHora).ToList();

                if (lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_PRESENCIAOBLIGATORIA != null && 
                    lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_PRESENCIAOBLIGATORIA.Count > 0)
                {
                    bool bol_HoraInicio = false;
                    bool bol_HoraFin = false;

                    //Se hace un bucle , por si se salta de dia, que el order de las fechas sea el correcto
                    foreach (INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo in lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_PRESENCIAOBLIGATORIA)
                    {
                        //VALIDAR HORA INICIO y FIN ....................................................
                        bol_HoraInicio = Validar_Hora_Inicio(_dtt_JornadaLinea_Inicial,  _dtt_Actual, mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora );
                        bol_HoraFin = Validar_Hora_Fin(_dtt_JornadaLinea_Fin, _dtt_Actual, mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora, _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada);

                        if (bol_HoraInicio)
                        {
                            if (bol_HoraFin)
                            {
                                //Si la fecha de fichaje es diferente a la fecha de jornadaInicio se graba la incidencia
                                if (!mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora.Equals(_dtt_JornadaLinea_Inicial))
                                {
                                    Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_FUERAJORNADA,
                                                                                    g_lng_CodigoCliente,
                                                                                    _lng_idEmpleado,
                                                                                    mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id,
                                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                                    _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                                    _dtt_Actual,
                                                                                    Variables_KairosPRO.G_STR_FICHAJE_ENTRADA,
                                                                                    _lng_idEmpresa,
                                                                                    _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                                    _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);

                                    g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 1, g_lng_CodigoCliente);
                                    mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 1;
                                }
                                else
                                {
                                    //Si es una salida en vez de una entrada es un Error
                                    if (mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.entradaSalida.Equals(Variables_KairosPRO.G_STR_FICHAJE_SALIDA))
                                    {
                                        Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_TIPOINCORRECTO_ENTRADASALIDA,
                                                                                       g_lng_CodigoCliente,
                                                                                       _lng_idEmpleado,
                                                                                       mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id,
                                                                                       _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                                       _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                                       _dtt_Actual,
                                                                                       Variables_KairosPRO.G_STR_FICHAJE_SALIDA,
                                                                                       _lng_idEmpresa,
                                                                                       _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                                       _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);

                                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 1, g_lng_CodigoCliente);
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 1;

                                    }
                                    else
                                    {
                                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 0, g_lng_CodigoCliente);
                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 0;
                                    }
                                }                             
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                }
            }

            //Si es una entrada el ultimo registro o esta a nulo, falta la salida, es una incidencia
            if (bol_ComprobarIncidencia)
            {
                INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMAVERIFICACION = Buscar_UltimoFichaje_AntesHora(_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, _dtt_JornadaLinea_Inicial);


                if (
                     (
                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMAVERIFICACION == null &&
                        _bol_Tipo_JornadaLinea_Anterior_Flexible==false
                     )
                     ||
                     (mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMAVERIFICACION != null &&
                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_ULTIMAVERIFICACION.entradaSalida.Equals(Variables_KairosPRO.G_STR_FICHAJE_SALIDA)
                     )
                    )
                {
                    Grabar_ParaEmail_FichajeIncidencia_Jornada(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_NOHAYFICHAJE,
                                                                    g_lng_CodigoCliente,
                                                                    _lng_idEmpleado,
                                                                    null,
                                                                    _mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.id,
                                                                    _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                    _dtt_Actual,
                                                                    Variables_KairosPRO.G_STR_FICHAJE_ENTRADA,
                                                                    _lng_idEmpresa,
                                                                    _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                    _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                }
            }
        }


        private void Validacion_AusenciasProgramadas(long _lng_idEmpleado,
                                                     DateTime _dtt_Actual,
                                                     KRS_AusenciasProgramadas _mdl_KRS_AusenciasProgramadas,
                                                     long _lng_idEmpresa)
        {
            try
            {
                //Dia de fichaje
                DateTime dtt_FechaDesde_BusquedaFichaje = new DateTime(_dtt_Actual.Year, _dtt_Actual.Month, _dtt_Actual.Day, 0, 0, 0);
                DateTime dtt_FechaHasta_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddHours(24);

                //Obtener todos los Fichajes del Dia
                List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo = g_obj_KRSS_Fichajes_Datos.Obtener_Listado_ParaVerificacionFichajes(g_lng_CodigoCliente, _lng_idEmpleado, dtt_FechaDesde_BusquedaFichaje, dtt_FechaHasta_BusquedaFichaje, _lng_idEmpresa);

                if (lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo != null && lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Count > 0)
                {
                    if (g_bol_Grabar_Diccionarios_XML == false)
                    {
                        lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => m.validado != null).ToList().ForEach(m => m.validado = -1);
                    }

                    //Se hace un bucle , por si se salta de dia, que el order de las fechas sea el correcto
                    foreach (INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo in lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => (g_bol_Grabar_Diccionarios_XML ? m.validado == null : (m.validado != null && m.validado.Value == -1))).OrderBy(m => m.fechaHora).ToList())
                    {
                        Grabar_ParaEmail_FichajeIncidencia_AusenciasProgramadasDiasFestivos(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_HAYFICHAJENODEBERIA_AUSENCIAPROGRAMA,
                                                                                            g_lng_CodigoCliente,
                                                                                            _lng_idEmpleado,
                                                                                            mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id,
                                                                                            _dtt_Actual,
                                                                                            _mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.descripcion);

                        //Fichaje Validado .......................................................................................................................
                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 1,g_lng_CodigoCliente);
                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 1;
                        //........................................................................................................................................

                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichajes) + "" + nameof(Validacion_AusenciasProgramadas));
            }
        }


        private void Validacion_DiasFestivos(long _lng_idEmpleado,
                                             DateTime _dtt_Actual,
                                             KRS_DiasFestivos _mdl_KRS_DiasFestivos,
                                             long _lng_idEmpresa)
        {
            try
            {
                //Dia de fichaje
                DateTime dtt_FechaDesde_BusquedaFichaje = new DateTime(_dtt_Actual.Year, _dtt_Actual.Month, _dtt_Actual.Day, 0, 0, 0);
                DateTime dtt_FechaHasta_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddHours(24);

                //Obtener todos los Fichajes del Dia
                List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo = g_obj_KRSS_Fichajes_Datos.Obtener_Listado_ParaVerificacionFichajes(g_lng_CodigoCliente, _lng_idEmpleado, dtt_FechaDesde_BusquedaFichaje, dtt_FechaHasta_BusquedaFichaje, _lng_idEmpresa);

                if (lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo != null && lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Count > 0)
                {
                    if (g_bol_Grabar_Diccionarios_XML == false)
                    {
                        lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => m.validado != null).ToList().ForEach(m => m.validado = -1);
                    }

                    //Se hace un bucle , por si se salta de dia, que el order de las fechas sea el correcto
                    foreach (INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo in lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => (g_bol_Grabar_Diccionarios_XML ? m.validado == null : (m.validado != null && m.validado.Value == -1))).OrderBy(m => m.fechaHora).ToList())
                    {
                        Grabar_ParaEmail_FichajeIncidencia_AusenciasProgramadasDiasFestivos(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_HAYFICHAJENODEBERIA_DIAFESTIVO,
                                                                                           g_lng_CodigoCliente,
                                                                                           _lng_idEmpleado,
                                                                                           mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id,
                                                                                           _dtt_Actual,
                                                                                          _mdl_KRS_DiasFestivos.descripcion);


                        //Fichaje Validado .......................................................................................................................
                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 1, g_lng_CodigoCliente);
                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 1;
                        //........................................................................................................................................

                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichajes) + "" + nameof(Validacion_AusenciasProgramadas));
            }
        }



        private void Validacion_Fichajes_SinNadaAsignado(long _lng_idEmpleado,
                                                          DateTime _dtt_Actual,
                                                          long _lng_idEmpresa)
        {
            try
            {
                //Dia de fichaje
                DateTime dtt_FechaDesde_BusquedaFichaje = new DateTime(_dtt_Actual.Year, _dtt_Actual.Month, _dtt_Actual.Day, 0, 0, 0);
                DateTime dtt_FechaHasta_BusquedaFichaje = dtt_FechaDesde_BusquedaFichaje.AddHours(24);

                //Obtener todos los Fichajes del Dia
                List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo = g_obj_KRSS_Fichajes_Datos.Obtener_Listado_ParaVerificacionFichajes(g_lng_CodigoCliente, _lng_idEmpleado, dtt_FechaDesde_BusquedaFichaje, dtt_FechaHasta_BusquedaFichaje, _lng_idEmpresa);

                if (lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo != null && lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Count > 0)
                {
                    //Se hace un bucle , por si se salta de dia, que el order de las fechas sea el correcto
                    foreach (INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo in lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => (g_bol_Grabar_Diccionarios_XML ? m.validado == null : (m.validado != null && m.validado.Value == -1))).OrderBy(m => m.fechaHora).ToList())
                    {
                        Grabar_ParaEmail_FichajeIncidencia_SinNadaAsignado(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_FUERAJORNADA,
                                                                            g_lng_CodigoCliente,
                                                                            _lng_idEmpleado,
                                                                            mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id,
                                                                            _dtt_Actual);

                        //Fichaje Validado .......................................................................................................................
                        g_obj_KRSS_Fichajes_Datos.Actualizar_ParaVerificacionFichajes(mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.id, 1, g_lng_CodigoCliente);
                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.validado = 1;
                        //........................................................................................................................................

                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichajes) + "" + nameof(Validacion_Fichajes_SinNadaAsignado));
            }
        }



        #region Grabar para Enviar por Email mas tarde
        private void Grabar_ParaEmail_FichajeIncidencia_Jornada(int _int_TipoIncidencia,
                                                                long _lng_CodigoCliente,
                                                                long _lng_idEmpleado,
                                                                long? _lng_idFichaje,
                                                                long? _lng_idJornadaCabecera,
                                                                INTERNO_VerificacionFichajes_JornadasLinea_Modelo _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo,
                                                                DateTime _dtt_Fecha,
                                                                string _str_EntradaSalida,
                                                                long _lng_idEmpresa,
                                                                List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo,
                                                                List<INTERNO_VerificacionFichajes_JornadasLinea_Modelo> _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo)
        {
            try
            {
               
                if (g_bol_Grabar_Diccionarios_XML)
                {
                    TMP_Emails_FichajesIncidencias mdl_TMP_Emails_FichajesIncidencias = new TMP_Emails_FichajesIncidencias();
                    TMP_Emails_RecordatorioFichajes mdl_TMP_Emails_RecordatorioFichajes = new TMP_Emails_RecordatorioFichajes();
                   
                    bool bol_NoHayFichaje = false;

                    //Descripcion de la Incicendia ........................................................................................................
                    //Fuera Jornada
                    if (_int_TipoIncidencia.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_FUERAJORNADA))
                    {
                        mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion = Variables_KairosPRO.G_STR_TIPOINCIDENCIA_FICHAJE_MENSAJE_EMAIL_FUERAJORNADA;
                    }
                    //No hay Fichaje
                    else if (_int_TipoIncidencia.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_NOHAYFICHAJE))
                    {
                        mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion = Variables_KairosPRO.G_STR_TIPOINCIDENCIA_FICHAJE_MENSAJE_EMAIL_NOHAYFICHAJE;
                        bol_NoHayFichaje = true;
                    }
                    //TipoIncorrcto ES
                    else if (_int_TipoIncidencia.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_TIPOINCORRECTO_ENTRADASALIDA))
                    {
                        mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion = Variables_KairosPRO.G_STR_TIPOINCIDENCIA_FICHAJE_MENSAJE_EMAIL_SALIDAENTRADA;
                        if (mdl_TMP_Emails_FichajesIncidencias.entradaSalida == "S")
                        {
                            mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion = Variables_KairosPRO.G_STR_TIPOINCIDENCIA_FICHAJE_MENSAJE_EMAIL_ENTRADASALIDA;
                        }
                    }
                    //.......................................................................................................................................
            
                    if (_mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo != null)
                    {
                   
                        //Si es de tipo No hay fichaje y deberia
                        if (bol_NoHayFichaje)
                        {
                            //Si tiene Activa la parte de fichaje automatico hacemos el fichaje correctamente
                            if (g_mdl_KRS_Empleados.permiteFichajeAutomatico != null &&
                                g_mdl_KRS_Empleados.permiteFichajeAutomatico.Value &&
                                g_mdl_KRS_Empleados.idEmpresa_FichajeAutomatico != null &&
                                _lng_idEmpresa == g_mdl_KRS_Empleados.idEmpresa_FichajeAutomatico.Value)
                            {
                         
                                //Dispositivo modelo #############
                                long lng_idDispositivoModelo = -1;
                                KRSS_DispositivosModelo mdl_KRSS_DispositivosModelo = g_obj_KRSS_DispositivosModelo_Datos.Obtener_Modelo_Por_MAC(Variables_KairosPRO.G_STR_DISPOSITIVOMODELO_AUTOMATICO, _lng_CodigoCliente);
                             
                                //Si existe le asigno el id a la variable para crear al fichaje
                                if (mdl_KRSS_DispositivosModelo != null)
                                {
                                    lng_idDispositivoModelo = mdl_KRSS_DispositivosModelo.id;
                                }
                                //Si no creo el dispositivo y asigno el id
                                else
                                {
                                 
                                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
                                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

                                    mdl_KRSS_DispositivosModelo = new KRSS_DispositivosModelo();

                                    mdl_KRSS_DispositivosModelo.id = -1;
                                    mdl_KRSS_DispositivosModelo.codigoCliente = _lng_CodigoCliente;
                                    mdl_KRSS_DispositivosModelo.fabricante = Variables_KairosPRO.G_STR_DISPOSITIVOMODELO_DISPOSITIVO + " " + Variables_KairosPRO.G_STR_DISPOSITIVOMODELO_AUTOMATICO;
                                    mdl_KRSS_DispositivosModelo.marca = Variables_KairosPRO.G_STR_DISPOSITIVOMODELO_DISPOSITIVO + " " + Variables_KairosPRO.G_STR_DISPOSITIVOMODELO_AUTOMATICO;
                                    mdl_KRSS_DispositivosModelo.modelo = Variables_KairosPRO.G_STR_DISPOSITIVOMODELO_DISPOSITIVO + " " + Variables_KairosPRO.G_STR_DISPOSITIVOMODELO_AUTOMATICO;
                                    mdl_KRSS_DispositivosModelo.mac = Variables_KairosPRO.G_STR_DISPOSITIVOMODELO_AUTOMATICO;

                                    //Grabamos el DispositivoModelo
                                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_KRSS_DispositivosModelo_Datos.Insertar(mdl_KRSS_DispositivosModelo);

                                    //Si fue todo correcto asigno el id a la variable
                                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                                    {
                                        lng_idDispositivoModelo = mdl_INTERNO_ValorDevuelto_Modelo.Id;
                                    }
                                   
                                }
                                // ###############################
                               
                                //Si el idDispositivoModelo es mayor que -1 creamos el fichaje
                                if (lng_idDispositivoModelo > -1)
                                {
                                 
                                    //Relleno las varibles con la hora y los minutos
                                    int int_Hora = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora.Hours;
                                    int int_Minutos = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora.Minutes;

                                    //Si el listado de JornadasLinea no es nulo
                                    if (_lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo != null &&
                                        _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.Count() > 0)
                                    {
                                      
                                        Random obj_Random = new Random();

                                        int int_Posicion_JornadaLinea = _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.IndexOf(_mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);

                                        //Miro a ver si tiene algo antes
                                        INTERNO_VerificacionFichajes_JornadasLinea_Modelo mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR = null;
                                        if (int_Posicion_JornadaLinea>0)
                                        {
                                            mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR = _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo[int_Posicion_JornadaLinea - 1];
                                        }
                                     
                                        //Si es una Salida y no tengo un Entrada, grabo una entrada primero
                                        INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo = null;
                                        if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR != null)
                                        {
                                            mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo = Buscar_UltimoFichaje_AntesHora(_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, _dtt_Fecha);
                                        }
  
                                        //Si la jornadalinea anterior fue de tipo Flexible y esta a nulo es un error
                                        if (_str_EntradaSalida == Variables_KairosPRO.G_STR_FICHAJE_SALIDA &&
                                                (
                                                    mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo == null ||
                                                    (
                                                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.entradaSalida!=null &&
                                                        !mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.entradaSalida.Equals(Variables_KairosPRO.G_STR_FICHAJE_ENTRADA)
                                                    )
                                                )
                                            )
                                        {
                                            
                                            #region Grabo un entrada
                                            //Saco un random entre el 0 y el 3
                                            int int_NumeroRandom_Minuto_AUX = obj_Random.Next(0, 3);
                                           
                                            TimeSpan tmp_HoraGenerada_AUX = new TimeSpan(0, int_NumeroRandom_Minuto_AUX, 0);
                                            
                                            TimeSpan tmp_HoraFinal_AUX = new TimeSpan();
                                            
                                            //Si el numero random que genero es mayor que el random que genero en el if resto los minutos
                                            if (int_NumeroRandom_Minuto_AUX > obj_Random.Next(0, 3))
                                            {
                                                tmp_HoraFinal_AUX = mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR.hora - tmp_HoraGenerada_AUX;
                                            }
                                            //sino sumo los minutos
                                            else
                                            {
                                                tmp_HoraFinal_AUX = mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR.hora + tmp_HoraGenerada_AUX;
                                            }

                                            int int_Hora_AUX = tmp_HoraFinal_AUX.Hours;
                                            int int_Minutos_AUX = tmp_HoraFinal_AUX.Minutes;
                                            

                                            KRSS_Fichajes mdl_KRSS_Fichajes_AUX = new KRSS_Fichajes();
                                            mdl_KRSS_Fichajes_AUX.id = -1;
                                            mdl_KRSS_Fichajes_AUX.idEmpleado = _lng_idEmpleado;
                                            mdl_KRSS_Fichajes_AUX.codigoCliente = _lng_CodigoCliente;
                                            mdl_KRSS_Fichajes_AUX.fechaHora = new DateTime(_dtt_Fecha.Year, _dtt_Fecha.Month, _dtt_Fecha.Day, int_Hora_AUX, int_Minutos_AUX, 0);
                                            mdl_KRSS_Fichajes_AUX.gps_Posicion_Latitud = "";
                                            mdl_KRSS_Fichajes_AUX.gps_Posicion_Longitud = "";
                                            mdl_KRSS_Fichajes_AUX.gps_Proveedor = "";
                                            mdl_KRSS_Fichajes_AUX.idDispositivoModelo = lng_idDispositivoModelo;
                                            mdl_KRSS_Fichajes_AUX.entradaSalida = Variables_KairosPRO.G_STR_FICHAJE_ENTRADA;
                                            mdl_KRSS_Fichajes_AUX.idEmpresa = _lng_idEmpresa;
                                            mdl_KRSS_Fichajes_AUX.validado = 0;

                                            //Grabamos un registro en la tabla de KRSS_Fichajes
                                            g_obj_KRSS_Fichajes_Datos.Insertar(mdl_KRSS_Fichajes_AUX);
                                            #endregion
                                           
                                            //Hora y minutos para la salida
                                            //Saco un random entre el 0 y el 3
                                            int int_NumeroRandom_Minuto = obj_Random.Next(0, 3);
                                            TimeSpan tmp_HoraGenerada = new TimeSpan(0, int_NumeroRandom_Minuto, 0);
                                            TimeSpan tmp_HoraFinal = new TimeSpan();
                                           
                                            //Si el numero random que genero es mayor que el random que genero en el if resto los minutos
                                            if (int_NumeroRandom_Minuto > obj_Random.Next(0, 3))
                                            {
                                                tmp_HoraFinal = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora - tmp_HoraGenerada;
                                            }
                                            //sino sumo los minutos
                                            else
                                            {
                                                tmp_HoraFinal = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora + tmp_HoraGenerada;
                                            }
                                           
                                            int_Hora = tmp_HoraFinal.Hours;
                                            int_Minutos = tmp_HoraFinal.Minutes;
                                            
                                        }
                                        else
                                        {
                                            
                                            //Si tiene anterior y tiene Flexible calculamos una hora random dentro del rango
                                            if (mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR != null &&
                                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR.tipo.Equals(Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_FLEXIBLE))
                                            {
                                                TimeSpan tmp_HorasEntreJornadas = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora - mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo_ANTERIOR.hora;
                                                int int_NumeroRandom_Hora = 0;
                                                int int_NumeroRandom_Minuto = 0;
                                                
                                                //Hora
                                                if (tmp_HorasEntreJornadas.Hours > 0)
                                                {
                                                    int_NumeroRandom_Hora = obj_Random.Next(0, tmp_HorasEntreJornadas.Hours);
                                                }

                                                //Minuto
                                                if (tmp_HorasEntreJornadas.Minutes > 0)
                                                {
                                                    int_NumeroRandom_Minuto = obj_Random.Next(0, tmp_HorasEntreJornadas.Minutes);
                                                }

                                                TimeSpan tmp_HoraGenerada = new TimeSpan(int_NumeroRandom_Hora, int_NumeroRandom_Minuto, 0);

                                                TimeSpan tmp_HoraFinal = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora - tmp_HoraGenerada;

                                                int_Hora = tmp_HoraFinal.Hours;

                                                int_Minutos = tmp_HoraFinal.Minutes;
                                            }
                                            //Sino tiene flexible  hacemos que el fichaje se haga un rando de 
                                            //3minutos por delante o 3 por dentras
                                            else
                                            {
                                               
                                                //Saco un random entre el 0 y el 3
                                                int int_NumeroRandom_Minuto = obj_Random.Next(0, 3);

                                                TimeSpan tmp_HoraGenerada = new TimeSpan(0, int_NumeroRandom_Minuto, 0);

                                                TimeSpan tmp_HoraFinal = new TimeSpan();

                                                //Si el numero random que genero es mayor que el random que genero en el if resto los minutos
                                                if (int_NumeroRandom_Minuto > obj_Random.Next(0, 3))
                                                {
                                                    tmp_HoraFinal = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora - tmp_HoraGenerada;
                                                }
                                                //sino sumo los minutos
                                                else
                                                {
                                                    tmp_HoraFinal = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora + tmp_HoraGenerada;
                                                }

                                                int_Hora = tmp_HoraFinal.Hours;

                                                int_Minutos = tmp_HoraFinal.Minutes;
                                               
                                            }
                                        }
                                    }
                                    
                                    KRSS_Fichajes mdl_KRSS_Fichajes = new KRSS_Fichajes();
                                    mdl_KRSS_Fichajes.id = -1;
                                    mdl_KRSS_Fichajes.idEmpleado = _lng_idEmpleado;
                                    mdl_KRSS_Fichajes.codigoCliente = _lng_CodigoCliente;
                                    mdl_KRSS_Fichajes.fechaHora = new DateTime(_dtt_Fecha.Year, _dtt_Fecha.Month, _dtt_Fecha.Day, int_Hora, int_Minutos, 0);
                                    mdl_KRSS_Fichajes.gps_Posicion_Latitud = "";
                                    mdl_KRSS_Fichajes.gps_Posicion_Longitud = "";
                                    mdl_KRSS_Fichajes.gps_Proveedor = "";
                                    mdl_KRSS_Fichajes.idDispositivoModelo = lng_idDispositivoModelo;
                                    mdl_KRSS_Fichajes.entradaSalida = _str_EntradaSalida;
                                    mdl_KRSS_Fichajes.idEmpresa = _lng_idEmpresa;
                                    mdl_KRSS_Fichajes.validado = 0;

                                    //Grabamos un registro en la tabla de KRSS_Fichajes
                                    g_obj_KRSS_Fichajes_Datos.Insertar(mdl_KRSS_Fichajes);
                                    
                                }
                            }
                            //Sino grabamos la incidencia en la tabla de base de datos
                            else
                            {
                                
                                mdl_TMP_Emails_FichajesIncidencias.codigoCliente = _lng_CodigoCliente;
                                mdl_TMP_Emails_FichajesIncidencias.idEmpleado = _lng_idEmpleado;
                                mdl_TMP_Emails_FichajesIncidencias.idFichaje = _lng_idFichaje;
                                mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera = _lng_idJornadaCabecera;
                                mdl_TMP_Emails_FichajesIncidencias.idJornadaLinea = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id;
                                mdl_TMP_Emails_FichajesIncidencias.incidencia_Tipo = _int_TipoIncidencia;
                                mdl_TMP_Emails_FichajesIncidencias.fecha = _dtt_Fecha;
                                mdl_TMP_Emails_FichajesIncidencias.entradaSalida = _str_EntradaSalida;

                                //Grabamos un registro en la table de TMP_Emails_FichajesIncidencias
                                g_obj_TMP_Emails_FichajesIncidencias_Datos.Insertar(mdl_TMP_Emails_FichajesIncidencias);
                               
                                //Recordatorio
                                //Si no hay fichaje y deberia , y el empleado tiene recordatorio grabo un registro en la tabla de TMP_Emails_RecordatorioFichajes
                                if (g_mdl_KRS_Empleados.permiteRecordatorio != null && g_mdl_KRS_Empleados.permiteRecordatorio.Value)
                                {
                                    mdl_TMP_Emails_RecordatorioFichajes.codigoCliente = _lng_CodigoCliente;
                                    mdl_TMP_Emails_RecordatorioFichajes.idEmpleado = _lng_idEmpleado;
                                    mdl_TMP_Emails_RecordatorioFichajes.fecha = _dtt_Fecha;
                                    mdl_TMP_Emails_RecordatorioFichajes.entradaSalida = _str_EntradaSalida;

                                    //Grabamos un registro en la tabla TMP_Emails_RecordatorioFichajes
                                    g_obj_TMP_Emails_RecordatorioFichajes_Datos.Insertar(mdl_TMP_Emails_RecordatorioFichajes);
                                }
                            }
                        }
                        //Si es del resto de tipos
                        else
                        {
         
                            mdl_TMP_Emails_FichajesIncidencias.codigoCliente = _lng_CodigoCliente;
                            mdl_TMP_Emails_FichajesIncidencias.idEmpleado = _lng_idEmpleado;
                            mdl_TMP_Emails_FichajesIncidencias.idFichaje = _lng_idFichaje;
                            mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera = _lng_idJornadaCabecera;
                            mdl_TMP_Emails_FichajesIncidencias.idJornadaLinea = _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id;
                            mdl_TMP_Emails_FichajesIncidencias.incidencia_Tipo = _int_TipoIncidencia;
                            mdl_TMP_Emails_FichajesIncidencias.fecha = _dtt_Fecha;
                            mdl_TMP_Emails_FichajesIncidencias.entradaSalida = _str_EntradaSalida;

                            g_obj_TMP_Emails_FichajesIncidencias_Datos.Insertar(mdl_TMP_Emails_FichajesIncidencias);
                        }
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichajes) + "/" + nameof(Grabar_ParaEmail_FichajeIncidencia_Jornada));
            }
        }

        private void Grabar_ParaEmail_FichajeIncidencia_AusenciasProgramadasDiasFestivos(int _int_TipoIncidencia,
                                                                            long _lng_CodigoCliente,
                                                                            long _lng_idEmpleado,
                                                                            long? _lng_idFichaje,
                                                                            DateTime _dtt_Fecha,
                                                                            string _str_DescripcionIncidencia)
        {
            try
            {

                if (g_bol_Grabar_Diccionarios_XML)
                {
                    TMP_Emails_FichajesIncidencias mdl_TMP_Emails_FichajesIncidencias = new TMP_Emails_FichajesIncidencias();

                    //Descripcion de la incidencia
                    if (_int_TipoIncidencia.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_HAYFICHAJENODEBERIA_AUSENCIAPROGRAMA))
                    {
                        mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion = Variables_KairosPRO.G_STR_TIPOINCIDENCIA_FICHAJE_MENSAJE_EMAIL_HAYFICHAJENODEBERIA_AUSENCIAPROGRAMA + _str_DescripcionIncidencia;
                    }
                    else if (_int_TipoIncidencia.Equals(Variables_KairosPRO.G_INT_TIPOINCIDENCIA_FICHAJE_HAYFICHAJENODEBERIA_DIAFESTIVO))
                    {
                        mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion = Variables_KairosPRO.G_STR_TIPOINCIDENCIA_FICHAJE_MENSAJE_EMAIL_HAYFICHAJENODEBERIA_DIAFESTIVO + _str_DescripcionIncidencia;
                    }


                    mdl_TMP_Emails_FichajesIncidencias.codigoCliente = _lng_CodigoCliente;
                    mdl_TMP_Emails_FichajesIncidencias.idEmpleado = _lng_idEmpleado;
                    mdl_TMP_Emails_FichajesIncidencias.idFichaje = _lng_idFichaje;
                    mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera = null;
                    mdl_TMP_Emails_FichajesIncidencias.idJornadaLinea = null;
                    mdl_TMP_Emails_FichajesIncidencias.incidencia_Tipo = _int_TipoIncidencia;
                    mdl_TMP_Emails_FichajesIncidencias.fecha = _dtt_Fecha;
                    mdl_TMP_Emails_FichajesIncidencias.entradaSalida = "";

                    g_obj_TMP_Emails_FichajesIncidencias_Datos.Insertar(mdl_TMP_Emails_FichajesIncidencias);
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichajes) + "/" + nameof(Grabar_ParaEmail_FichajeIncidencia_AusenciasProgramadasDiasFestivos));
            }
        }

        private void Grabar_ParaEmail_FichajeIncidencia_SinNadaAsignado(int _int_TipoIncidencia,
                                                                            long _lng_CodigoCliente,
                                                                            long _lng_idEmpleado,
                                                                            long? _lng_idFichaje,
                                                                            DateTime _dtt_Fecha)
        {
            try
            {
                if (g_bol_Grabar_Diccionarios_XML)
                {

                    TMP_Emails_FichajesIncidencias mdl_TMP_Emails_FichajesIncidencias = new TMP_Emails_FichajesIncidencias();

                    mdl_TMP_Emails_FichajesIncidencias.incidencia_descripcion = Variables_KairosPRO.G_STR_TIPOINCIDENCIA_FICHAJE_MENSAJE_EMAIL_FUERAJORNADA;
                    mdl_TMP_Emails_FichajesIncidencias.codigoCliente = _lng_CodigoCliente;
                    mdl_TMP_Emails_FichajesIncidencias.idEmpleado = _lng_idEmpleado;
                    mdl_TMP_Emails_FichajesIncidencias.idFichaje = _lng_idFichaje;
                    mdl_TMP_Emails_FichajesIncidencias.idJornadaCabecera = null;
                    mdl_TMP_Emails_FichajesIncidencias.idJornadaLinea = null;
                    mdl_TMP_Emails_FichajesIncidencias.incidencia_Tipo = _int_TipoIncidencia;
                    mdl_TMP_Emails_FichajesIncidencias.fecha = _dtt_Fecha;
                    mdl_TMP_Emails_FichajesIncidencias.entradaSalida = "";

                    g_obj_TMP_Emails_FichajesIncidencias_Datos.Insertar(mdl_TMP_Emails_FichajesIncidencias);
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(Verificacion_Fichajes) + "/" + nameof(Grabar_ParaEmail_FichajeIncidencia_SinNadaAsignado));
            }
        }

        #endregion

        private INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo Buscar_UltimoFichaje_AntesHora(List<INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo> _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, DateTime _dtt_FechaABuscar)
        {
            INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_DEVOLVER = null;

            //Busco el ultimo fichaje antes de la jornada actual para ver de que tipo fue
            if (_lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo != null && _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Count > 0)
            {
                //Se utiliza un foreach porque las horas pueden saltar de dia, y al no tener un datetime no se sabe sino por el orden
                foreach (INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo in _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.Where(m => m.validado != null && m.validado.Value > -1).OrderByDescending(m => m.fechaHora))
                {
                    //Coger el primer registro que la hora de fichaje se menor que la hora de inicio de jornadalinea
                    if (mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo.fechaHora <= _dtt_FechaABuscar)
                    {
                        mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_DEVOLVER = mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo;

                        break;
                    }
                }
            }

            return mdl_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo_DEVOLVER;
        }

        private bool Validar_Hora_Inicio(DateTime _dtt_Fecha_JornadaInicio,
                                         DateTime _dtt_Actual,
                                         DateTime _dtt_FechaHoraFichaje)
        {
            bool bol_Correcto = false;

            //El dia de la fecha del fichaje es igual a al dia de la fecha actual
            if (_dtt_FechaHoraFichaje.Day >= _dtt_Actual.Day)
            {
                //Comprobar si la fecha de fichaje es mayor que la fecha JornadaInicio
                if (_dtt_FechaHoraFichaje >= _dtt_Fecha_JornadaInicio)
                {
                    bol_Correcto = true;
                }
            }
            //El dia de la fecha del fichaje es menor a al dia de la fecha actual
            else
            {
                bol_Correcto = true;
            }

            return bol_Correcto;
        }
        private bool Validar_Hora_Fin(DateTime _dtt_Fecha_JornadaFinal,
                                      DateTime _dtt_Actual,
                                      DateTime _dtt_FechaHoraFichaje,
                                      DateTime _dtt_FechaInicial_Jornada)
        {
            bool bol_Correcta = false;

            //El dia de la fecha del fichaje es igual a al dia de la fecha actual
            if (_dtt_FechaHoraFichaje.Day <= _dtt_Actual.Day)
            {
                //Comprobar si la fecha de fichaje es menor que la fecha JornadaFinal
                if (_dtt_FechaHoraFichaje <= _dtt_Fecha_JornadaFinal)
                {
                    bol_Correcta = true;
                }                    
            }
            else
            {
                DateTime dtt_Fecha_JornadaFin = new DateTime(_dtt_Actual.Year,
                                                            _dtt_Actual.Month,
                                                            _dtt_Actual.Day,
                                                            _dtt_Fecha_JornadaFinal.Hour,
                                                            _dtt_Fecha_JornadaFinal.Minute,
                                                            _dtt_Fecha_JornadaFinal.Second);

                //Comprobar si la fecha de fichaje es menor que la fecha JornadaInicio
                if (_dtt_FechaHoraFichaje <= dtt_Fecha_JornadaFin)
                {
                    bol_Correcta = true;
                }
            }
          
            return bol_Correcta;
        }


        private DateTime Buscar_FechaInicial_BusquedaFichajes(DateTime _dtt_Actual)
        {
            bool bol_Encontro_Registro = false;

            TimeSpan tms_HoraCambioDia_Anterior = new TimeSpan(0, 0, 0);
            DateTime dtt_FechaInicioJornada= _dtt_Actual;

            //Si tiene JornadaCabecera el dia anterior, coger la hora de cambio de dia, para saber desde cuando hay que buscar los fichajes
            INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_PresenciasProgramadas_ParaVerificacion(g_mdl_KRS_Empleados.id, g_lng_CodigoCliente, _dtt_Actual);
            if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS != null)
            {
                DateTime dtt_ABuscar = _dtt_Actual.Date.AddDays(-1);
                if (_dtt_Actual.Day > mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.Dia_Inicial_Jornada.Day)
                {
                    dtt_ABuscar = dtt_ABuscar.AddDays(-1);
                }

                //Buscar el dia anterior para saber el cambioHora
                INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS_AUXILIAR = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_PresenciasProgramadas_ParaVerificacion(g_mdl_KRS_Empleados.id, g_lng_CodigoCliente, dtt_ABuscar);
                if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS_AUXILIAR != null)
                {
                    bol_Encontro_Registro = true;
                    tms_HoraCambioDia_Anterior = mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS_AUXILIAR.horaCambioDia;

                    dtt_FechaInicioJornada = new DateTime(mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.Dia_Inicial_Jornada.Year,
                                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.Dia_Inicial_Jornada.Month,
                                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.Dia_Inicial_Jornada.Day,
                                                            tms_HoraCambioDia_Anterior.Hours,
                                                            tms_HoraCambioDia_Anterior.Minutes,
                                                            0);
                }
                else
                {
                    bol_Encontro_Registro = true;
                    dtt_FechaInicioJornada = new DateTime(mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.Dia_Inicial_Jornada.Year,
                                                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.Dia_Inicial_Jornada.Month,
                                                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.Dia_Inicial_Jornada.Day,
                                                        0,
                                                        0,
                                                        0);
                }
                
            }
            //Jornada
            if (bol_Encontro_Registro == false)
            {
                INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_ParaVerificacion(g_mdl_KRS_Empleados.id, g_lng_CodigoCliente, _dtt_Actual);

                if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                {
                    DateTime dtt_ABuscar = _dtt_Actual.Date.AddDays(-1);
                    if (_dtt_Actual.Day > mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Day)
                    {
                        dtt_ABuscar = dtt_ABuscar.AddDays(-1);
                    }

                    INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_AUXILIAR = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_ParaVerificacion(g_mdl_KRS_Empleados.id, g_lng_CodigoCliente, dtt_ABuscar);
                    if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_AUXILIAR != null)
                    {
                        bol_Encontro_Registro = true;
                        tms_HoraCambioDia_Anterior = mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_AUXILIAR.horaCambioDia;

                        dtt_FechaInicioJornada = new DateTime(mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Year,
                                                                mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Month,
                                                                mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Day,
                                                                tms_HoraCambioDia_Anterior.Hours,
                                                                tms_HoraCambioDia_Anterior.Minutes,
                                                                0);
                    }
                    else
                    {
                        bol_Encontro_Registro = true;
                        dtt_FechaInicioJornada = new DateTime(mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Year,
                                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Month,
                                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.Dia_Inicial_Jornada.Day,
                                                            0,
                                                            0,
                                                            0);
                    }
                    
                }
            }

            //Fecha Hora Inicial
            if (bol_Encontro_Registro == false)
            {
                dtt_FechaInicioJornada = new DateTime(_dtt_Actual.Year,
                                                    _dtt_Actual.Month,
                                                    _dtt_Actual.Day,
                                                    tms_HoraCambioDia_Anterior.Hours,
                                                    tms_HoraCambioDia_Anterior.Minutes,
                                                    0);
            }

            return dtt_FechaInicioJornada;
        }

        private DateTime Buscar_FechaFinal_BusquedaFichajes(DateTime _dtt_Actual)
        {
            bool bol_Encontro_Registro = false;
            DateTime dtt_FechaFinal_ABuscar= _dtt_Actual;

            //Si tiene JornadaCabecera , coger la hora de cambio de dia, para saber desde cuando hay que buscar los fichajes
            INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_PresenciasProgramadas_ParaVerificacion(g_mdl_KRS_Empleados.id, g_lng_CodigoCliente, _dtt_Actual);
            if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS != null)
            {
                bol_Encontro_Registro = true;

                dtt_FechaFinal_ABuscar = new DateTime(mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.AUX_JornadaDia_Fin.Year,
                                                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.AUX_JornadaDia_Fin.Month,
                                                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.AUX_JornadaDia_Fin.Day,
                                                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.AUX_JornadaDia_Fin.Hour,
                                                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.AUX_JornadaDia_Fin.Minute,
                                                        mdl_INTERNO_Verificacion_JornadasCabecera_Modelo_PRESENCIASPROGRAMADAS.AUX_JornadaDia_Fin.Second);
            }

            //Jornada
            if (bol_Encontro_Registro == false)
            {
                INTERNO_Verificacion_JornadasCabecera_Modelo mdl_INTERNO_Verificacion_JornadasCabecera_Modelo = g_obj_KRS_JornadasCabecera_Datos.Obtener_JornadasCabecera_ParaVerificacion(g_mdl_KRS_Empleados.id, g_lng_CodigoCliente, _dtt_Actual);

                if (mdl_INTERNO_Verificacion_JornadasCabecera_Modelo != null)
                {
                    bol_Encontro_Registro = true;
                    dtt_FechaFinal_ABuscar = new DateTime(mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.AUX_JornadaDia_Fin.Year,
                                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.AUX_JornadaDia_Fin.Month,
                                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.AUX_JornadaDia_Fin.Day,
                                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.AUX_JornadaDia_Fin.Hour,
                                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.AUX_JornadaDia_Fin.Minute,
                                                            mdl_INTERNO_Verificacion_JornadasCabecera_Modelo.AUX_JornadaDia_Fin.Second);
                }
            }
           
            if (bol_Encontro_Registro == false)
            {
                dtt_FechaFinal_ABuscar = new DateTime(_dtt_Actual.Year,
                                                      _dtt_Actual.Month,
                                                      _dtt_Actual.Day,
                                                      23,
                                                      59,
                                                      59);
            }

            return dtt_FechaFinal_ABuscar;

        }

    }
}
