using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_KairosPRO._1_Modelos;
using Exferia_KairosPRO._2_Datos;
using Exferia_KairosPRO._4_Vistas.ControlesPersonalizados_DentroPaneles;
using Exferia_KairosPRO.General;
using Exferia_KairosPRO_EF;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_KairosPRO._4_Vistas.Controladoras
{
    public class P_Incidencias_Controladora
    {
        #region Variables Generales
        private P_Incidencias g_frm_P_Incidencias = null;
        private PE_Esperando g_frm_PE_Esperando_CargaInicial;
        private PE_Esperando g_frm_PE_Esperando_Actualizacion;

        public bool g_bol_Termino_CargaDatos_Inicial = false;//Se utiliza para saber cuando se termina la carga de los datos estaticos

        //Clases de Negocio necesarias
        private KRSS_Fichajes_Datos g_obj_KRSS_Fichajes_Datos = new KRSS_Fichajes_Datos();
        private KRS_DiasFestivos_Datos g_obj_KRS_DiasFestivos_Datos = new KRS_DiasFestivos_Datos();
        private KRS_Empleados_Datos g_obj_KRS_Empleados_Datos = new KRS_Empleados_Datos();
        
        //Modelo Necesarios
        public INTERNO_KRS_Empleados_Modelo g_mdl_INTERNO_KRS_Empleados_Modelo;

        //Listados Necesarios
        private List<KRS_AusenciasProgramadas> g_lst_KRS_AusenciasProgramadas = null;
        private List<KRS_PresenciasProgramadas> g_lst_KRS_PresenciasProgramadas = null;
        private List<KRS_PerfilesLinea> g_lst_KRS_PerfilesLinea = null;
        private List<KRS_DiasFestivos> g_lst_KRS_DiasFestivos = null;
        private List<KRSS_Fichajes> g_lst_KRSS_Fichajes = null;
        private List<KRSS_Pausas> g_lst_KRSS_Pausas = null;
        private List<INTERNO_KRS_Empleados_Modelo> g_lst_INTERNO_KRS_Empleados_Modelo = null;

        //Tareea Asincrona de carga inicial
        private BackgroundWorker g_obj_TareaAsincrona_CargaInicial;
        public bool g_bol_Termino_CargaInicial = false;

        //Tareea Asincrona de Actualizar datos
        private BackgroundWorker g_obj_TareaAsincrona_ActualizarDatos;
        public int g_int_Mes = 1;

        //Tarea Asincrona Rellenar DataGrid Empleados
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Empleados = null;

        //Listados estáticos, para cargar y buscar en los combos
        private List<INTERNO_ComboBox_Modelo> g_lst_Meses_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();
        private List<INTERNO_ComboBox_Modelo> g_lst_EntradaSalida_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();

        public bool g_bol_Cargando_Empleados = true;
        public long g_lng_idEmpleado_Seleccionado = -1;
        #endregion

        #region Constructor
        public P_Incidencias_Controladora(P_Incidencias _frm_P_Incidencias)
        {
            g_frm_P_Incidencias = _frm_P_Incidencias;
        }
        #endregion

        #region  Cargar Inicial
        public void CargaInicial(long _lng_idEmpleado_Seleccionado)
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Incidencias.Enabled = false;
                g_bol_Termino_CargaDatos_Inicial = false;

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargaInicial != null)
                {
                    while (g_obj_TareaAsincrona_CargaInicial.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_CargaInicial = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargaInicial.DoWork += new DoWorkEventHandler(TareaAsincrona_CargaInicial_DoWork);
                    g_obj_TareaAsincrona_CargaInicial.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargaInicial_Completed);
                    g_obj_TareaAsincrona_CargaInicial.WorkerReportsProgress = false;
                }

                g_lng_idEmpleado_Seleccionado = _lng_idEmpleado_Seleccionado;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_CargaInicial.RunWorkerAsync();
                //#################################################################################################

                //Mostrar la pantalla de espera
                if (g_frm_PE_Esperando_CargaInicial != null)
                {
                    g_frm_PE_Esperando_CargaInicial.Close();
                    g_frm_PE_Esperando_CargaInicial = null;
                }

                g_frm_PE_Esperando_CargaInicial = new PE_Esperando();
                g_frm_PE_Esperando_CargaInicial.ShowDialog();
                
            }
            catch (Exception ex)
            {
                g_frm_P_Incidencias.Enabled = true;

                if (g_frm_PE_Esperando_CargaInicial != null)
                {
                    g_frm_PE_Esperando_CargaInicial.Close();
                    g_frm_PE_Esperando_CargaInicial = null;
                }

                throw new Control_Errores("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(CargaInicial), true);
            }
        }
        private void TareaAsincrona_CargaInicial_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                //Cargar Valores
                if (CargaInicial_Final() == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargaInicial_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando_CargaInicial != null)
            {
                g_frm_PE_Esperando_CargaInicial.Close();
                g_frm_PE_Esperando_CargaInicial = null;
            }

            //Desbloqueo el formulario
            g_frm_P_Incidencias.Enabled = true;

            try
            {
                g_bol_Termino_CargaDatos_Inicial = true;

                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)//Compruebo si el mensaje no esta vacio
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                        g_frm_P_Incidencias.Salir_P_Base();
                    }
                }
                else
                {
                    //Rellenar el calendario
                    g_int_Mes = g_frm_P_Incidencias.Exferia_DateTimePicker_Meses.Exferia_DateTimePicker_Mes;

                    //Rellenar el DataGridView de Empleados
                    Rellenar_DataGrid_Empleados("");
                    
                    g_bol_Termino_CargaInicial = true;

                }
            }
            catch(Exception ex)
            {
                g_bol_Cargando_Empleados = false;
                g_bol_Termino_CargaInicial = true;
                Control_Errores.Errores_Log("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(TareaAsincrona_CargaInicial_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Incidencias.Salir_P_Base();
            }
        }

        public bool CargaInicial_Final()
        {
            bool bol_ValorDevuelto = true;

            try
            {
                g_lst_INTERNO_KRS_Empleados_Modelo = null;

                //Ejercicio
                int int_Anyo = Convert.ToInt32(g_frm_P_Incidencias.Exferia_NumericUpDown_Anyo.Exferia_NumericUpDown_Value);
                GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa = Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(new DateTime(int_Anyo, g_int_Mes, 1), g_frm_P_Incidencias.P_Base_ValoresGenerales.lng_idEmpresa);
                if (mdl_GEN_EjerciciosActivos_Empresa != null)
                {

                    //KRS_Empleados
                    g_lst_INTERNO_KRS_Empleados_Modelo = g_obj_KRS_Empleados_Datos.Obtener_Registros_Para_Listado(mdl_GEN_EjerciciosActivos_Empresa, null);

                    //Ordenamos los Empleados
                    g_lst_INTERNO_KRS_Empleados_Modelo = g_lst_INTERNO_KRS_Empleados_Modelo.OrderBy(m => m.nombre).ToList();
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(CargaInicial_Final));
                bol_ValorDevuelto = false;
            }

            return bol_ValorDevuelto;
        }

        public void Cargar_Calendario(int _int_Mes)
        {
            try
            {
                int int_Dia_Semana = 0;
                int int_Dia_mes = 1;
                int int_Contador = 1;

                //EjercecioActivo
                int int_Anyo = Convert.ToInt32(g_frm_P_Incidencias.Exferia_NumericUpDown_Anyo.Exferia_NumericUpDown_Value);

                //Cambiar año pro ejercico actual
                DayOfWeek dow_Dia_Semana = new DateTime(int_Anyo, _int_Mes, 1).DayOfWeek;
                int int_Total_Dias_Mes = DateTime.DaysInMonth(int_Anyo, _int_Mes);

                if (dow_Dia_Semana == DayOfWeek.Monday)
                {
                    int_Dia_Semana = 0;
                }
                else if (dow_Dia_Semana == DayOfWeek.Tuesday)
                {
                    int_Dia_Semana = 1;
                }
                else if (dow_Dia_Semana == DayOfWeek.Wednesday)
                {
                    int_Dia_Semana = 2;
                }
                else if (dow_Dia_Semana == DayOfWeek.Thursday)
                {
                    int_Dia_Semana = 3;
                }
                else if (dow_Dia_Semana == DayOfWeek.Friday)
                {
                    int_Dia_Semana = 4;
                }
                else if (dow_Dia_Semana == DayOfWeek.Saturday)
                {
                    int_Dia_Semana = 5;

                }
                else if (dow_Dia_Semana == DayOfWeek.Sunday)
                {
                    int_Dia_Semana = 6;

                }

                //Actualizo los componentes
                CTU_P_Incidencias_Dia obj_CTU_P_Incidencias_Dia = null;
                while (int_Contador <= (g_frm_P_Incidencias.Exferia_Panel_Degradado_Calendario.Controls.Count - 7))//resto los dias de semana
                {
                    obj_CTU_P_Incidencias_Dia = (CTU_P_Incidencias_Dia)g_frm_P_Incidencias.Exferia_Panel_Degradado_Calendario.Controls.Find(nameof(CTU_P_Incidencias_Dia) + int_Contador, true).FirstOrDefault();
                    //obj_CTU_P_Incidencias_Dia.lbl_CTU_P_Incidencias_Click += new System.EventHandler<INTERNO_EventArgs>(Abrir_Fichajes);

                    if (int_Dia_mes <= int_Total_Dias_Mes)
                    {
                        if (int_Dia_Semana >= int_Contador)
                        {
                            obj_CTU_P_Incidencias_Dia.Limpiar();
                        }
                        else
                        {
                            obj_CTU_P_Incidencias_Dia.Actualizar(null,
                                                          int_Dia_mes,
                                                          Variables_KairosPRO.G_INT_CONTROL_INCIDENCIAS_DIA_VALOR_RESTO,
                                                          "",
                                                          "",
                                                          "",
                                                          Funciones.Convertir_Color_Hexadecimal(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_VACIO),
                                                          "");
                            int_Dia_mes++;
                        }
                    }
                    else
                    {
                        obj_CTU_P_Incidencias_Dia.Limpiar();
                    }
                    int_Contador++;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message,ex,nameof(P_Incidencias_Controladora)+"/"+nameof(Cargar_Calendario));
            }
        }
        #endregion

        #region Empleados
        public void Rellenar_DataGrid_Empleados(string _str_Buscar)
        {
            try
            {
                g_bol_Cargando_Empleados = true;

                if (g_TareaAsincrona_Rellenar_DataGrid_Empleados != null)
                {
                    g_TareaAsincrona_Rellenar_DataGrid_Empleados.CancelAsync();
                    while (g_TareaAsincrona_Rellenar_DataGrid_Empleados.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_TareaAsincrona_Rellenar_DataGrid_Empleados = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_DataGrid_Empleados.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Empleados_DoWork);
                    g_TareaAsincrona_Rellenar_DataGrid_Empleados.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Empleados_ProgressChanged);
                    g_TareaAsincrona_Rellenar_DataGrid_Empleados.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Empleados_Completed);
                    g_TareaAsincrona_Rellenar_DataGrid_Empleados.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_DataGrid_Empleados.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_Incidencias.Exferia_DataGridView_Empleados.Rows.Clear();

                //Vaciar el Calendario
                CTU_P_Incidencias_Dia obj_CTU_P_Incidencias_Dia = null;
                for (int int_Contador = 1; int_Contador <= g_frm_P_Incidencias.Exferia_Panel_Degradado_Calendario.Controls.Count; int_Contador++)
                {
                    obj_CTU_P_Incidencias_Dia = (CTU_P_Incidencias_Dia)g_frm_P_Incidencias.Exferia_Panel_Degradado_Calendario.Controls.Find(nameof(CTU_P_Incidencias_Dia) + int_Contador, true).FirstOrDefault();
                    if (obj_CTU_P_Incidencias_Dia != null)
                    {
                        obj_CTU_P_Incidencias_Dia.Limpiar();
                    }
                }

                List<object> lst_Argumentos = new List<object>();
                lst_Argumentos.Add(_str_Buscar);
                lst_Argumentos.Add(g_frm_P_Incidencias.Exferia_CheckBox_PalabraCompleta.Checked);
                lst_Argumentos.Add(g_frm_P_Incidencias.Exferia_CheckBox_MayusculasMinusculas.Checked);

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Empleados.RunWorkerAsync(lst_Argumentos);
                //#################################################################################################
                
            }
            catch (Exception ex)
            {
                g_bol_Cargando_Empleados = false;

                Control_Errores.Errores_Log(ex.Message, nameof(P_Incidencias_Controladora) + "/" + nameof(Rellenar_DataGrid_Empleados));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Empleados_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Argumentos
                List<object> lst_Argumentos = (List<object>)e.Argument;
                string str_Buscar = (string)lst_Argumentos[0];
                bool bol_PalabraCompleta = (bool)lst_Argumentos[1];
                bool bol_MayusculasMinusculas = (bool)lst_Argumentos[2];

                long lng_idEmpleado_Seleccionado = -1;

                if (g_lst_INTERNO_KRS_Empleados_Modelo != null && g_lst_INTERNO_KRS_Empleados_Modelo.Count > 0)
                {
                    //Primero clono el listado para siempre tener todos los empleados y solo modificar este
                    List<INTERNO_KRS_Empleados_Modelo> lst_INTERNO_KRS_Empleados_Modelo = new List<INTERNO_KRS_Empleados_Modelo>(g_lst_INTERNO_KRS_Empleados_Modelo);

                    int int_AnyoControl = Convert.ToInt32(g_frm_P_Incidencias.Exferia_NumericUpDown_Anyo.Exferia_NumericUpDown_Value);

                    //Si estuviera de baja, al siguiente año de la baja no se muestra el empleado
                    lst_INTERNO_KRS_Empleados_Modelo = lst_INTERNO_KRS_Empleados_Modelo.Where(x => x.fechaBaja == null || (x.fechaBaja!=null && x.fechaBaja.Value.Year >= int_AnyoControl)).ToList();
                    
                    //Tiene Filtro
                    if (str_Buscar.Trim().Length > 0)
                    {
                        //Palabra Completa
                        if (bol_PalabraCompleta)
                        {
                            //Sencible a mayusculas y minusculas
                            if (bol_MayusculasMinusculas)
                            {
                                lst_INTERNO_KRS_Empleados_Modelo = lst_INTERNO_KRS_Empleados_Modelo.Where(m => m.nombre == str_Buscar).ToList();
                            }
                            //No tiene en cuenta las mayusculas y las minusculas
                            else
                            {
                                lst_INTERNO_KRS_Empleados_Modelo = lst_INTERNO_KRS_Empleados_Modelo.Where(m => m.nombre.ToUpper() == str_Buscar.ToUpper()).ToList();
                            }
                        }
                        //Por Contenido
                        else
                        {
                            //Sencible a mayusculas y minusculas
                            if (bol_MayusculasMinusculas)
                            {
                                lst_INTERNO_KRS_Empleados_Modelo = lst_INTERNO_KRS_Empleados_Modelo.Where(m => m.nombre.Contains(str_Buscar)).ToList();
                            }
                            //No tiene en cuenta las mayusculas y las minusculas
                            else
                            {
                                lst_INTERNO_KRS_Empleados_Modelo = lst_INTERNO_KRS_Empleados_Modelo.Where(m => m.nombre.ToUpper().Contains(str_Buscar.ToUpper())).ToList();
                            }
                        }

                    }

                    if (lst_INTERNO_KRS_Empleados_Modelo != null && lst_INTERNO_KRS_Empleados_Modelo.Count > 0)
                    {
                        foreach (INTERNO_KRS_Empleados_Modelo mdl_INTERNO_KRS_Empleados_Modelo in lst_INTERNO_KRS_Empleados_Modelo.OrderBy(m => m.nombre))
                        {
                            //Se Cancelo la tarea asincrona #########################
                            if (((BackgroundWorker)sender).CancellationPending)
                            {
                                e.Cancel = true;
                                return;
                            }

                            //Añadir al DataGridView
                            ((BackgroundWorker)sender).ReportProgress(1, Transformar_Modelo_A_Row_Empleados(mdl_INTERNO_KRS_Empleados_Modelo, null));

                            //Esperar un poco
                            Thread.Sleep(1);

                            if (g_lng_idEmpleado_Seleccionado > -1 && mdl_INTERNO_KRS_Empleados_Modelo.id == g_lng_idEmpleado_Seleccionado)
                            {
                                lng_idEmpleado_Seleccionado = mdl_INTERNO_KRS_Empleados_Modelo.id;
                            }
                            else if (lng_idEmpleado_Seleccionado == -1)
                            {
                                lng_idEmpleado_Seleccionado = mdl_INTERNO_KRS_Empleados_Modelo.id;
                            }
                        }
                    }
                }

                g_lng_idEmpleado_Seleccionado = lng_idEmpleado_Seleccionado;
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Empleados_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (!g_frm_P_Incidencias.IsDisposed && e.ProgressPercentage == 1)
                {
                    DataGridViewRow dgrv_Fila = (DataGridViewRow)e.UserState;
                    g_frm_P_Incidencias.Exferia_DataGridView_Empleados.Rows.Add(dgrv_Fila);
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Empleados_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            try
            {
                //Seleccionarlo en el DataGridView
                if (g_lng_idEmpleado_Seleccionado > -1)
                {
                    DataGridViewRow dgvr_Empleado = g_frm_P_Incidencias.Exferia_DataGridView_Empleados.Rows
                                                         .Cast<DataGridViewRow>()
                                                         .Where(r => r.Cells[0].Value.Equals(g_lng_idEmpleado_Seleccionado)).FirstOrDefault();

                    if (dgvr_Empleado != null)
                    {
                        dgvr_Empleado.Selected = true;
                    }
                }

                Cargar_Calendario(g_int_Mes);
                ActualizarDatos(g_lng_idEmpleado_Seleccionado);

                g_bol_Cargando_Empleados = false;
            }
            catch(Exception ex)
            {
                g_bol_Cargando_Empleados = false;
                Control_Errores.Errores_Log("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Empleados_Completed));
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Empleados(INTERNO_KRS_Empleados_Modelo _mdl_INTERNO_KRS_Empleados_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Incidencias.Exferia_DataGridView_Empleados.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Incidencias.Exferia_DataGridView_Empleados);
            }

            obj_DataGridViewRow.Cells[0].Value = _mdl_INTERNO_KRS_Empleados_Modelo.id;
            obj_DataGridViewRow.Cells[1].Value = _mdl_INTERNO_KRS_Empleados_Modelo.nombre;

            return obj_DataGridViewRow;
        }
        #endregion

        #region Actualizar Datos
        public void ActualizarDatos(long _lng_idEmpleado_Seleccionado)
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termnine
                g_frm_P_Incidencias.Enabled = false;

                //Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_ActualizarDatos != null)
                {
                    while (g_obj_TareaAsincrona_ActualizarDatos.IsBusy)
                        Application.DoEvents();

                }
                else
                {
                    g_obj_TareaAsincrona_ActualizarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_ActualizarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_ActualizarDatos_DoWork);
                    g_obj_TareaAsincrona_ActualizarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_ActualizarDatos_Completed);
                    g_obj_TareaAsincrona_ActualizarDatos.WorkerReportsProgress = false;
                }

                g_lng_idEmpleado_Seleccionado = _lng_idEmpleado_Seleccionado;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_ActualizarDatos.RunWorkerAsync();
                //#################################################################################################

                //Mostrar la pantalla de espera
                if (g_frm_PE_Esperando_Actualizacion != null)
                {
                    g_frm_PE_Esperando_Actualizacion.Close();
                    g_frm_PE_Esperando_Actualizacion = null;
                }

                g_frm_PE_Esperando_Actualizacion = new PE_Esperando();
                g_frm_PE_Esperando_Actualizacion.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Incidencias.Enabled = true;

                if (g_frm_PE_Esperando_Actualizacion != null)
                {
                    g_frm_PE_Esperando_Actualizacion.Close();
                    g_frm_PE_Esperando_Actualizacion = null;
                }

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Incidencias_Controladora) + "/" + nameof(ActualizarDatos), true);
            }
        }
        private void TareaAsincrona_ActualizarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                //Actializar Valores
                if (Actualizar_DatosEnMemoria_DelEmpleado(g_lng_idEmpleado_Seleccionado) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(TareaAsincrona_ActualizarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(TareaAsincrona_ActualizarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_ActualizarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando_Actualizacion != null)
            {
                g_frm_PE_Esperando_Actualizacion.Close();
                g_frm_PE_Esperando_Actualizacion = null;
            }
            //Desbloqueo el formulario
            g_frm_P_Incidencias.Enabled = true;

            try
            {
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)//Compruebo si el mensaje no esta vacio
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                        g_frm_P_Incidencias.Salir_P_Base();
                    }
                }
                else
                {
                    //Actualizar los datos del calenderio
                    Actualizar_Calendario(g_int_Mes, g_lng_idEmpleado_Seleccionado);
                }
            }
            catch (Exception ex)
            {

                Control_Errores.Errores_Log("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(TareaAsincrona_ActualizarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Incidencias.Salir_P_Base();
            }
            finally
            {
               
            }
        }
        private bool Actualizar_DatosEnMemoria_DelEmpleado(long _lng_id)
        {
            bool bol_ValorDevuelto = true;
            try
            {
                //KRS_DiasFestivos
                g_lst_KRS_DiasFestivos = null;

                //Ejercicio
                int int_Anyo = Convert.ToInt32(g_frm_P_Incidencias.Exferia_NumericUpDown_Anyo.Exferia_NumericUpDown_Value);
                GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa=Datos_Generales.GEN_EjerciciosActivos_Empresa_Obtener_Por_FechaEmpresa(new DateTime(int_Anyo, g_int_Mes,1),g_frm_P_Incidencias.P_Base_ValoresGenerales.lng_idEmpresa);
                if (mdl_GEN_EjerciciosActivos_Empresa!=null)
                {
                    g_lst_KRS_DiasFestivos = g_obj_KRS_DiasFestivos_Datos.Obtener_ModeloListado_Por_Ejercicio(mdl_GEN_EjerciciosActivos_Empresa);
                }

               
                if (g_lst_KRS_DiasFestivos == null)
                {
                    g_lst_KRS_DiasFestivos = new List<KRS_DiasFestivos>();
                }

                //KRS_Empleados
                if (g_lst_INTERNO_KRS_Empleados_Modelo != null && 
                    g_lst_INTERNO_KRS_Empleados_Modelo.Count > 0)
                {
                    g_mdl_INTERNO_KRS_Empleados_Modelo = g_lst_INTERNO_KRS_Empleados_Modelo.Where(x => x.id.Equals(_lng_id)).FirstOrDefault();

                  
                    if (g_mdl_INTERNO_KRS_Empleados_Modelo != null)
                    {
                        //KRSS_Fichajes
                        g_lst_KRSS_Fichajes = Funciones_KairosPRO.Obtener_Fichajes_PorEmpleadoJornada(g_mdl_INTERNO_KRS_Empleados_Modelo, Convert.ToInt32(g_frm_P_Incidencias.Exferia_NumericUpDown_Anyo.Exferia_NumericUpDown_Value), g_int_Mes, g_frm_P_Incidencias.P_Base_ValoresGenerales.lng_idEmpresa);

                        //KRSS_Pausas
                        g_lst_KRSS_Pausas = Funciones_KairosPRO.Obtener_Pausas_PorEmpleadoJornada(g_mdl_INTERNO_KRS_Empleados_Modelo, Convert.ToInt32(g_frm_P_Incidencias.Exferia_NumericUpDown_Anyo.Exferia_NumericUpDown_Value), g_int_Mes, g_frm_P_Incidencias.P_Base_ValoresGenerales.lng_idEmpresa);
                    }
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Incidencias_Controladora) + "/" + nameof(Actualizar_DatosEnMemoria_DelEmpleado));
                bol_ValorDevuelto = false;
            }

            return bol_ValorDevuelto;
        }

        public void Actualizar_Calendario(int _int_Mes, long _lng_id)
        {
            try
            {
                KRS_JornadasCabecera mdl_KRS_JornadasCabecera = new KRS_JornadasCabecera();
                KRS_PresenciasProgramadas mdl_KRS_PresenciasProgramadas = new KRS_PresenciasProgramadas();
                KRS_DiasFestivos mdl_KRS_DiasFestivos = new KRS_DiasFestivos();
                KRS_AusenciasProgramadas mdl_KRS_AusenciasProgramadas = new KRS_AusenciasProgramadas();

                List<KRSS_Fichajes> lst_KRSS_Fichajes_DelDia = null;

                int int_Dia_Semana = 0;
                int int_Dia_mes = 1;
                int int_Contador = 1;

                bool bol_Tiene_Jornada = false;

                //EjercecioActivo
                int int_Anyo = Convert.ToInt32(g_frm_P_Incidencias.Exferia_NumericUpDown_Anyo.Exferia_NumericUpDown_Value);

                //Cambiar año pro ejercico actual
                DayOfWeek dow_Dia_Semana = new DateTime(int_Anyo, _int_Mes, 1).DayOfWeek;
                int int_Total_Dias_Mes = DateTime.DaysInMonth(int_Anyo, _int_Mes);

                if (dow_Dia_Semana == DayOfWeek.Monday)
                {
                    int_Dia_Semana = 0;
                }
                else if (dow_Dia_Semana == DayOfWeek.Tuesday)
                {
                    int_Dia_Semana = 1;
                }
                else if (dow_Dia_Semana == DayOfWeek.Wednesday)
                {
                    int_Dia_Semana = 2;
                }
                else if (dow_Dia_Semana == DayOfWeek.Thursday)
                {
                    int_Dia_Semana = 3;
                }
                else if (dow_Dia_Semana == DayOfWeek.Friday)
                {
                    int_Dia_Semana = 4;
                }
                else if (dow_Dia_Semana == DayOfWeek.Saturday)
                {
                    int_Dia_Semana = 5;

                }
                else if (dow_Dia_Semana == DayOfWeek.Sunday)
                {
                    int_Dia_Semana = 6;

                }

                //Comprueba si los listados son nulos y los inicializa                          
                g_lst_KRS_PresenciasProgramadas = (_lng_id>-1 && g_mdl_INTERNO_KRS_Empleados_Modelo.KRS_PresenciasProgramadas != null) ? g_mdl_INTERNO_KRS_Empleados_Modelo.KRS_PresenciasProgramadas.ToList() : new List<KRS_PresenciasProgramadas>();
                g_lst_KRS_AusenciasProgramadas = (_lng_id > -1 && g_mdl_INTERNO_KRS_Empleados_Modelo.KRS_AusenciasProgramadas != null) ? g_mdl_INTERNO_KRS_Empleados_Modelo.KRS_AusenciasProgramadas.ToList() : new List<KRS_AusenciasProgramadas>();
                KRS_PerfilesCabecera mdl_KRS_PerfilesCabecera = (_lng_id > -1 && g_mdl_INTERNO_KRS_Empleados_Modelo.PerfilesCabecera != null) ? g_mdl_INTERNO_KRS_Empleados_Modelo.PerfilesCabecera : new KRS_PerfilesCabecera();
                if (mdl_KRS_PerfilesCabecera!=null && mdl_KRS_PerfilesCabecera.KRS_PerfilesLinea != null)
                {
                    g_lst_KRS_PerfilesLinea = mdl_KRS_PerfilesCabecera.KRS_PerfilesLinea.ToList();
                }

                //Actualizo los componentes
                CTU_P_Incidencias_Dia obj_CTU_P_Incidencias_Dia = null;
                while (int_Contador <= (g_frm_P_Incidencias.Exferia_Panel_Degradado_Calendario.Controls.Count - 7))//resto los dias de semana
                {
                    lst_KRSS_Fichajes_DelDia = null;

                    obj_CTU_P_Incidencias_Dia = (CTU_P_Incidencias_Dia)g_frm_P_Incidencias.Exferia_Panel_Degradado_Calendario.Controls.Find(nameof(CTU_P_Incidencias_Dia) + int_Contador, true).FirstOrDefault();

                    if (int_Dia_mes <= int_Total_Dias_Mes)
                    {
                        if (int_Dia_Semana >= int_Contador)
                        {
                            obj_CTU_P_Incidencias_Dia.Limpiar();
                        }
                        else
                        {
                            if (g_mdl_INTERNO_KRS_Empleados_Modelo!=null && g_mdl_INTERNO_KRS_Empleados_Modelo.id.Equals(_lng_id))
                            {
                                //Presencia Programada
                                if (g_lst_KRS_PresenciasProgramadas.Exists(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                            x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)))
                                {
                                    mdl_KRS_PresenciasProgramadas = g_lst_KRS_PresenciasProgramadas.Where(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                            x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)).FirstOrDefault();

                                    if (g_lst_KRS_PerfilesLinea.Exists(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                    x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)))
                                    {
                                        mdl_KRS_JornadasCabecera = g_lst_KRS_PerfilesLinea.Where(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                       x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)).FirstOrDefault().KRS_JornadasCabecera;
                                    }

                                    obj_CTU_P_Incidencias_Dia.Actualizar(null,
                                                                    int_Dia_mes,
                                                                    Variables_KairosPRO.G_INT_CONTROL_INCIDENCIAS_DIA_VALOR_PRESENCIA,
                                                                    mdl_KRS_PresenciasProgramadas.KRS_PresenciasProgramadasTipos.colorLetra,
                                                                    mdl_KRS_PresenciasProgramadas.KRS_PresenciasProgramadasTipos.colorFondo,
                                                                    "",
                                                                    mdl_KRS_JornadasCabecera != null ? mdl_KRS_JornadasCabecera.colorFondo : "",
                                                                    mdl_KRS_PresenciasProgramadas.KRS_PresenciasProgramadasTipos.descripcion);
                                    bol_Tiene_Jornada = true;

                                }
                                //Ausencia programada
                                else if (g_lst_KRS_AusenciasProgramadas.Exists(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                             x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)))
                                {
                                    mdl_KRS_AusenciasProgramadas = g_lst_KRS_AusenciasProgramadas.Where(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                            x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)).FirstOrDefault();

                                    if (g_lst_KRS_PerfilesLinea.Exists(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                    x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)))
                                    {
                                        mdl_KRS_JornadasCabecera = g_lst_KRS_PerfilesLinea.Where(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                       x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)).FirstOrDefault().KRS_JornadasCabecera;
                                    }

                                    obj_CTU_P_Incidencias_Dia.Actualizar(null,
                                                                    int_Dia_mes,
                                                                    Variables_KairosPRO.G_INT_CONTROL_INCIDENCIAS_DIA_VALOR_AUSENCIA,
                                                                    mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.colorLetra,
                                                                    mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.colorFondo,
                                                                    mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.colorLetra,
                                                                    mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.colorFondo,
                                                                    mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.descripcion);
                                }
                                //Dias Festivos
                                else if (g_lst_KRS_DiasFestivos.Exists(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                               x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)))
                                {
                                    mdl_KRS_DiasFestivos = g_lst_KRS_DiasFestivos.Where(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                                x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)).FirstOrDefault();

                                    obj_CTU_P_Incidencias_Dia.Actualizar(null,
                                                                    int_Dia_mes,
                                                                    Variables_KairosPRO.G_INT_CONTROL_INCIDENCIAS_DIA_VALOR_FESTIVO,
                                                                    "",
                                                                    Funciones.Convertir_Color_Hexadecimal(Colores.G_COLOR_KAIROSPRO_DIASFESTIVOS),
                                                                    "",
                                                                    Funciones.Convertir_Color_Hexadecimal(Colores.G_COLOR_KAIROSPRO_DIASFESTIVOS),
                                                                    mdl_KRS_DiasFestivos.descripcion);
                                }
                                //Jornada
                                else if (g_lst_KRS_PerfilesLinea!=null && g_lst_KRS_PerfilesLinea.Exists(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                                                              x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)))
                                {
                                    mdl_KRS_JornadasCabecera = g_lst_KRS_PerfilesLinea.Where(x => x.fechaDesde <= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0) &&
                                                                        x.fechaHasta >= new DateTime(int_Anyo, _int_Mes, int_Dia_mes, 0, 0, 0)).FirstOrDefault().KRS_JornadasCabecera;

                                    obj_CTU_P_Incidencias_Dia.Actualizar(mdl_KRS_JornadasCabecera,
                                                                    int_Dia_mes,
                                                                    Variables_KairosPRO.G_INT_CONTROL_INCIDENCIAS_DIA_VALOR_RESTO,
                                                                    "",
                                                                    "",
                                                                    mdl_KRS_JornadasCabecera.colorLetra,
                                                                    mdl_KRS_JornadasCabecera.colorFondo,
                                                                    mdl_KRS_JornadasCabecera.descripcion);
                                    bol_Tiene_Jornada = true;
                                }
                                //Nada
                                else
                                {
                                    obj_CTU_P_Incidencias_Dia.Actualizar(null,
                                                                  int_Dia_mes,
                                                                  Variables_KairosPRO.G_INT_CONTROL_INCIDENCIAS_DIA_VALOR_RESTO,
                                                                  "",
                                                                  "",
                                                                  "",
                                                                  Funciones.Convertir_Color_Hexadecimal(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_VACIO),
                                                                  "");

                                }

                                //Saber si el Fichaje tiene jornada para poner color
                                if (bol_Tiene_Jornada)
                                {
                                    if (g_lst_KRSS_Fichajes != null)
                                    {
                                        lst_KRSS_Fichajes_DelDia = g_lst_KRSS_Fichajes.Where(x => x.fechaHora.ToString("dd/MM/yyyy").Equals(new DateTime(int_Anyo, _int_Mes, int_Dia_mes).ToString("dd/MM/yyyy"))).Where(x => x.anulado == null).ToList();

                                        if (lst_KRSS_Fichajes_DelDia != null && lst_KRSS_Fichajes_DelDia.Count > 0)
                                        {
                                            if (lst_KRSS_Fichajes_DelDia.Exists(x => x.validado == null))
                                            {
                                                obj_CTU_P_Incidencias_Dia.Actualizar_color(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_SINVALIDAR);
                                            }
                                            else if (lst_KRSS_Fichajes_DelDia.Exists(x => x.validado == 1))
                                            {
                                                obj_CTU_P_Incidencias_Dia.Actualizar_color(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_VALIDADO_CONINCIDENCIAS);
                                            }
                                            else if (lst_KRSS_Fichajes_DelDia.Exists(x => x.validado == 0))
                                            {
                                                obj_CTU_P_Incidencias_Dia.Actualizar_color(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_VALIDADO_SININCIDENCIAS);
                                            }
                                            else
                                            {
                                                obj_CTU_P_Incidencias_Dia.Actualizar_color(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_SINFICHAJES);
                                            }

                                            if (lst_KRSS_Fichajes_DelDia.Exists(x => x.modificado != null))
                                            {
                                                obj_CTU_P_Incidencias_Dia.Tiene_Modificacion();
                                            }
                                        }
                                        else
                                        {
                                            obj_CTU_P_Incidencias_Dia.Actualizar_color(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_SINFICHAJES);
                                        }
                                    }
                                    else
                                    {
                                        obj_CTU_P_Incidencias_Dia.Actualizar_color(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_SINFICHAJES);
                                    }
                                    bol_Tiene_Jornada = false;
                                    mdl_KRS_JornadasCabecera = null;
                                }
                                else
                                {
                                    if (g_lst_KRSS_Fichajes != null)
                                    {
                                        lst_KRSS_Fichajes_DelDia = g_lst_KRSS_Fichajes.Where(x => x.fechaHora.ToString("dd/MM/yyyy").Equals(new DateTime(int_Anyo, _int_Mes, int_Dia_mes).ToString("dd/MM/yyyy"))).Where(x => x.anulado == null).ToList();

                                        if (lst_KRSS_Fichajes_DelDia != null && lst_KRSS_Fichajes_DelDia.Count > 0)
                                        {

                                            obj_CTU_P_Incidencias_Dia.Actualizar_color(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_SINFICHAJES);
                                            if (obj_CTU_P_Incidencias_Dia.CTU_P_Incidencias_Descripcion.Trim().Length == 0)
                                            {
                                                obj_CTU_P_Incidencias_Dia.CTU_P_Incidencias_Descripcion = Variables_KairosPRO.G_STR_INCIDENCIAS_SIN_JORNADA;
                                            }

                                            if (lst_KRSS_Fichajes_DelDia.Exists(x => x.modificado != null))
                                            {
                                                obj_CTU_P_Incidencias_Dia.Tiene_Modificacion();
                                            }
                                        }
                                    }
                                }


                                int_Dia_mes++;
                            }
                            else
                            {
                                obj_CTU_P_Incidencias_Dia.Actualizar(null,
                                                              int_Dia_mes,
                                                              Variables_KairosPRO.G_INT_CONTROL_INCIDENCIAS_DIA_VALOR_RESTO,
                                                              "",
                                                              "",
                                                              "",
                                                              Funciones.Convertir_Color_Hexadecimal(Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_VACIO),
                                                              "");
                                int_Dia_mes++;
                            }
                        }
                    }
                    else
                    {
                        obj_CTU_P_Incidencias_Dia.Limpiar();
                    }
                    int_Contador++;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Incidencias_Controladora) + "/" + nameof(Actualizar_Calendario));
            }
        }
        #endregion

        #region Metodo Abrir Fichajes
        public void Abrir_Fichajes(int _int_NumeroObjeto)
        {
            try
            {
                if (g_frm_P_Incidencias.Exferia_DataGridView_Empleados.Rows != null &&
                    g_frm_P_Incidencias.Exferia_DataGridView_Empleados.SelectedRows.Count > 0)
                {
                    if ((Datos_Generales.Permisos_Comprobar(Variables.G_STR_OPCION_OTROS_KRSS_INCIDENCIAS, g_frm_P_Incidencias.g_lst_INTERNO_Permisos_Modelo, (int)G_ENUM_PERMISOS.Modificar, true)))
                    {
                        INTERNO_OpcionesDetalle_Modelo mdl_INTERNO_OpcionesDetalle_Modelo = Datos_Generales.PRV_Opciones_Buscar_Detalles(Variables.G_STR_OPCION_KRSS_FICHAJES);

                        int int_Mes = g_frm_P_Incidencias.Exferia_DateTimePicker_Meses.Exferia_DateTimePicker_Mes;
                        int int_Anyo = Convert.ToInt32(g_frm_P_Incidencias.Exferia_NumericUpDown_Anyo.Exferia_NumericUpDown_Value);

                        if (_int_NumeroObjeto > 0)
                        {
                            object[] arr_ObjetosDevueltos_Fichajes= Funciones_KairosPRO.Obtener_Fichajes_PorEmpleadoJornada_Dia(g_mdl_INTERNO_KRS_Empleados_Modelo,
                                                                                        g_lst_KRSS_Fichajes,
                                                                                        g_lst_KRS_DiasFestivos,
                                                                                        int_Anyo,
                                                                                        int_Mes,
                                                                                        _int_NumeroObjeto);

                            object[] arr_ObjetosDevueltos_Pausas = Funciones_KairosPRO.Obtener_Pausas_PorEmpleadoJornada_Dia(g_mdl_INTERNO_KRS_Empleados_Modelo,
                                                                                                                            g_lst_KRSS_Pausas,
                                                                                                                            g_lst_KRS_DiasFestivos,
                                                                                                                            int_Anyo,
                                                                                                                            int_Mes,
                                                                                                                            _int_NumeroObjeto);


                            //Abrir Fichajes
                            P_Fichajes frm_P_Fichajes = new P_Fichajes(g_frm_P_Incidencias.P_Base_ValoresGenerales,
                                                                                                    g_frm_P_Incidencias.P_Base_FechaTrabajo,
                                                                                                    mdl_INTERNO_OpcionesDetalle_Modelo,
                                                                                                    ((KRS_JornadasCabecera)arr_ObjetosDevueltos_Fichajes[1]),
                                                                                                    ((List<KRSS_Fichajes>)arr_ObjetosDevueltos_Fichajes[0]),
                                                                                                    ((List<KRSS_Pausas>)arr_ObjetosDevueltos_Pausas[0]),
                                                                                                    g_mdl_INTERNO_KRS_Empleados_Modelo.nombre,
                                                                                                    new DateTime(int_Anyo, int_Mes, _int_NumeroObjeto, 0, 0, 0),
                                                                                                    g_mdl_INTERNO_KRS_Empleados_Modelo,
                                                                                                    g_lst_KRS_DiasFestivos,
                                                                                                    false);
                            //Se llamo desde una pantalla
                            frm_P_Fichajes.P_Base_TipoAperturaPantalla = 1;
                            frm_P_Fichajes.P_Base_PantallaPadre_IdentificadorTAG = g_frm_P_Incidencias.Tag.ToString();
                            frm_P_Fichajes.P_Base_PantallaOrigen = g_frm_P_Incidencias;
                            frm_P_Fichajes.P_Base_TituloPantalla_CaminoHormigas = mdl_INTERNO_OpcionesDetalle_Modelo.camposMostrar_TituloMantenimiento + g_mdl_INTERNO_KRS_Empleados_Modelo.nombre;

                            Funciones_PanelPrincipal.Cargar_PantallaEmpotrada(frm_P_Fichajes, Variables.G_STR_OPCION_OTROS_KRSS_INCIDENCIAS);
                        }
                        
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message,ex,nameof(P_Incidencias_Controladora)+"/"+nameof(Abrir_Fichajes));
            }
        }
        #endregion
    }
}
