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 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()); Variables_KairosPRO.G_DCT_JORNADASLINEASHORAFINALYAVALIDADAS.Clear(); Variables_KairosPRO.G_DCT_JORNADASLINEASHORAFINALYAVALIDADAS.Add(g_lng_CodigoCliente, new List()); Variables_KairosPRO.G_DCT_DETALLEFICHAJEYAVALIDADOS.Clear(); Variables_KairosPRO.G_DCT_DETALLEFICHAJEYAVALIDADOS.Add(g_lng_CodigoCliente, new List()); } 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 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 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 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 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 _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, bool _bol_Tipo_JornadaLinea_Anterior_Flexible, long _lng_idEmpresa, List _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo) { //DEBERIA TENER UNA SALIDA , SINO ERROR @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool bol_ComprobarIncidencia = true; List 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 _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo, int _int_Contador, DateTime _dtt_JornadaLinea_Inicial, DateTime _dtt_JornadaLinea_Final, ref List _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 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 _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, bool _bol_Tipo_JornadaLinea_Anterior_Flexible, long _lng_idEmpresa, List _lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo) { //DEBERIA TENER UNA ENTRADA , SINO ERROR @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ bool bol_ComprobarIncidencia = true; List 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 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 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 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 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 _lst_INTERNO_VerificacionFichajes_KRSS_Fichajes_Modelo, List _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 _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; } } }