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._4_Vistas.Listados;
using Exferia_KairosPRO.General;
using Exferia_KairosPRO_EF;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Transactions;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_KairosPRO._4_Vistas.Controladoras
{
    public class P_Empleados_Controladora
    {
        #region Variables Generales
        private P_Empleado g_frm_P_Empleados = null;//Variables que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        //Clases de Negocio necesarias para la carga de datos
        private KRS_Empleados_Datos g_obj_KRS_Empleados_Datos = new KRS_Empleados_Datos();
        private KRS_EmpleadosFotos_Datos g_obj_KRS_EmpleadosFotos_Datos = new KRS_EmpleadosFotos_Datos();
        private KRS_Empleados_ClavesTemporales_Datos g_obj_KRS_Empleados_ClavesTemporales_Datos = new KRS_Empleados_ClavesTemporales_Datos();
        private KRS_Ejercicios_PerfilesCabecera_Datos g_obj_KRS_Ejercicios_PerfilesCabecera_Datos = new KRS_Ejercicios_PerfilesCabecera_Datos();
        private KRS_Terminales_Datos g_obj_KRS_Terminales_Datos = new KRS_Terminales_Datos();
        private TMP_Empleados_ObtencionHuellasDactilares_Datos g_obj_TMP_Empleados_ObtencionHuellasDactilares_Datos = new TMP_Empleados_ObtencionHuellasDactilares_Datos();
        private KRS_Empleados_TraspasoBiometria_Datos g_obj_KRS_Empleados_TraspasoBiometria_Datos = new KRS_Empleados_TraspasoBiometria_Datos();
        private KRS_Empleados_Contratos_Datos g_obj_KRS_Empleados_Contratos_Datos = new KRS_Empleados_Contratos_Datos();

        //Modelos
        public KRS_Empleados g_mdl_KRS_Empleados = null;//Modelo de los datos cargados
        private KRS_EmpleadosFotos g_mdl_KRS_EmpleadosFotos = null;//Modelo de las fotos de los empleados

        //CALENDARIO
        private KRS_DiasFestivos_Datos g_obj_KRS_DiasFestivos_Datos = new KRS_DiasFestivos_Datos();
        private KRS_AusenciasProgramadas_Datos g_obj_KRS_AusenciasProgramadas_Datos = new KRS_AusenciasProgramadas_Datos();
        private KRS_PresenciasProgramadas_Datos g_obj_KRS_PresenciasProgramadas_Datos = new KRS_PresenciasProgramadas_Datos();
        private KRS_PerfilesCabecera_Datos g_obj_KRS_PerfilesCabecera_Datos = new KRS_PerfilesCabecera_Datos();

        private List<KRS_PresenciasProgramadas> g_lst_KRS_PresenciasProgramadas = null;
        private List<KRS_AusenciasProgramadas> g_lst_KRS_AusenciasProgramadas = null;
        private List<KRS_DiasFestivos> g_lst_KRS_DiasFestivos = null;
        private KRS_PerfilesCabecera g_mdl_KRS_PerfilesCabeceras = null;
        public List<KRS_Terminales> g_lst_KRS_Terminales = null;

        public Dictionary<DateTime, INTERNO_AUX_Calendario_Modelo> g_dct_ValoresTag_Calendario = new Dictionary<DateTime, INTERNO_AUX_Calendario_Modelo>();
        private BackgroundWorker g_TareaAsincrona_Rellenar_Calendario;
        public bool g_bol_CargarCalendario = true;

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

        //Tareea Asincrona de carga de datos
        public BackgroundWorker g_obj_TareaAsincrona_CargarDatos;
        private bool g_bol_Cancelar_TareaAsincrona_CargarDatos = false;

        //Tarea Asincrona de grabar de datos
        public BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        public bool g_bol_GrabarDatos_TerminoCorrectamente = true;
        private bool g_bol_GrabarDatos_Recargardatos = false;

        //Tarea Asincrona de Grabar ObtencionHuellasDactilares
        private BackgroundWorker g_obj_TareaAsincrona_Grabar_ObtencionHuellasDactilares;

        //Tarea Asincrona de Grabar SicronizarDispositivoBiometrico
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico;

        //Array de imagen
        public byte[] g_arr_Foto_Empleado;
        public Image g_img_Foto_Empleado;

        //Claves_Temporales
        private BackgroundWorker g_TareaAsincrona_Rellenar_Listado_ClavesTemporales;
        private List<KRS_Empleados_ClavesTemporales> g_lst_KRS_Empleados_ClavesTemporales = null;
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales;

        public GEN_EjerciciosActivos_Empresa g_mdl_GEN_EjerciciosActivos_Empresa = null;

        //Variables para la creacion de las Lineas ##############
        private int g_int_EjerciciosPerfiles_PosicionY = 5;
        private int g_int_NumeroEjerciciosPerfiles = 0;
        private List<int> g_Array_ListadoEjerciciosPerfiles = new List<int>();

        //Listados Estaticos, para cargar y buscar en los combos 
        private List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_USOSHORARIOS = new List<INTERNO_ComboBox_Modelo>();
        private List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_ProgramaExterno = new List<INTERNO_ComboBox_Modelo>();

        #region Contratos

        //Listado
        public List<KRS_Empleados_Contratos> g_lst_KRS_Empleados_Contratos = null;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_ABS_Listado_KRS_Empleados_Contratos;

        //Filtrado del listado
        public List<string> g_lst_ColumnasAMostrar_Contratos = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Contratos = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_Contratos = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Contratos = 0;
        private int g_int_TotalRegistros_Contratos = 0;

        //Tareea Asincrona de borrar de datos 
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_Contratos;

        //Tarea Asincrona para la Rellenar DataGridView 
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Contratos;
        #endregion
        #endregion

        #region Constructor
        public P_Empleados_Controladora( P_Empleado _frm_P_Empleados)
        {
            g_frm_P_Empleados = _frm_P_Empleados;

            g_bol_Termino_CargaDatos_Inicial = true;

            g_obj_ABS_Listado_Contratos = new ABS_Listado_KRS_Empleados_Contratos();

            Cargar_Combos();
        }
        #endregion

        #region Datos Por Defecto
        public void Datos_PorDefecto()
        {
            //Ejercicio por defecto
            g_mdl_GEN_EjerciciosActivos_Empresa = g_frm_P_Empleados.P_Base_ValoresGenerales.EjercicioActivo;

            //Obtener le Listado de terminales
            Obtener_Terminales();
            CargarTerminales_EnCheckBoxList();

            g_frm_P_Empleados.P_Base_SeModificoDatosPantalla = false;

            Rellenar_ArbolSecundarioSeleccion();
        }

        private void Rellenar_ArbolSecundarioSeleccion()
        {
            try
            {
                List<INTERNO_ArbolSecundarioSeleccion_Modelo> lst_INTERNO_ArbolSecundarioSeleccion_Modelo = new List<INTERNO_ArbolSecundarioSeleccion_Modelo>();

                //Empleado Kairos
                lst_INTERNO_ArbolSecundarioSeleccion_Modelo.AddRange(Variables.G_LST_ARBOLSECUNDARIOSELECCION_EMPLEADO_KAIROS);

                //Cargar los valores
                g_frm_P_Empleados.Exferia_ArbolSecundarioSeleccion_Empleado.Cargar(lst_INTERNO_ArbolSecundarioSeleccion_Modelo, g_frm_P_Empleados.P_Base_ValoresGenerales, g_frm_P_Empleados.P_Base_FechaTrabajo, g_frm_P_Empleados);

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

        #endregion

        #region Cargar datos de los comboBox
        private void Cargar_Combos()
        {
            //Usos Horarios ...........................................................................
            foreach (TimeZoneInfo obj_TimeZoneInfo in TimeZoneInfo.GetSystemTimeZones())
            {
                g_lst_INTERNO_ComboBox_Modelo_USOSHORARIOS.Add(new INTERNO_ComboBox_Modelo(obj_TimeZoneInfo.Id.ToString(), obj_TimeZoneInfo.DisplayName, null));
            }
            
            g_frm_P_Empleados.Exferia_ComboBox_UsosHorarios.Items.Clear();
            g_frm_P_Empleados.Exferia_ComboBox_UsosHorarios.DataSource = g_lst_INTERNO_ComboBox_Modelo_USOSHORARIOS;
            g_frm_P_Empleados.Exferia_ComboBox_UsosHorarios.SelectedIndex = 0;
            //............................................................................................

            // Exferia_ComboBox_AlbaranValorado
            g_lst_INTERNO_ComboBox_Modelo_ProgramaExterno = ListadosEstaticos.Devolver_ProgramaExterno();
            if (g_lst_INTERNO_ComboBox_Modelo_ProgramaExterno != null)
            {
                g_frm_P_Empleados.Exferia_ComboBox_ProgramaExterno_Descripcion.Items.Clear();
                g_frm_P_Empleados.Exferia_ComboBox_ProgramaExterno_Descripcion.DataSource = g_lst_INTERNO_ComboBox_Modelo_ProgramaExterno;
                g_frm_P_Empleados.Exferia_ComboBox_ProgramaExterno_Descripcion.SelectedIndex = 0;
            }
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //codigoValidacion
            g_frm_P_Empleados.Exferia_TextBox_CodigoValidacion.Text = "";

            //pin
            g_frm_P_Empleados.Exferia_TextBox_Pin.Text = "";

            //ClaveAccesoIntranet
            g_frm_P_Empleados.Exferia_TextBox_ClaveAccesoIntranet.Text = "";

            //tecnico
            g_frm_P_Empleados.Exferia_CheckBox_Tecnico.Checked = false;

            //sacarFotoFichaje
            g_frm_P_Empleados.Exferia_CheckBox_SacarFotoFichaje.Checked = false;

            //id
            g_frm_P_Empleados.Exferia_Label_ID.Text = "";

            //nombre
            g_frm_P_Empleados.Label_NombreRelleno.Text = "";

            //departamento
            g_frm_P_Empleados.Label_Departamento.Text = "";

            //email
            g_frm_P_Empleados.Label_Email.Text = "";

            //numeroTarjeta
            g_frm_P_Empleados.Exferia_TextBox_NumeroTarjeta.Text = "";

            //permiteRecordatorio
            g_frm_P_Empleados.Exferia_CheckBox_PermiteRecordatorio.Checked = false;

            //permiteFichajeAutomatico
            g_frm_P_Empleados.Exferia_CheckBox_PermiteFichajeAutomatico.Checked = false;

            //permiteFichajeWeb
            g_frm_P_Empleados.Exferia_CheckBox_PermiteFichajeWeb.Checked = false;

            //foto
            g_img_Foto_Empleado = null;
            g_frm_P_Empleados.PictureBox_Foto_Empleado.Image = g_img_Foto_Empleado;

            //fechaAlta
            g_frm_P_Empleados.Exferia_FechaSeleccion_FechaAlta.Exferia_FechaSeleccion_Fecha = "";

            //fechaBaja
            g_frm_P_Empleados.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha = "";

            // idDepartamento
            g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Id = -1;
            g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Codigo = "";
            g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Descripcion = "";
            g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_FechaBorrado = null;

            //Vaciar Huella del Empleado
            g_frm_P_Empleados.CTU_Huellas.Vaciar_Huellas();

            //Vaciar los terminales para sincrpnizcion del dispositivo biometrico
            for (int int_Contador = 0; int_Contador < g_frm_P_Empleados.Exferia_CheckListBox_Terminales.Items.Count; int_Contador++)
            { g_frm_P_Empleados.Exferia_CheckListBox_Terminales.SetItemChecked(int_Contador, false); }

            //EjericiciosPerfiles
            g_frm_P_Empleados.Exferia_Panel_Degradado_Perfiles.Controls.Clear();
            g_int_EjerciciosPerfiles_PosicionY = 5;
            g_int_NumeroEjerciciosPerfiles = 0;
            g_Array_ListadoEjerciciosPerfiles.Clear();

            //Contratos
            g_lst_KRS_Empleados_Contratos = null;
            g_int_TotalRegistrosInsertados_Contratos = 0;
            g_int_TotalRegistros_Contratos = 0;
            g_frm_P_Empleados.Exferia_DataGridView_Contratos.Rows.Clear();
            g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Contratos;
            g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Contratos;

            //Claves
            g_lst_KRS_Empleados_ClavesTemporales = null;
            g_frm_P_Empleados.Exferia_DataGridView_Claves.Rows.Clear();

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_Empleados.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_Empleados.P_Base_TituloPantalla = (g_frm_P_Empleados.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
            }

            //Actualizar el Boton de Seleccion de pantalla ####################################################
            Variables.G_EMS_CONTROL_MENUSUPERIOR.Update_Texto_NombrePantalla(g_frm_P_Empleados.Tag.ToString());
            //#################################################################################################

            g_mdl_KRS_Empleados = null;
        }
        #endregion

        #region Comprobacion de cambios, para  grabar o no antes de salir o cambiar de registro
        public bool ComprobarCambios()
        {
            if (g_frm_P_Empleados.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(false);

                    //Te quedas espernado a que termine la tarea asincrona de grabar
                    while (g_obj_TareaAsincrona_GrabarDatos.IsBusy)
                        Application.DoEvents();

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        #endregion

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Empleados.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos != null)
                {
                    g_bol_Cancelar_TareaAsincrona_CargarDatos = true;

                    while (g_obj_TareaAsincrona_CargarDatos.IsBusy)
                        Application.DoEvents();

                    //Vaciar
                    VaciarDatos();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_CargarDatos_ProgressChanged);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = true;
                }

                g_bol_Cancelar_TareaAsincrona_CargarDatos = false;

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Empleados.Enabled = true;

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

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Empleados_Controladora) + "/" + nameof(RecargarDatos), true);
            }
        }
        private void TareaAsincrona_CargarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                // Cargar Valores
                if (CargarDatos(g_frm_P_Empleados.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
                else
                {
                    if (g_mdl_KRS_Empleados != null)
                    {
                        //Claves
                        if (g_mdl_KRS_Empleados.KRS_Empleados_ClavesTemporales != null && g_mdl_KRS_Empleados.KRS_Empleados_ClavesTemporales.Count > 0)
                        {
                            g_lst_KRS_Empleados_ClavesTemporales = g_mdl_KRS_Empleados.KRS_Empleados_ClavesTemporales.ToList();

                            DataGridViewRow obj_DataGridViewRow;
                            foreach (KRS_Empleados_ClavesTemporales mdl_KRS_Empleados_ClavesTemporales in g_lst_KRS_Empleados_ClavesTemporales)
                            {
                                //Se cancelo la tarea asincrona #######################
                                if (g_bol_Cancelar_TareaAsincrona_CargarDatos)
                                {
                                    return;
                                }

                                //Añadir File con Columnas ...............................
                                obj_DataGridViewRow = Transformar_Modelo_A_Row_ClavesTemporales(mdl_KRS_Empleados_ClavesTemporales, null);

                                ((BackgroundWorker)sender).ReportProgress(1, obj_DataGridViewRow);

                                //Application.DoEvents();
                                Thread.Sleep(5);
                            }
                        }

                        //Ejercicio/Perfiles
                        if (g_frm_P_Empleados.P_Base_ValoresGenerales.Ejercicios_Listado!=null)
                        {
                            foreach (GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa in g_frm_P_Empleados.P_Base_ValoresGenerales.Ejercicios_Listado.OrderByDescending(m => m.anioControl))
                            {
                                List<object> lst_Objetos = new List<object>();
                                lst_Objetos.Add(mdl_GEN_EjerciciosActivos_Empresa);
                                lst_Objetos.Add(null);

                                //BUscar si tuviera PerfilCabecera Relacionado para este Ejercicio
                                if (g_mdl_KRS_Empleados.KRS_Ejercicios_PerfilesCabecera!=null && g_mdl_KRS_Empleados.KRS_Ejercicios_PerfilesCabecera.Count > 0)
                                {
                                    lst_Objetos [1]= g_mdl_KRS_Empleados.KRS_Ejercicios_PerfilesCabecera.Where(m => m.idEjercicio.Equals(mdl_GEN_EjerciciosActivos_Empresa.id)).FirstOrDefault();
                                }

                                ((BackgroundWorker)sender).ReportProgress(2, lst_Objetos);
                            }
                        }

                        //Contratos
                        if (g_mdl_KRS_Empleados.KRS_Empleados_Contratos != null && g_mdl_KRS_Empleados.KRS_Empleados_Contratos.Count > 0)
                        {
                            g_lst_KRS_Empleados_Contratos = g_mdl_KRS_Empleados.KRS_Empleados_Contratos.ToList();

                            DataGridViewRow obj_DataGridViewRow;
                            foreach (KRS_Empleados_Contratos mdl_KRS_Empleados_Contratos in g_lst_KRS_Empleados_Contratos)
                            {
                                //Se cancelo la tarea asincrona #######################
                                if (g_bol_Cancelar_TareaAsincrona_CargarDatos)
                                {
                                    return;
                                }

                                //Añadir File con Columnas ...............................
                                obj_DataGridViewRow = Transformar_Modelo_A_Row_Contratos(mdl_KRS_Empleados_Contratos, null);

                                ((BackgroundWorker)sender).ReportProgress(3, obj_DataGridViewRow);

                                //Application.DoEvents();
                                Thread.Sleep(5);
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_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_Empleados_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_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_CargarDatos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Claves
                if (e.ProgressPercentage == 1)
                {
                    DataGridViewRow dgvr_Fila = (DataGridViewRow)e.UserState;

                    g_frm_P_Empleados.Exferia_DataGridView_Claves.Rows.Add(dgvr_Fila);
                }
                //EjerciciosPerfiles
                else if (e.ProgressPercentage == 2)
                {
                    List<object> lst_Objetos = (List<object>)e.UserState;

                    Crear_PerfilEjercicio((GEN_EjerciciosActivos_Empresa)lst_Objetos[0], (KRS_Ejercicios_PerfilesCabecera)lst_Objetos[1]);
                }
                //Contratos
                else if (e.ProgressPercentage == 3)
                {
                    DataGridViewRow dgvr_Fila = (DataGridViewRow)e.UserState;

                    g_frm_P_Empleados.Exferia_DataGridView_Contratos.Rows.Add(dgvr_Fila);
                }

            }
            catch (Exception ex)
            {

                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_ProgressChanged));
            }
        }
        private void TareaAsincrona_CargarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear el Formulario
            g_frm_P_Empleados.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_Empleados.Salir_P_Base();
                    }
                }
                else
                {
                    //Foto del Empleado
                    if (g_img_Foto_Empleado != null)
                    {
                        g_frm_P_Empleados.PictureBox_Foto_Empleado.Image = g_img_Foto_Empleado;
                        Funciones.PictureBox_RedimencionarImagen(g_frm_P_Empleados.PictureBox_Foto_Empleado, g_frm_P_Empleados.PictureBox_Foto_Empleado.Image);
                    }

                    //Actualizar Huella del Empleado
                    if (g_mdl_KRS_Empleados.KRS_Empleados_Huellas != null)
                    {
                        g_frm_P_Empleados.CTU_Huellas.Actualizar_Huellas(g_mdl_KRS_Empleados.KRS_Empleados_Huellas.FirstOrDefault());
                    }

                    //Actualizar el listado de terminales para traspasar
                    if (g_mdl_KRS_Empleados.KRS_Empleados_TraspasoBiometria != null && g_mdl_KRS_Empleados.KRS_Empleados_TraspasoBiometria.Count > 0)
                    {
                        ActualizarTerminales_EnCheckBoxList(g_mdl_KRS_Empleados.KRS_Empleados_TraspasoBiometria.ToList());
                    }

                    //Recargar listado arbolsecundario
                    g_frm_P_Empleados.Exferia_ArbolSecundarioSeleccion_Empleado.RecargarSeleccionNodo();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Empleados.Salir_P_Base();
            }
            finally
            {
               
                //Hacemos foco al primer control.
                g_frm_P_Empleados.Exferia_TextBox_CodigoValidacion.Exferia_TextBox_Foco();
            }
        }

        public bool CargarDatos(long _lng_id)
        {
            bool bol_ValorDevuelto = true;

            try
            {
                //Obtenemos los datos necesarios del Empleado de Maestro
                MAE_Empleados mdl_MAE_Empleados = new MAE_Empleados();

                //Buscamos el departamento para poder añadirlo
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEEMPLEADOS_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { _lng_id };

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_MAE_Empleados = (MAE_Empleados)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                //##################################################################################################################################################################################################                    

                //Buscamos tambien la foto del empleado para mostrarla
                g_mdl_KRS_EmpleadosFotos = g_obj_KRS_EmpleadosFotos_Datos.Obtener(_lng_id);
                g_mdl_KRS_Empleados = g_obj_KRS_Empleados_Datos.Obtener(_lng_id);

                //Obtenemos el listado de Empleados del ERP 
                if (g_mdl_KRS_Empleados != null)
                {
                    //Paginador ................................................................................
                    if (g_frm_P_Empleados.P_Base_PantallaOrigen != null &&
                        g_frm_P_Empleados.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                        g_frm_P_Empleados.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_KRS_Empleados.id;
                        int int_PaginaDelObjeto = g_frm_P_Empleados.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_Empleados.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

                        g_frm_P_Empleados.g_obj_Funciones_Paginador.SetPaginaActual(int_PaginaDelObjeto);
                        // Asignando al paginador la pagina actual.
                        g_frm_P_Empleados.Exferia_Paginador_Empleados.PaginaActual = g_frm_P_Empleados.g_obj_Funciones_Paginador.GetPaginaActual();
                    }
                    //...........................................................................................

                    //ArbolSecundarioSeleccion Identificadores Necesarios .......................................
                    //idCliente
                    g_frm_P_Empleados.Exferia_ArbolSecundarioSeleccion_Empleado.Exferia_ArbolSecundarioSeleccion_IDEMPLEADO_KAIROS = g_mdl_KRS_Empleados.id;
                    // .........................................................................................

                    g_frm_P_Empleados.Exferia_Label_ID.Text = g_mdl_KRS_Empleados.id.ToString();

                    //departamento
                    if (g_mdl_KRS_Empleados.KRS_Departamentos != null)
                    {
                        g_frm_P_Empleados.Label_Departamento.Text = "(" + g_mdl_KRS_Empleados.KRS_Departamentos.codigo + ") " + g_mdl_KRS_Empleados.KRS_Departamentos.descripcion;
                    }
                    
                    //codigoValidacion
                    g_frm_P_Empleados.Exferia_TextBox_CodigoValidacion.Text = g_mdl_KRS_Empleados.codigoValidacion;

                    //pin
                    g_frm_P_Empleados.Exferia_TextBox_Pin.Text = g_mdl_KRS_Empleados.pin.ToString();

                    //claveAccesoWeb
                    g_frm_P_Empleados.Exferia_TextBox_ClaveAccesoIntranet.Text = g_mdl_KRS_Empleados.claveAccesoWeb;

                    //nombre
                    g_frm_P_Empleados.Label_NombreRelleno.Text = g_mdl_KRS_Empleados.nombre;

                    //numeroTarjeta
                    g_frm_P_Empleados.Exferia_TextBox_NumeroTarjeta.Text = g_mdl_KRS_Empleados.numeroTarjetaFichaje;

                    //email
                    g_frm_P_Empleados.Label_Email.Text = g_mdl_KRS_Empleados.email != null ? g_mdl_KRS_Empleados.email : "";

                    //ComboBox
                    g_frm_P_Empleados.Exferia_ComboBox_UsosHorarios.SelectedItem = g_lst_INTERNO_ComboBox_Modelo_USOSHORARIOS.Where(m => m.Identificador.Equals(g_mdl_KRS_Empleados.usoHorario)).FirstOrDefault();

                    //tecnico
                    g_frm_P_Empleados.Exferia_CheckBox_Tecnico.Checked = g_mdl_KRS_Empleados.tecnico != null ? g_mdl_KRS_Empleados.tecnico.Value : false;

                    //permiteRecordatorio
                    g_frm_P_Empleados.Exferia_CheckBox_PermiteRecordatorio.Checked = g_mdl_KRS_Empleados.permiteRecordatorio != null ? g_mdl_KRS_Empleados.permiteRecordatorio.Value : false;

                    //permiteFichajeAutomatico
                    g_frm_P_Empleados.Exferia_CheckBox_PermiteFichajeAutomatico.Checked = g_mdl_KRS_Empleados.permiteFichajeAutomatico != null ? g_mdl_KRS_Empleados.permiteFichajeAutomatico.Value : false;

                    //permiteFichajeWeb
                    g_frm_P_Empleados.Exferia_CheckBox_PermiteFichajeWeb.Checked = g_mdl_KRS_Empleados.permiteFichajeWeb != null ? g_mdl_KRS_Empleados.permiteFichajeWeb.Value : false;

                    //idEmpresa_FichajeAutomatico
                    if (g_mdl_KRS_Empleados.idEmpresa_FichajeAutomatico!=null)
                    {
                        GEN_Empresas mdl_GEN_Empresas= Datos_Generales.GEN_Empresas_Obtener_Modelo_Por_Id(g_mdl_KRS_Empleados.idEmpresa_FichajeAutomatico.Value);
                        if (mdl_GEN_Empresas!=null)
                        {
                            g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Id = mdl_GEN_Empresas.id;
                            g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Codigo = mdl_GEN_Empresas.codigo;
                            g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Descripcion = mdl_GEN_Empresas.descripcion;
                            g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_FechaBorrado = mdl_GEN_Empresas.fechaBorrado;
                        }
                    }

                    //sacarFoto
                    g_frm_P_Empleados.Exferia_CheckBox_SacarFotoFichaje.Checked = g_mdl_KRS_Empleados.sacarFotoFichaje;

                    //FechaBaja
                    if (g_mdl_KRS_Empleados.fechaBaja != null)
                    {
                        g_frm_P_Empleados.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha = g_mdl_KRS_Empleados.fechaBaja.Value.ToString("dd/MM/yyyy");
                    }

                    //FechaAlta
                    if(mdl_MAE_Empleados.fechaAlta != null)
                    {
                        g_frm_P_Empleados.Exferia_FechaSeleccion_FechaAlta.Exferia_FechaSeleccion_Fecha = mdl_MAE_Empleados.fechaAlta.ToString("dd/MM/yyyy");
                    }

                    //ProgramaExterno_IdEmpleado
                    g_frm_P_Empleados.Exferia_TextBox_ProgramaExterno_IdEmpleado.Text = g_mdl_KRS_Empleados.programaExterno_idEmpleado;

                    //ProgramaExterno_Descripcion
                    INTERNO_ComboBox_Modelo mdl_ProgramaExterno_Descripcion_INTERNO_ComboBox_Modelo = null;
                    if (g_mdl_KRS_Empleados.programaExterno_descripcion != null &&
                        g_mdl_KRS_Empleados.programaExterno_descripcion.Trim().Length > 0)
                    {
                        mdl_ProgramaExterno_Descripcion_INTERNO_ComboBox_Modelo = g_lst_INTERNO_ComboBox_Modelo_ProgramaExterno.Where(m => m.Descripcion.Equals(g_mdl_KRS_Empleados.programaExterno_descripcion)).FirstOrDefault();
                        if (mdl_ProgramaExterno_Descripcion_INTERNO_ComboBox_Modelo != null)
                        {
                            g_frm_P_Empleados.Exferia_ComboBox_ProgramaExterno_Descripcion.SelectedItem = mdl_ProgramaExterno_Descripcion_INTERNO_ComboBox_Modelo;
                        }
                    }

                    //PictureBox
                    if (g_mdl_KRS_EmpleadosFotos != null)
                    {
                        if (g_mdl_KRS_EmpleadosFotos.foto != null)
                        {
                            g_arr_Foto_Empleado = g_mdl_KRS_EmpleadosFotos.foto;
                            g_img_Foto_Empleado = Funciones.Convertir_Arraybytes_Image(g_mdl_KRS_EmpleadosFotos.foto);
                        }
                    }

                    //idHoraExtraCabecera
                    if (g_mdl_KRS_Empleados.KRS_HorasExtrasCabecera!=null)
                    {
                        g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Id = g_mdl_KRS_Empleados.KRS_HorasExtrasCabecera.id;
                        g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Codigo = g_mdl_KRS_Empleados.KRS_HorasExtrasCabecera.codigo;
                        g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Descripcion = g_mdl_KRS_Empleados.KRS_HorasExtrasCabecera.descripcion;
                        g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_FechaBorrado = g_mdl_KRS_Empleados.KRS_HorasExtrasCabecera.fechaBorrado;
                    }

                    //Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior_Codigo = "";
                    if (g_frm_P_Empleados.g_mdl_PRV_OpcionesDetalle != null &&
                       g_frm_P_Empleados.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                       g_frm_P_Empleados.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de campos
                        string[] arr_Campos = g_frm_P_Empleados.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Split(new Char[] { ',' });
                        string str_ValorAMostrarFinal = "";

                        string[] str_Separador = new string[] { " [" };
                        //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
                        if (g_frm_P_Empleados.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_Empleados.P_Base_TituloPantalla = (g_frm_P_Empleados.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

                        dynamic dnm_Objeto = g_mdl_KRS_Empleados;
                        foreach (string str_campo in arr_Campos)
                        {
                            var Valor = dnm_Objeto.GetType().GetProperty(str_campo).GetValue(dnm_Objeto, null);
                            if (Valor != null)
                            {
                                str_ValorAMostrarFinal += " " + Valor;
                            }

                            //Codigo
                            if (str_campo.Equals(nameof(g_mdl_KRS_Empleados.nombre)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_KRS_Empleados.nombre;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Empleados.P_Base_TituloPantalla += " [" + str_ValorAMostrarFinal + "] - Modificar";
                        }
                    }

                    //Actualizar el Boton de Seleccion de pantalla ####################################################
                    Variables.G_EMS_CONTROL_MENUSUPERIOR.Add_Texto_NombrePantalla_Descripciones(g_frm_P_Empleados.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

                    g_frm_P_Empleados.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex,nameof(P_Empleados_Controladora) + "/" + nameof(CargarDatos));
            }

            return bol_ValorDevuelto; 
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_GrabarDatos_Recargardatos)
        {
            try
            {
                g_bol_GrabarDatos_Recargardatos = _bol_GrabarDatos_Recargardatos;

                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_Empleados.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                g_obj_TareaAsincrona_GrabarDatos = new BackgroundWorker();
                g_obj_TareaAsincrona_GrabarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_GrabarDatos_DoWork);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_GrabarDatos_Completed);
                g_obj_TareaAsincrona_GrabarDatos.RunWorkerAsync();

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_bol_GrabarDatos_TerminoCorrectamente = false;
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Empleados.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(GrabarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_GrabarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Validar Primero
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = ValidarDatos();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo = GrabarDatos_Final();
                }
                else
                {
                    mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Empleados.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)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);

                        //Poner el Foco en el objeto que tuvoel problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_Empleados, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    //Devolver al Listado el Row Añadido/ Modificado
                    if (g_frm_P_Empleados.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Empleados.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Empleados.P_Base_F3Origen != null)
                    {
                        g_frm_P_Empleados.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    if (g_bol_GrabarDatos_Recargardatos)
                    {
                        RecargarDatos();
                    }
                 }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Si el codigo Validacion esta vacio
                if(g_frm_P_Empleados.Exferia_TextBox_CodigoValidacion.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empleados.Exferia_Label_CodigoValidacion.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empleados.Exferia_TextBox_CodigoValidacion;   
                }
                else
                {
                    //Comprobamos que no este repetido el codigo de validacion
                    mdl_ValorDevuelto_Modelo = g_obj_KRS_Empleados_Datos.Buscar_CodigoValidacion_Repetido(g_frm_P_Empleados.Exferia_TextBox_CodigoValidacion.Text, g_frm_P_Empleados.P_Base_id);

                    if(mdl_ValorDevuelto_Modelo.TodoCorrecto == false)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = mdl_ValorDevuelto_Modelo.Mensaje;
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empleados.Exferia_TextBox_CodigoValidacion;
                    }
                }

                //Si el pin esta vacio
                if (g_frm_P_Empleados.Exferia_TextBox_Pin.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empleados.Exferia_Label_CodigoValidacion.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empleados.Exferia_TextBox_Pin;
                }

                // La fecha de baja, si no esta vacio, debe ser correcta. (mensaje de vacio se queda vacio para que no controle el error)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_Empleados.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));
                    if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_Empleados.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empleados.Exferia_FechaSeleccion_FechaBaja;
                    }
                }

                //Validar EjercicioPerfilCabecera
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    CTU_P_Empleado_PerfilEjercicio obj_CTU_P_Empleado_PerfilEjercicio = null;
                    int int_Contador_Lineas = 0;
                    foreach (int int_ValorLinea in g_Array_ListadoEjerciciosPerfiles)
                    {
                        obj_CTU_P_Empleado_PerfilEjercicio = (CTU_P_Empleado_PerfilEjercicio)g_frm_P_Empleados.Exferia_Panel_Degradado_Perfiles.Controls.Find("controlusuario_CTU_P_Empleado_PerfilEjercicio" + int_ValorLinea, true).FirstOrDefault();

                        if (obj_CTU_P_Empleado_PerfilEjercicio != null)
                        {
                            // Si hay PerfilCabecera validar que es Correcta
                            if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (obj_CTU_P_Empleado_PerfilEjercicio.CTU_P_Empleado_PerfilEjercicio_Control_Perfil.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                                obj_CTU_P_Empleado_PerfilEjercicio.CTU_P_Empleado_PerfilEjercicio_Control_Perfil.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && obj_CTU_P_Empleado_PerfilEjercicio.CTU_P_Empleado_PerfilEjercicio_Control_Perfil.Exferia_F3_SoloSeleccion_Id == -1)
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(obj_CTU_P_Empleado_PerfilEjercicio.CTU_P_Empleado_PerfilEjercicio_Control_Perfil.Exferia_F3_SoloSeleccion_Titulo);
                                mdl_ValorDevuelto_Modelo.Objeto = obj_CTU_P_Empleado_PerfilEjercicio.CTU_P_Empleado_PerfilEjercicio_Control_Perfil.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                            }

                            int_Contador_Lineas += 1;
                            //....................................................................................................................................
                        }
                    }
                }


                //Si tiene fichaje automatico tiene que tener una empresa seleccionada
                if (g_frm_P_Empleados.Exferia_CheckBox_PermiteFichajeAutomatico.Checked)
                {
                    // La Empresa no puede estar Vacio (Obligatorio)
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                        g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length == 0)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Titulo);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                    }

                    // Si hay Empresa validar que es Correcta
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                        g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Id == -1)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Titulo);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                    }
                }

                //Si tiene un ProgramaExterno IdEmpleado tiene que tener un porgrama seleccioando
                if(g_frm_P_Empleados.Exferia_TextBox_ProgramaExterno_IdEmpleado.Text.Trim().Length > 0 ||
                   !((INTERNO_ComboBox_Modelo)g_frm_P_Empleados.Exferia_ComboBox_ProgramaExterno_Descripcion.SelectedItem).Identificador.Equals("-1"))
                {
                    //El Combo ProgramaExterno_Descripcion debe tener algo selccionado
                    if (((INTERNO_ComboBox_Modelo)g_frm_P_Empleados.Exferia_ComboBox_ProgramaExterno_Descripcion.SelectedItem).Identificador.Equals("-1"))
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Empleados.Exferia_Label_ProgramaExterno_Descripcion.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empleados.Exferia_ComboBox_ProgramaExterno_Descripcion;
                    }

                    //El TextBox ProgramaExterno_IdEmpleaedo debe estar relleno
                    if (g_frm_P_Empleados.Exferia_TextBox_ProgramaExterno_IdEmpleado.Text.Trim().Length == 0)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empleados.Exferia_Label_ProgramaExterno_IdEmpleado.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empleados.Exferia_TextBox_ProgramaExterno_IdEmpleado;
                    }
                }

                //HorasExtrasCabecera validar que es correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(ValidarDatos));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            DateTime? dtt_fechaNula = null;

            //Iniciamos una transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    KRS_Empleados mdl_KRS_Empleados = new KRS_Empleados();
                    mdl_KRS_Empleados.id = g_mdl_KRS_Empleados.id;

                    //nombre
                    mdl_KRS_Empleados.nombre = g_frm_P_Empleados.Label_NombreRelleno.Text;

                    //codigoValidacion
                    mdl_KRS_Empleados.codigoValidacion = g_frm_P_Empleados.Exferia_TextBox_CodigoValidacion.Text;

                    //fechaBaja
                    mdl_KRS_Empleados.fechaBaja = g_frm_P_Empleados.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "" ? DateTime.ParseExact(g_frm_P_Empleados.Exferia_FechaSeleccion_FechaBaja.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : dtt_fechaNula;

                    //pin
                    mdl_KRS_Empleados.pin = g_frm_P_Empleados.Exferia_TextBox_Pin.Text.Trim() != "" ? int.Parse(g_frm_P_Empleados.Exferia_TextBox_Pin.Text) : 0;

                    //claveAccesoWeb
                    mdl_KRS_Empleados.claveAccesoWeb = g_frm_P_Empleados.Exferia_TextBox_ClaveAccesoIntranet.Text.Trim() != "" ? g_frm_P_Empleados.Exferia_TextBox_ClaveAccesoIntranet.Text : null;

                    //tecnico
                    mdl_KRS_Empleados.tecnico = g_mdl_KRS_Empleados.tecnico;

                    //usoHorario
                    mdl_KRS_Empleados.usoHorario = ((INTERNO_ComboBox_Modelo)g_frm_P_Empleados.Exferia_ComboBox_UsosHorarios.SelectedItem).Identificador;

                    //sacarFotoFichaje
                    mdl_KRS_Empleados.sacarFotoFichaje = g_frm_P_Empleados.Exferia_CheckBox_SacarFotoFichaje.Checked;

                    //numeroTarjetaFichaje
                    mdl_KRS_Empleados.numeroTarjetaFichaje = g_frm_P_Empleados.Exferia_TextBox_NumeroTarjeta.Text;

                    //idDepartamento
                    mdl_KRS_Empleados.idDepartamento = g_mdl_KRS_Empleados.idDepartamento;

                    //email
                    mdl_KRS_Empleados.email = g_mdl_KRS_Empleados.email != null ? g_mdl_KRS_Empleados.email : "";

                    //permiteRecordatorio
                    mdl_KRS_Empleados.permiteRecordatorio = g_frm_P_Empleados.Exferia_CheckBox_PermiteRecordatorio.Checked;

                    //permiteFichajeAutomatico
                    mdl_KRS_Empleados.permiteFichajeAutomatico = g_frm_P_Empleados.Exferia_CheckBox_PermiteFichajeAutomatico.Checked;

                    //permiteFichajeWeb
                    mdl_KRS_Empleados.permiteFichajeWeb = g_frm_P_Empleados.Exferia_CheckBox_PermiteFichajeWeb.Checked;

                    //idEmpresa_FichajeAutomatico
                    if (g_frm_P_Empleados.Exferia_CheckBox_PermiteFichajeAutomatico.Checked)
                    {
                        mdl_KRS_Empleados.idEmpresa_FichajeAutomatico = g_frm_P_Empleados.Exferia_F3_SoloSeleccion_EmpresaFichajeAutomatico.Exferia_F3_SoloSeleccion_Id;
                    }
                    else
                    {
                        mdl_KRS_Empleados.idEmpresa_FichajeAutomatico = null;
                    }

                    //ProgramaExterno_IdEmpleado
                    mdl_KRS_Empleados.programaExterno_idEmpleado = g_frm_P_Empleados.Exferia_TextBox_ProgramaExterno_IdEmpleado.Text.Trim();

                    //ProgramaExterno_Descripcion
                    mdl_KRS_Empleados.programaExterno_descripcion = (((INTERNO_ComboBox_Modelo)g_frm_P_Empleados.Exferia_ComboBox_ProgramaExterno_Descripcion.SelectedItem).Descripcion);

                    //idEmpresa
                    mdl_KRS_Empleados.idEmpresa = g_mdl_KRS_Empleados.idEmpresa!=null ? g_mdl_KRS_Empleados.idEmpresa.Value : g_frm_P_Empleados.P_Base_ValoresGenerales.lng_idEmpresa ;

                    //idHoraExtraCabecera
                    if (g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Id != -1)
                    { mdl_KRS_Empleados.idHoraExtraCabecera = g_frm_P_Empleados.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Id; }
                    else
                    { mdl_KRS_Empleados.idHoraExtraCabecera = null; }

                    //Grabamos el modelo ya relleno
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_KRS_Empleados_Datos.Grabar(mdl_KRS_Empleados);

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        #region EJERCICIOS/PERFILCABECERA 
                        List<KRS_Ejercicios_PerfilesCabecera> lst_KRS_Ejercicios_PerfilesCabecera = Obtener_EjerciciosPerfil_Panel(g_mdl_KRS_Empleados.id);

                        //Borrar los ejercicios que estan Fuera del listado
                        if (g_mdl_KRS_Empleados != null && 
                            g_mdl_KRS_Empleados.KRS_Ejercicios_PerfilesCabecera != null && 
                            g_mdl_KRS_Empleados.KRS_Ejercicios_PerfilesCabecera.Count() > 0)
                        {
                            var arr_Lineasids = lst_KRS_Ejercicios_PerfilesCabecera.Select(x => x.id).ToArray();
                            var var_LineasBorrar = g_mdl_KRS_Empleados.KRS_Ejercicios_PerfilesCabecera.Where(m => !arr_Lineasids.Contains(m.id) && m.idEmpleado.Equals(g_mdl_KRS_Empleados.id) && (m.idEmpresa!=null && m.idEmpresa.Value.Equals(g_frm_P_Empleados.P_Base_ValoresGenerales.lng_idEmpresa)));
                            if (var_LineasBorrar != null && var_LineasBorrar.Count() > 0)
                            {
                                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_LineasBorrar = null;
                                foreach (KRS_Ejercicios_PerfilesCabecera mdl_KRS_Ejercicios_PerfilesCabecera in var_LineasBorrar.ToList())
                                {
                                    mdl_ValorDevuelto_Modelo_LineasBorrar = g_obj_KRS_Ejercicios_PerfilesCabecera_Datos.Borrar(mdl_KRS_Ejercicios_PerfilesCabecera.id);
                                    if (mdl_ValorDevuelto_Modelo_LineasBorrar.TodoCorrecto == false)
                                    {
                                        transaccion_SQL.Dispose();
                                        return mdl_ValorDevuelto_Modelo_LineasBorrar;
                                    }
                                }
                            }
                        }

                        //Actualizar Lineas
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Lineas = null;
                        foreach (KRS_Ejercicios_PerfilesCabecera mdl_KRS_Ejercicios_PerfilesCabecera in lst_KRS_Ejercicios_PerfilesCabecera)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo_Lineas = g_obj_KRS_Ejercicios_PerfilesCabecera_Datos.Grabar(mdl_KRS_Ejercicios_PerfilesCabecera);
                            if (!mdl_INTERNO_ValorDevuelto_Modelo_Lineas.TodoCorrecto)
                            {
                                transaccion_SQL.Dispose();
                                return mdl_INTERNO_ValorDevuelto_Modelo_Lineas;
                            }
                        }
                        #endregion

                        //termino Transaccion
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Claves Temporales
        public INTERNO_ValorDevuelto_Modelo Cargar_Listado_ClavesTemporales()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {

                // Si la tarea asincrona esta en marcha la paro
                if (g_TareaAsincrona_Rellenar_Listado_ClavesTemporales != null)
                {
                    g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.CancelAsync();

                    while (g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_TareaAsincrona_Rellenar_Listado_ClavesTemporales = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_Listado_ClavesTemporales_DoWork);
                    g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_Listado_ClavesTemporales_ProgressChanged);
                    g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_Listado_ClavesTemporales_Completed);
                    g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.WorkerSupportsCancellation = true;
                }

                //Vaciar el Listado
                g_frm_P_Empleados.Exferia_DataGridView_Claves.Rows.Clear();

                g_TareaAsincrona_Rellenar_Listado_ClavesTemporales.RunWorkerAsync();

                mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Cargar_Listado_ClavesTemporales));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Cargar_Listado_ClavesTemporales));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            return mdl_ValorDevuelto_Modelo;
        }
        private void TareaAsincrona_Rellenar_Listado_ClavesTemporales_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                DataGridViewRow obj_DataGridViewRow;
                foreach (KRS_Empleados_ClavesTemporales mdl_KRS_Empleados_ClavesTemporales in g_lst_KRS_Empleados_ClavesTemporales)
                {
                    //Se Cancelo la tarea asincrona #########################
                    if (((BackgroundWorker)sender).CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }

                    //Añadir Fila con Columnas .............................
                    obj_DataGridViewRow = Transformar_Modelo_A_Row_ClavesTemporales(mdl_KRS_Empleados_ClavesTemporales, null);

                    ((BackgroundWorker)sender).ReportProgress(1, obj_DataGridViewRow);

                    //Application.DoEvents();
                    Thread.Sleep(1);
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_Listado_ClavesTemporales_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                g_frm_P_Empleados.Exferia_DataGridView_Claves.Rows.Add((DataGridViewRow)e.UserState);
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_Listado_ClavesTemporales_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }

        public DataGridViewRow Transformar_Modelo_A_Row_ClavesTemporales(KRS_Empleados_ClavesTemporales _mdl_KRS_Empleados_ClavesTemporales, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Empleados.Exferia_DataGridView_Claves.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Empleados.Exferia_DataGridView_Claves);
            }

            obj_DataGridViewRow.Cells[0].Value = _mdl_KRS_Empleados_ClavesTemporales.id;
            obj_DataGridViewRow.Cells[1].Value = _mdl_KRS_Empleados_ClavesTemporales.clave;
            obj_DataGridViewRow.Cells[2].Value = _mdl_KRS_Empleados_ClavesTemporales.fechaCreacion;
            obj_DataGridViewRow.Cells[3].Value = _mdl_KRS_Empleados_ClavesTemporales.tiempoCaducidad_Minutos;

            return obj_DataGridViewRow;
        }

        public void ClavesTemporales_Actualizar_Registro(long _lng_idClaveTemporal, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                KRS_Empleados_ClavesTemporales mdl_KRS_Empleados_ClavesTemporales = g_obj_KRS_Empleados_ClavesTemporales_Datos.Obtener(_lng_idClaveTemporal);

                if (mdl_KRS_Empleados_ClavesTemporales != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_KRS_Empleados_ClavesTemporales != null && g_lst_KRS_Empleados_ClavesTemporales.Count > 0)
                    {
                        KRS_Empleados_ClavesTemporales mdl_KRS_Empleados_ClavesTemporales_BUSQUEDA = g_lst_KRS_Empleados_ClavesTemporales.Where(m => m.id.Equals(mdl_KRS_Empleados_ClavesTemporales.id)).FirstOrDefault();
                        if (mdl_KRS_Empleados_ClavesTemporales_BUSQUEDA != null)
                        {
                            g_lst_KRS_Empleados_ClavesTemporales[g_lst_KRS_Empleados_ClavesTemporales.FindIndex(m => m.id.Equals(mdl_KRS_Empleados_ClavesTemporales.id))] = mdl_KRS_Empleados_ClavesTemporales;
                        }
                        else
                        {
                            g_lst_KRS_Empleados_ClavesTemporales.Add(mdl_KRS_Empleados_ClavesTemporales);
                        }
                    }
                    else
                    {
                        if (g_lst_KRS_Empleados_ClavesTemporales == null)
                        {
                            g_lst_KRS_Empleados_ClavesTemporales = new List<KRS_Empleados_ClavesTemporales>();
                        }

                        g_lst_KRS_Empleados_ClavesTemporales.Add(mdl_KRS_Empleados_ClavesTemporales);
                    }

                    //Actualizar el DataGridView #####################################################################################
                    //Modificar
                    if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                    {
                        DataGridViewRow row = g_frm_P_Empleados.Exferia_DataGridView_Claves.Rows
                                   .Cast<DataGridViewRow>()
                                   .Where(r => r.Cells[nameof(KRS_Empleados_ClavesTemporales.id)].Value.Equals(_lng_idClaveTemporal)).FirstOrDefault();

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_ClavesTemporales(mdl_KRS_Empleados_ClavesTemporales, row);
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_Empleados.Exferia_DataGridView_Claves.Rows.Insert(0,Transformar_Modelo_A_Row_ClavesTemporales(mdl_KRS_Empleados_ClavesTemporales, null));

                    }
                }
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(ClavesTemporales_Actualizar_Registro));
            }
        }
        public void ClavesTemporales_Borrar_Registro(List<long> _lst_idClavesTemporales)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_KRS_Empleados_ClavesTemporales != null && g_lst_KRS_Empleados_ClavesTemporales.Count > 0)
                {
                    List<KRS_Empleados_ClavesTemporales> lst_KRS_Empleados_ClavesTemporales_BUSQUEDA = g_lst_KRS_Empleados_ClavesTemporales.Where(m => _lst_idClavesTemporales.Contains(m.id)).ToList();
                    if (lst_KRS_Empleados_ClavesTemporales_BUSQUEDA != null && lst_KRS_Empleados_ClavesTemporales_BUSQUEDA.Count > 0)
                    {
                        foreach (KRS_Empleados_ClavesTemporales mdl_KRS_Empleados_ClavesTemporales in lst_KRS_Empleados_ClavesTemporales_BUSQUEDA)
                        {
                            g_lst_KRS_Empleados_ClavesTemporales.Remove(mdl_KRS_Empleados_ClavesTemporales);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Empleados.Exferia_DataGridView_Claves.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idClavesTemporales.Contains(long.Parse(r.Cells[nameof(KRS_Empleados_ClavesTemporales.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_Empleados.Exferia_DataGridView_Claves.Rows.Remove(dgvr_Borrar);
                    }
                }

                g_frm_P_Empleados.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(ClavesTemporales_Borrar_Registro));
            }
        }

        #region Borrar Datos Empleados
        public void BorrarDatos_ClavesTemporales(List<long> _lst_idClavesTemporales)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Empleados.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idClavesTemporales);

                    g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_ClavesTemporales_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_ClavesTemporales_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_ClavesTemporales.RunWorkerAsync(lst_Argumentos);

                    g_frm_PE_Esperando.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                g_frm_P_Empleados.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(BorrarDatos_ClavesTemporales));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_ClavesTemporales_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idClaveTemporal = (List<long>)lst_Argumentos[0];


                    // Borrar 
                    mdl_ValorDevuelto_Modelo = g_obj_KRS_Empleados_ClavesTemporales_Datos.Borrar(lst_idClaveTemporal.FirstOrDefault());

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idClaveTemporal;
                        mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_ClavesTemporales_DoWork));

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Control_Errores)
                {
                    transaccion_SQL.Dispose();

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_ClavesTemporales_DoWork));

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                finally
                {
                    e.Result = mdl_ValorDevuelto_Modelo;
                }
            }
        }
        private void TareaAsincrona_BorrarDatos_ClavesTemporales_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Empleados.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)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    // Devolver al Listado el Row Borrar
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(Variables.G_STR_OPCION_KRS_EMPLEADOS);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_Empleados.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Empleados.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_ClavesTemporales_Completed));
            }
        }
        #endregion
        public int Generar_ClaveTemporal()
        {
            int int_NuevaClave = 0;
            Random de = new Random();
            int_NuevaClave = de.Next(0, 999999999);

            return int_NuevaClave;
        }
        public INTERNO_ValorDevuelto_Modelo Grabar_Nueva_ClaveTemporal(int? _int_TiempoCaducidad)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Creamos el objeto a grabar
            KRS_Empleados_ClavesTemporales mdl_KRS_Empleados_ClavesTemporales = new KRS_Empleados_ClavesTemporales();

            mdl_KRS_Empleados_ClavesTemporales.idEmpleado = g_frm_P_Empleados.P_Base_id;
            mdl_KRS_Empleados_ClavesTemporales.clave = Convert.ToString(Generar_ClaveTemporal());

            //Fecha Creacion segun uso horario del empleado
            DateTime dtt_Fecha_Calculada_Validacion = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, g_mdl_KRS_Empleados.usoHorario);
            mdl_KRS_Empleados_ClavesTemporales.fechaCreacion = dtt_Fecha_Calculada_Validacion;

            mdl_KRS_Empleados_ClavesTemporales.utilizada = false;
            mdl_KRS_Empleados_ClavesTemporales.tiempoCaducidad_Minutos = _int_TiempoCaducidad;

            //Grabamos el modelo relleno
            mdl_ValorDevuelto_Modelo = g_obj_KRS_Empleados_ClavesTemporales_Datos.Grabar(mdl_KRS_Empleados_ClavesTemporales);

            return mdl_ValorDevuelto_Modelo;
        }
        public void Rellenar_Listado_ClavesTemporales()
        {
            //Rellenamos el listado general de las claves temporales con todos los registros para ese empleado en base de datos
            g_lst_KRS_Empleados_ClavesTemporales = g_obj_KRS_Empleados_ClavesTemporales_Datos.Obtener_ModeloListado_Por_IdEmpleado(g_frm_P_Empleados.P_Base_id, true);

            if (g_lst_KRS_Empleados_ClavesTemporales != null && g_lst_KRS_Empleados_ClavesTemporales.Count > 5)
            {
                Cargar_Listado_ClavesTemporales();
            }
        }
        public void Vaciar_Listado_ClavesTemporales()
        {
            //Borramos todos menos los 5 primeros registros y los mostramos en el DGV
            if (g_lst_KRS_Empleados_ClavesTemporales != null && g_lst_KRS_Empleados_ClavesTemporales.Count > 5)
            {
                g_lst_KRS_Empleados_ClavesTemporales = g_lst_KRS_Empleados_ClavesTemporales.OrderByDescending(m=>m.fechaCreacion).ToList();
                g_lst_KRS_Empleados_ClavesTemporales.RemoveRange(5, (g_lst_KRS_Empleados_ClavesTemporales.Count - 5));

                Cargar_Listado_ClavesTemporales();
            }
        }
        #endregion

        #region Calendario
        public INTERNO_ValorDevuelto_Modelo Cargar_Calendario()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que temrine
                g_frm_P_Empleados.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                // Si la tarea asincrona esta en marcha la paro
                if (g_TareaAsincrona_Rellenar_Calendario != null)
                {
                    g_TareaAsincrona_Rellenar_Calendario.CancelAsync();

                    while (g_TareaAsincrona_Rellenar_Calendario.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_TareaAsincrona_Rellenar_Calendario = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_Calendario.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_Calendario_DoWork);
                    g_TareaAsincrona_Rellenar_Calendario.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_Calendario_Completed);
                    g_TareaAsincrona_Rellenar_Calendario.WorkerReportsProgress = true;
                    g_TareaAsincrona_Rellenar_Calendario.WorkerSupportsCancellation = true;
                }

                g_TareaAsincrona_Rellenar_Calendario.RunWorkerAsync();

                g_frm_PE_Esperando.ShowDialog();

                mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Cargar_Calendario));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            catch (Exception ex)
            {
                g_frm_P_Empleados.Enabled = true;

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

                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Cargar_Calendario));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            return mdl_ValorDevuelto_Modelo;
        }
        private void TareaAsincrona_Rellenar_Calendario_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                //Cargamos los festivos, ausencias y presencias del empleado
                g_lst_KRS_PresenciasProgramadas = g_obj_KRS_PresenciasProgramadas_Datos.Obtener_ModeloListado_Por_EmpleadoEjercicio(g_frm_P_Empleados.P_Base_id,g_frm_P_Empleados.P_Base_ValoresGenerales.EjercicioActivo,true,true);
                g_lst_KRS_AusenciasProgramadas = g_obj_KRS_AusenciasProgramadas_Datos.Obtener_ModeloListado_Por_EmpleadoEjercicio(g_frm_P_Empleados.P_Base_id, g_frm_P_Empleados.P_Base_ValoresGenerales.EjercicioActivo,true);
                g_lst_KRS_DiasFestivos = g_obj_KRS_DiasFestivos_Datos.Obtener_ModeloListado_Por_Ejercicio(g_mdl_GEN_EjerciciosActivos_Empresa);

                KRS_Ejercicios_PerfilesCabecera mdl_KRS_Ejercicioes_PerfilesCabecera = g_obj_KRS_Ejercicios_PerfilesCabecera_Datos.Obtener_Modelo_Por_EjercicioEmpleadoEmpresa(g_mdl_GEN_EjerciciosActivos_Empresa.id, g_frm_P_Empleados.P_Base_id,g_frm_P_Empleados.P_Base_ValoresGenerales.lng_idEmpresa);
                if (mdl_KRS_Ejercicioes_PerfilesCabecera != null)
                {
                    g_mdl_KRS_PerfilesCabeceras = g_obj_KRS_PerfilesCabecera_Datos.Obtener(mdl_KRS_Ejercicioes_PerfilesCabecera.idPerfilCabecera);
                }

                Rellenar_Calendario();
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_Calendario_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear el Formulario
            g_frm_P_Empleados.Enabled = true;

            try
            {
                if (!e.Cancelled)
                {
                    RellenarDias();

                    g_frm_P_Empleados.Exferia_DataGridView_Calendario.Visible = false;
                    g_frm_P_Empleados.Exferia_DataGridView_Calendario.Visible = true;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_Calendario_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
            }
        }

        public void FormatearColor_Calendario(DataGridViewCellFormattingEventArgs e)//Asignación de colores a las celdas 
        {
            try
            {
                //Nombre de meses
                if (e.ColumnIndex.Equals(0))
                {
                    e.CellStyle.BackColor = Colores.G_COLOR_KAIROSPRO_MESES_ANYO;
                    e.CellStyle.SelectionBackColor = Colores.G_COLOR_KAIROSPRO_MESES_ANYO_SELECCION;
                }
                else if (g_frm_P_Empleados.Exferia_DataGridView_Calendario[e.ColumnIndex, e.RowIndex].Tag != null)
                {
                    INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo = null;
                    mdl_INTERNO_AUX_Calendario_Modelo = (INTERNO_AUX_Calendario_Modelo)g_frm_P_Empleados.Exferia_DataGridView_Calendario[e.ColumnIndex, e.RowIndex].Tag;

                    //Comprobamos que objeto hay en el tag de la celda y pintamos la misma en función de las prioridades
                    if (mdl_INTERNO_AUX_Calendario_Modelo != null)
                    {
                        //Si existe una PresenciaProgramada
                        if (mdl_INTERNO_AUX_Calendario_Modelo.PresenciasProgramadas != null)
                        {
                            e.CellStyle.BackColor = ColorTranslator.FromHtml(mdl_INTERNO_AUX_Calendario_Modelo.PresenciasProgramadas.KRS_PresenciasProgramadasTipos.colorFondo);
                            e.CellStyle.ForeColor = ColorTranslator.FromHtml(mdl_INTERNO_AUX_Calendario_Modelo.PresenciasProgramadas.KRS_PresenciasProgramadasTipos.colorLetra);
                        }
                        //Si existe una ausenciaProgramada
                        else if (mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado != null && mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado.Count>0)
                        {
                            if (mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado.Count == 1)
                            {
                                e.CellStyle.BackColor = ColorTranslator.FromHtml(mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado[0].KRS_AusenciasProgramadasTipos.colorFondo);
                                e.CellStyle.ForeColor = ColorTranslator.FromHtml(mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado[0].KRS_AusenciasProgramadasTipos.colorLetra);
                            }
                            else
                            {
                                e.CellStyle.BackColor = Funciones_KairosPRO.Mezclar_Colores(mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado.Select(m => ColorTranslator.FromHtml(m.KRS_AusenciasProgramadasTipos.colorFondo)).Distinct().ToList());
                                e.CellStyle.ForeColor = Funciones_KairosPRO.Mezclar_Colores(mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado.Select(m => ColorTranslator.FromHtml(m.KRS_AusenciasProgramadasTipos.colorLetra)).Distinct().ToList());
                            }
                        }
                        //Si existe dia festivo
                        else if (mdl_INTERNO_AUX_Calendario_Modelo.DiasFestivos != null)
                        {
                            e.CellStyle.BackColor = Colores.G_COLOR_KAIROSPRO_DIASFESTIVOS;
                        }
                        //Si existe jornada cabecera
                        else if (mdl_INTERNO_AUX_Calendario_Modelo.JornadasCabecera != null)
                        {
                            e.CellStyle.BackColor = ColorTranslator.FromHtml(mdl_INTERNO_AUX_Calendario_Modelo.JornadasCabecera.colorFondo);
                            e.CellStyle.ForeColor = ColorTranslator.FromHtml(mdl_INTERNO_AUX_Calendario_Modelo.JornadasCabecera.colorLetra);
                        }
                        //Comprobamos si es el fin de semana
                        else if ((e.ColumnIndex.Equals(6) || e.ColumnIndex.Equals(7) || e.ColumnIndex.Equals(13) || e.ColumnIndex.Equals(14) ||
                             e.ColumnIndex.Equals(20) || e.ColumnIndex.Equals(21) || e.ColumnIndex.Equals(27) || e.ColumnIndex.Equals(28) ||
                             e.ColumnIndex.Equals(34) || e.ColumnIndex.Equals(35)) && (e.Value != null))
                        {
                            e.CellStyle.BackColor = Colores.G_COLOR_KAIROSPRO_FINSEMANA;
                        }
                        //Finalmente lo pintamos por defecto
                        else
                        {
                            if ((e.RowIndex % 2) == 0)
                            { e.CellStyle.BackColor = Color.White; }
                            else
                            { e.CellStyle.BackColor = Color.FromArgb(255, 228, 227, 230); }
                        }
                    }
                    else if ((e.ColumnIndex.Equals(6) || e.ColumnIndex.Equals(7) || e.ColumnIndex.Equals(13) || e.ColumnIndex.Equals(14) ||
                         e.ColumnIndex.Equals(20) || e.ColumnIndex.Equals(21) || e.ColumnIndex.Equals(27) || e.ColumnIndex.Equals(28) ||
                         e.ColumnIndex.Equals(34) || e.ColumnIndex.Equals(35)) && (e.Value != null))
                    {
                        e.CellStyle.BackColor = Colores.G_COLOR_KAIROSPRO_FINSEMANA;
                    }
                    else
                    {
                        if ((e.RowIndex % 2) == 0)
                        { e.CellStyle.BackColor = Color.White; }
                        else
                        { e.CellStyle.BackColor = Color.FromArgb(255, 228, 227, 230); }
                    }
                }
                //Sabados y domingos
                else if ((e.ColumnIndex.Equals(6) || e.ColumnIndex.Equals(7) || e.ColumnIndex.Equals(13) || e.ColumnIndex.Equals(14) ||
                         e.ColumnIndex.Equals(20) || e.ColumnIndex.Equals(21) || e.ColumnIndex.Equals(27) || e.ColumnIndex.Equals(28) ||
                         e.ColumnIndex.Equals(34) || e.ColumnIndex.Equals(35)) && (e.Value != null))
                {
                    DataGridViewCell dgv_Cell = g_frm_P_Empleados.Exferia_DataGridView_Calendario[e.ColumnIndex, e.RowIndex];

                    e.CellStyle.BackColor = Colores.G_COLOR_KAIROSPRO_FINSEMANA;
                    e.CellStyle.SelectionBackColor = Colores.G_COLOR_KAIROSPRO_FINSEMANA_SELECCION;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(FormatearColor_Calendario));
            }
        }

        public void Rellenar_Calendario()
        {
            try
            {
                //Rellenamos el calendario respetando el orden de prioridad
                Rellenar_Jornadas();
                Rellenar_DiasFestivos();
                Rellenar_AusenciasProgramadas();
                Rellenar_PresenciasProgramadas();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Rellenar_Calendario));
            }
        }

        private void Rellenar_Jornadas()
        {
            INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo = null;

            try
            {
                //Recorremos las lineas por si hay mas de un perfil linea para el año en curso
                if (g_mdl_KRS_PerfilesCabeceras != null)
                {
                    if (g_mdl_KRS_PerfilesCabeceras.KRS_PerfilesLinea != null && g_mdl_KRS_PerfilesCabeceras.KRS_PerfilesLinea.Count > 0)
                    {
                        foreach (KRS_PerfilesLinea mdl_KRS_PerfilesLinea in g_mdl_KRS_PerfilesCabeceras.KRS_PerfilesLinea)
                        {
                            if (mdl_KRS_PerfilesLinea.KRS_JornadasCabecera != null)
                            {
                                //Dias entre Fechas
                                TimeSpan obj_TimeSpan = mdl_KRS_PerfilesLinea.fechaHasta - mdl_KRS_PerfilesLinea.fechaDesde;
                                int intDiasTotales_EntreFechas = obj_TimeSpan.Days;
                                DateTime dtt_Fecha_Aux = mdl_KRS_PerfilesLinea.fechaDesde;

                                for (int int_Contador = 0; int_Contador <= intDiasTotales_EntreFechas; int_Contador++)
                                {
                                    //Comprobamos si ya existe el registro en el diccionario
                                    if (g_dct_ValoresTag_Calendario.ContainsKey(dtt_Fecha_Aux))
                                    {
                                        mdl_INTERNO_AUX_Calendario_Modelo = new INTERNO_AUX_Calendario_Modelo();

                                        INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo_Auxiliar = new INTERNO_AUX_Calendario_Modelo();

                                        Funciones.CopiarPropiedadesObjetos(mdl_INTERNO_AUX_Calendario_Modelo, mdl_INTERNO_AUX_Calendario_Modelo_Auxiliar, false, false);

                                        //Asignamos la jornada al modelo de calendario
                                        mdl_INTERNO_AUX_Calendario_Modelo_Auxiliar.JornadasCabecera = mdl_KRS_PerfilesLinea.KRS_JornadasCabecera;
                                        mdl_INTERNO_AUX_Calendario_Modelo_Auxiliar.Fecha = dtt_Fecha_Aux;
                                        
                                        //Añadimos el nuevo modelo al diccionario donde se encontraba el anterioir
                                        g_dct_ValoresTag_Calendario[dtt_Fecha_Aux] = mdl_INTERNO_AUX_Calendario_Modelo_Auxiliar;
                                    }
                                    else
                                    {
                                        //Creamos el registro y lo añadimos al diccionario
                                        mdl_INTERNO_AUX_Calendario_Modelo = new INTERNO_AUX_Calendario_Modelo();
                                        mdl_INTERNO_AUX_Calendario_Modelo.Descripcion = mdl_KRS_PerfilesLinea.KRS_JornadasCabecera.descripcion;
                                        mdl_INTERNO_AUX_Calendario_Modelo.idEmpleado = g_frm_P_Empleados.P_Base_id;
                                        mdl_INTERNO_AUX_Calendario_Modelo.JornadasCabecera = mdl_KRS_PerfilesLinea.KRS_JornadasCabecera;
                                        mdl_INTERNO_AUX_Calendario_Modelo.Fecha = dtt_Fecha_Aux;

                                        g_dct_ValoresTag_Calendario.Add(dtt_Fecha_Aux, mdl_INTERNO_AUX_Calendario_Modelo);
                                    }

                                    dtt_Fecha_Aux = dtt_Fecha_Aux.AddDays(1);
                                }
                            }
                        }
                    }
                }
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Rellenar_Jornadas));
            }
        }
        private void Rellenar_DiasFestivos()
        {
            try
            {
                if (g_lst_KRS_DiasFestivos != null && g_lst_KRS_DiasFestivos.Count > 0)
                {
                    foreach (KRS_DiasFestivos mdl_KRS_DiasFestivos in g_lst_KRS_DiasFestivos)
                    {
                        //Dias entre Fechas
                        TimeSpan obj_TimeSpam = mdl_KRS_DiasFestivos.fechaHasta - mdl_KRS_DiasFestivos.fechaDesde;
                        int intDiasTotales_EntreFechas = obj_TimeSpam.Days;
                        DateTime dtt_Fecha_Aux = mdl_KRS_DiasFestivos.fechaDesde;

                        for (int int_Contador = 0; int_Contador <= intDiasTotales_EntreFechas; int_Contador++)
                        {
                            //Comprobamos si ya existe el registro en el diccionario
                            if (g_dct_ValoresTag_Calendario.ContainsKey(dtt_Fecha_Aux))
                            {
                                INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo = g_dct_ValoresTag_Calendario[dtt_Fecha_Aux];

                                INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR = new INTERNO_AUX_Calendario_Modelo();

                                Funciones.CopiarPropiedadesObjetos(mdl_INTERNO_AUX_Calendario_Modelo, mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR, false, false);

                                //Asignamos el dia Festivo al Modelo del calendario
                                mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.DiasFestivos = mdl_KRS_DiasFestivos;
                                mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.Descripcion = mdl_KRS_DiasFestivos.descripcion;

                                //añadimos el nuevo modelo al diccionario donde se encontraba el anterior
                                g_dct_ValoresTag_Calendario[dtt_Fecha_Aux] = mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR;
                            }
                            else
                            {
                                //Creamos el registro añadirlo en el Diccionario
                                INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo = new INTERNO_AUX_Calendario_Modelo();
                                mdl_INTERNO_AUX_Calendario_Modelo.Fecha = dtt_Fecha_Aux;
                                mdl_INTERNO_AUX_Calendario_Modelo.DiasFestivos = mdl_KRS_DiasFestivos;
                                mdl_INTERNO_AUX_Calendario_Modelo.Descripcion = mdl_KRS_DiasFestivos.descripcion;

                                g_dct_ValoresTag_Calendario.Add(dtt_Fecha_Aux, mdl_INTERNO_AUX_Calendario_Modelo);
                            }

                            dtt_Fecha_Aux = dtt_Fecha_Aux.AddDays(1);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Rellenar_DiasFestivos));
            }
        }
        private void Rellenar_AusenciasProgramadas()
        {
            try
            {
                if (g_lst_KRS_AusenciasProgramadas != null && g_lst_KRS_AusenciasProgramadas.Count > 0)
                {
                    foreach (KRS_AusenciasProgramadas mdl_KRS_AusenciasProgramadas in g_lst_KRS_AusenciasProgramadas)
                    {
                        
                        //Si la fecha hasta es nula, cogemos la de fin del ejercicio activo
                        if (mdl_KRS_AusenciasProgramadas.fechaHasta == null)
                        {
                            mdl_KRS_AusenciasProgramadas.fechaHasta = g_mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin;
                           
                        }

                        DateTime dtt_Fecha_Aux = mdl_KRS_AusenciasProgramadas.fechaDesde;
                        
                        //Comprobamos si ya existe el registro en el diccionario
                        if (g_dct_ValoresTag_Calendario.ContainsKey(dtt_Fecha_Aux))
                        {
                            INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo = g_dct_ValoresTag_Calendario[dtt_Fecha_Aux];

                            INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR = new INTERNO_AUX_Calendario_Modelo();

                            Funciones.CopiarPropiedadesObjetos(mdl_INTERNO_AUX_Calendario_Modelo, mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR, false, false);

                            //Asignamos la ausencia programadas al modelo del calendario
                            if (mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.AusenciasProgramadas_Listado == null)
                            {
                                mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.AusenciasProgramadas_Listado = new List<KRS_AusenciasProgramadas>();
                            }
                            mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.AusenciasProgramadas_Listado.Add(mdl_KRS_AusenciasProgramadas);
                            mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.Fecha = dtt_Fecha_Aux;
                            mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.Descripcion = mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.descripcion;
                            mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.idEmpleado = g_frm_P_Empleados.P_Base_id;

                            //Añadimos el nuevo modelo al diccionario donde se encontrada el anterior
                            g_dct_ValoresTag_Calendario[dtt_Fecha_Aux] = mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR;
                        }
                        else
                        {
                            //Creamos el registro en el Diccionario
                            INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo = new INTERNO_AUX_Calendario_Modelo();
                            mdl_INTERNO_AUX_Calendario_Modelo.Fecha = dtt_Fecha_Aux;
                            if (mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado == null)
                            {
                                mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado = new List<KRS_AusenciasProgramadas>();
                            }
                            mdl_INTERNO_AUX_Calendario_Modelo.AusenciasProgramadas_Listado.Add(mdl_KRS_AusenciasProgramadas);
                            mdl_INTERNO_AUX_Calendario_Modelo.Descripcion = mdl_KRS_AusenciasProgramadas.KRS_AusenciasProgramadasTipos.descripcion;
                            mdl_INTERNO_AUX_Calendario_Modelo.idEmpleado = g_frm_P_Empleados.P_Base_id;

                            g_dct_ValoresTag_Calendario.Add(dtt_Fecha_Aux, mdl_INTERNO_AUX_Calendario_Modelo);
                        }
                    }
                    
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Rellenar_AusenciasProgramadas));
            }
        }
        private void Rellenar_PresenciasProgramadas()
        {
            try
            {
                if (g_lst_KRS_PresenciasProgramadas != null && g_lst_KRS_PresenciasProgramadas.Count > 0)
                {
                    foreach (KRS_PresenciasProgramadas mdl_KRS_PresenciasProgramadas in g_lst_KRS_PresenciasProgramadas)
                    {
                        //Dias entre Fechas
                        TimeSpan obj_TimeSpam = mdl_KRS_PresenciasProgramadas.fechaHasta - mdl_KRS_PresenciasProgramadas.fechaDesde;
                        int intDiasTotales_EntreFechas = obj_TimeSpam.Days;
                        DateTime dtt_Fecha_Aux = mdl_KRS_PresenciasProgramadas.fechaDesde;

                        for (int int_Contador = 0; int_Contador <= intDiasTotales_EntreFechas; int_Contador++)
                        {
                            if (g_dct_ValoresTag_Calendario.ContainsKey(dtt_Fecha_Aux))
                            {
                                INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo = g_dct_ValoresTag_Calendario[dtt_Fecha_Aux];

                                INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR = new INTERNO_AUX_Calendario_Modelo();

                                Funciones.CopiarPropiedadesObjetos(mdl_INTERNO_AUX_Calendario_Modelo, mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR, false, false);

                                //Asignamos la presencia programadas al modelo del calendario
                                mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.PresenciasProgramadas = mdl_KRS_PresenciasProgramadas;
                                mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.Fecha = dtt_Fecha_Aux;
                                mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.Descripcion = mdl_KRS_PresenciasProgramadas.KRS_PresenciasProgramadasTipos.descripcion;
                                mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR.idEmpleado = g_frm_P_Empleados.P_Base_id;

                                //Añadimos el nuevo modelo al diccionario donde se encontraba el anterioir
                                g_dct_ValoresTag_Calendario[dtt_Fecha_Aux] = mdl_INTERNO_AUX_Calendario_Modelo_AUXILIAR;
                            }
                            else
                            {
                                //Creamos el registro en el Diccionario
                                INTERNO_AUX_Calendario_Modelo mdl_INTERNO_AUX_Calendario_Modelo = new INTERNO_AUX_Calendario_Modelo();
                                mdl_INTERNO_AUX_Calendario_Modelo.Fecha = dtt_Fecha_Aux;
                                mdl_INTERNO_AUX_Calendario_Modelo.PresenciasProgramadas = mdl_KRS_PresenciasProgramadas;
                                mdl_INTERNO_AUX_Calendario_Modelo.Descripcion = mdl_KRS_PresenciasProgramadas.KRS_PresenciasProgramadasTipos.descripcion;
                                mdl_INTERNO_AUX_Calendario_Modelo.idEmpleado = g_frm_P_Empleados.P_Base_id;

                                g_dct_ValoresTag_Calendario.Add(dtt_Fecha_Aux, mdl_INTERNO_AUX_Calendario_Modelo);
                            }

                            dtt_Fecha_Aux = dtt_Fecha_Aux.AddDays(1);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Rellenar_PresenciasProgramadas));
            }
        }

        private void RellenarDias()
        {
            try
            {
                if (g_dct_ValoresTag_Calendario != null && g_dct_ValoresTag_Calendario.Count > 0)
                {
                    foreach (KeyValuePair<DateTime, INTERNO_AUX_Calendario_Modelo> obj_Kvp in g_dct_ValoresTag_Calendario)
                    {
                        INTERNO_AUX_FilaColumna_Modelo mdl_INTERNO_AUX_FilaColumna_Modelo = Funciones_KairosPRO.Devolver_FilaColumna_Segun_Dia(obj_Kvp.Key, g_mdl_GEN_EjerciciosActivos_Empresa);

                        if (mdl_INTERNO_AUX_FilaColumna_Modelo != null)
                        {
                            if (!(mdl_INTERNO_AUX_FilaColumna_Modelo.Fila >= g_frm_P_Empleados.Exferia_DataGridView_Calendario.Rows.Count))
                            {
                                g_frm_P_Empleados.Exferia_DataGridView_Calendario.Rows[mdl_INTERNO_AUX_FilaColumna_Modelo.Fila].Cells[mdl_INTERNO_AUX_FilaColumna_Modelo.Columna].Tag = obj_Kvp.Value;
                                g_frm_P_Empleados.Exferia_DataGridView_Calendario.Rows[mdl_INTERNO_AUX_FilaColumna_Modelo.Fila].Cells[mdl_INTERNO_AUX_FilaColumna_Modelo.Columna].ToolTipText = obj_Kvp.Value.Descripcion;
                            }
                        }
                    }
                }
            }
            catch (Control_Errores ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(RellenarDias));
            }
        }

        public void Abrir_Calendario_Externo()
        {
            //Obtenemos la opciones
            INTERNO_OpcionesDetalle_Modelo mdl_INTERNO_OpcionesDetalle_Modelo = Datos_Generales.PRV_Opciones_Buscar_Detalles(Variables.G_STR_OPCION_KRS_CALENDARIO);

            //Aquí se llamara al calendario para que lo muestre y deberia salir seleccionado el empleado
            P_Calendario frm_P_Calendario = new P_Calendario(g_frm_P_Empleados.P_Base_ValoresGenerales, g_frm_P_Empleados.P_Base_FechaTrabajo, g_frm_P_Empleados.g_mdl_PRV_OpcionesDetalle, g_frm_P_Empleados.P_Base_id);

            //Se llamo desde una pantalla
            frm_P_Calendario.P_Base_TipoAperturaPantalla = 1;
            frm_P_Calendario.P_Base_PantallaPadre_IdentificadorTAG = mdl_INTERNO_OpcionesDetalle_Modelo.camposMostrar_TituloMantenimiento;
            frm_P_Calendario.P_Base_PantallaOrigen = g_frm_P_Empleados;
            frm_P_Calendario.P_Base_TituloPantalla_CaminoHormigas = mdl_INTERNO_OpcionesDetalle_Modelo.descripcion_TituloMantenimiento.ToUpper();

            Funciones_PanelPrincipal.Cargar_PantallaEmpotrada(frm_P_Calendario, Variables.G_STR_OPCION_KRS_CALENDARIO);
        }
        #endregion

        #region Perfil/Ejercicio

        private void Crear_PerfilEjercicio(GEN_EjerciciosActivos_Empresa _mdl_GEN_EjerciciosActivos_Empresa,KRS_Ejercicios_PerfilesCabecera _mdl_KRS_Ejercicios_PerfilesCabecera)
        {
            //Añadir control creado en subproceso en el hilo principal ....................................................
            if (g_frm_P_Empleados.InvokeRequired) //Line #1
            {
                g_frm_P_Empleados.Invoke((MethodInvoker)delegate
                {
                    Crear_PerfilEjercicio(_mdl_GEN_EjerciciosActivos_Empresa, _mdl_KRS_Ejercicios_PerfilesCabecera);
                });
                return;
            }

            g_int_NumeroEjerciciosPerfiles += 1;

            //Calcular tamaño el panel #############################
            int int_AnchoPanelPrincipal = (624 * g_frm_P_Empleados.Exferia_Panel_Degradado_Perfiles.Width) / 634;
            if (g_frm_P_Empleados.Exferia_Panel_Degradado_Perfiles.Controls != null && g_frm_P_Empleados.Exferia_Panel_Degradado_Perfiles.Controls.Count > 0 && g_Array_ListadoEjerciciosPerfiles.Count > 0)
            {
                int_AnchoPanelPrincipal = g_frm_P_Empleados.Exferia_Panel_Degradado_Perfiles.Controls.Find("controlusuario_CTU_P_Empleado_PerfilEjercicio" + g_Array_ListadoEjerciciosPerfiles.FirstOrDefault(), false).FirstOrDefault().Width;
            }

            //Objeto Personalizado
            int int_posicionRelativa = g_int_EjerciciosPerfiles_PosicionY + (g_frm_P_Empleados.Exferia_Panel_Degradado_Perfiles.DisplayRectangle.Y + 5);
            CTU_P_Empleado_PerfilEjercicio controlusuario_CTU_P_Empleado_PerfilEjercicio = new CTU_P_Empleado_PerfilEjercicio(g_frm_P_Empleados, g_int_NumeroEjerciciosPerfiles, _mdl_GEN_EjerciciosActivos_Empresa, _mdl_KRS_Ejercicios_PerfilesCabecera);
            controlusuario_CTU_P_Empleado_PerfilEjercicio.Name = "controlusuario_CTU_P_Empleado_PerfilEjercicio" + g_int_NumeroEjerciciosPerfiles;
            controlusuario_CTU_P_Empleado_PerfilEjercicio.Size = new Size(int_AnchoPanelPrincipal, 48);
            controlusuario_CTU_P_Empleado_PerfilEjercicio.Location = new Point(5, int_posicionRelativa);
            controlusuario_CTU_P_Empleado_PerfilEjercicio.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left);

            //Añadir al panel Principal
            g_frm_P_Empleados.Exferia_Panel_Degradado_Perfiles.Controls.Add(controlusuario_CTU_P_Empleado_PerfilEjercicio);
            g_Array_ListadoEjerciciosPerfiles.Add(g_int_NumeroEjerciciosPerfiles);

            g_int_EjerciciosPerfiles_PosicionY = controlusuario_CTU_P_Empleado_PerfilEjercicio.Location.Y + controlusuario_CTU_P_Empleado_PerfilEjercicio.Height + 5;
        }

        private List<KRS_Ejercicios_PerfilesCabecera> Obtener_EjerciciosPerfil_Panel(long _lng_idEmpleado)
        {
            List<KRS_Ejercicios_PerfilesCabecera> lst_KRS_Ejercicios_PerfilesCabecera = new List<KRS_Ejercicios_PerfilesCabecera>();
            CTU_P_Empleado_PerfilEjercicio obj_CTU_P_Empleado_PerfilEjercicio = null;
            foreach (int int_ValorLinea in g_Array_ListadoEjerciciosPerfiles)
            {
                KRS_Ejercicios_PerfilesCabecera mdl_KRS_Ejercicios_PerfilesCabecera = new KRS_Ejercicios_PerfilesCabecera();

                obj_CTU_P_Empleado_PerfilEjercicio = (CTU_P_Empleado_PerfilEjercicio)g_frm_P_Empleados.Exferia_Panel_Degradado_Perfiles.Controls.Find("controlusuario_CTU_P_Empleado_PerfilEjercicio" + int_ValorLinea, true).FirstOrDefault();

                if (obj_CTU_P_Empleado_PerfilEjercicio != null)
                {
                    if (obj_CTU_P_Empleado_PerfilEjercicio.CTU_P_Empleado_PerfilEjercicio_IdPerfilCabecera > -1)
                    {
                        // id
                        mdl_KRS_Ejercicios_PerfilesCabecera.id = obj_CTU_P_Empleado_PerfilEjercicio.CTU_P_Empleado_PerfilEjercicio_id;

                        // idEmpleado
                        mdl_KRS_Ejercicios_PerfilesCabecera.idEmpleado = _lng_idEmpleado;

                        //CodigoCliente
                        mdl_KRS_Ejercicios_PerfilesCabecera.codigoCliente = Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO;

                        // idEjercicio
                        mdl_KRS_Ejercicios_PerfilesCabecera.idEjercicio = obj_CTU_P_Empleado_PerfilEjercicio.CTU_P_Empleado_PerfilEjercicio_IdEjercico;

                        // idPerfilCabecera
                        mdl_KRS_Ejercicios_PerfilesCabecera.idPerfilCabecera = obj_CTU_P_Empleado_PerfilEjercicio.CTU_P_Empleado_PerfilEjercicio_IdPerfilCabecera;

                        // idEmpresa
                        mdl_KRS_Ejercicios_PerfilesCabecera.idEmpresa =g_frm_P_Empleados.P_Base_ValoresGenerales.lng_idEmpresa;

                        //Añadir al Listado
                        lst_KRS_Ejercicios_PerfilesCabecera.Add(mdl_KRS_Ejercicios_PerfilesCabecera);
                    }
                }
            }

            return lst_KRS_Ejercicios_PerfilesCabecera;
        }

        #endregion

        #region Terminales
        private void Obtener_Terminales()
        {
            try
            {
                g_lst_KRS_Terminales = g_obj_KRS_Terminales_Datos.Obtener_ModeloListado_HuellaDactilar();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Obtener_Terminales));
            }
        }
        private void CargarTerminales_EnCheckBoxList()
        {
            try
            {
                if (g_lst_KRS_Terminales != null && g_lst_KRS_Terminales.Count > 0)
                {
                    //Vaciamos primero
                    g_frm_P_Empleados.Exferia_CheckListBox_Terminales.DataSource = null;

                    //Cargamos despues
                    g_frm_P_Empleados.Exferia_CheckListBox_Terminales.DataSource = g_lst_KRS_Terminales.ToList();

                    g_frm_P_Empleados.Exferia_CheckListBox_Terminales.DisplayMember = nameof(KRS_Terminales.descripcion);
                    g_frm_P_Empleados.Exferia_CheckListBox_Terminales.ValueMember = nameof(KRS_Terminales.id);
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(CargarTerminales_EnCheckBoxList));
            }
        }

        private void ActualizarTerminales_EnCheckBoxList(List<KRS_Empleados_TraspasoBiometria> _lst_KRS_Empleados_TraspasoBiometria)
        {
            try
            {
                if (g_lst_KRS_Terminales != null && g_lst_KRS_Terminales.Count > 0)
                {
                    int int_index = 0;
                    KRS_Terminales mdl_KRS_Terminales = null;
                    foreach (KRS_Empleados_TraspasoBiometria mdl_KRS_Empleados_TraspasoBiometria in _lst_KRS_Empleados_TraspasoBiometria)
                    {
                        mdl_KRS_Terminales = g_lst_KRS_Terminales.Where(m => m.id.Equals(mdl_KRS_Empleados_TraspasoBiometria.idTerminal)).FirstOrDefault();

                        if (mdl_KRS_Terminales!=null)
                        {
                            int_index = g_frm_P_Empleados.Exferia_CheckListBox_Terminales.Items.IndexOf(mdl_KRS_Terminales);
                            if (int_index > -1)
                            {
                                g_frm_P_Empleados.Exferia_CheckListBox_Terminales.SetItemChecked(int_index, true);
                            }
                        }
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(CargarTerminales_EnCheckBoxList));
            }
        }
        #endregion

        #region Grabar Obtencion de HuellasDactilares
        public void Grabar_ObtencionHuellasDactilares(long _lng_idTerminal)
        {
            try
            {
                g_frm_P_Empleados.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                g_obj_TareaAsincrona_Grabar_ObtencionHuellasDactilares = new BackgroundWorker();
                g_obj_TareaAsincrona_Grabar_ObtencionHuellasDactilares.DoWork += new DoWorkEventHandler(TareaAsincrona_Grabar_ObtencionHuellasDactilares_DoWork);
                g_obj_TareaAsincrona_Grabar_ObtencionHuellasDactilares.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Grabar_ObtencionHuellasDactilares_Completed);
                g_obj_TareaAsincrona_Grabar_ObtencionHuellasDactilares.RunWorkerAsync(_lng_idTerminal);

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Empleados.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empleados_Controladora) + "/" + nameof(Grabar_ObtencionHuellasDactilares));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_Grabar_ObtencionHuellasDactilares_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                long lng_idTerminal = (long)e.Argument;

                mdl_ValorDevuelto_Modelo = Grabar_ObtencionHuellasDactilares_Final(lng_idTerminal);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_Grabar_ObtencionHuellasDactilares_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_Grabar_ObtencionHuellasDactilares_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_Grabar_ObtencionHuellasDactilares_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Empleados.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)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_Grabar_ObtencionHuellasDactilares_Completed));
            }
        }
        
        private INTERNO_ValorDevuelto_Modelo Grabar_ObtencionHuellasDactilares_Final(long _lng_idTerminal)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            try
            {
                TMP_Empleados_ObtencionHuellasDactilares mdl_TMP_Empleados_ObtencionHuellasDactilares = new TMP_Empleados_ObtencionHuellasDactilares();
                mdl_TMP_Empleados_ObtencionHuellasDactilares.id = -1;
                mdl_TMP_Empleados_ObtencionHuellasDactilares.idEmpleado = g_mdl_KRS_Empleados.id;
                mdl_TMP_Empleados_ObtencionHuellasDactilares.idTerminal = _lng_idTerminal;
                mdl_TMP_Empleados_ObtencionHuellasDactilares.codigoCliente = g_mdl_KRS_Empleados.codigoCliente;

                mdl_ValorDevuelto_Modelo = g_obj_TMP_Empleados_ObtencionHuellasDactilares_Datos.Insertar(mdl_TMP_Empleados_ObtencionHuellasDactilares);

                return mdl_ValorDevuelto_Modelo;
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empleados_Controladora) + "/" + nameof(Grabar_ObtencionHuellasDactilares_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            
            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region GrabarDatos SicronizarDispositivoBiometrico
        public void GrabarDatos_SicronizarDispositivoBiometrico(bool _bol_Asignacion)
        {
            try
            {
                g_frm_P_Empleados.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                g_obj_TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico = new BackgroundWorker();
                g_obj_TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico.DoWork += new DoWorkEventHandler(TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico_DoWork);
                g_obj_TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico_Completed);
                g_obj_TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico.RunWorkerAsync(_bol_Asignacion);

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {

                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }
                g_frm_P_Empleados.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(GrabarDatos_SicronizarDispositivoBiometrico));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }

        private void TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                mdl_ValorDevuelto_Modelo = GrabarDatos_SicronizarDispositivoBiometrico_Final((bool)e.Argument);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_SicronizarDispositivoBiometrico_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Empleados.Enabled = 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)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                }
            }
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_SicronizarDispositivoBiometrico_Final(bool _bol_Asignacion)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
           
            try
            {
                //Obtenemos el listado de ids de terminales elegidos
                List<long> lst_idTerminalesSeleccionados = g_frm_P_Empleados.Exferia_CheckListBox_Terminales.CheckedItems.Cast<KRS_Terminales>().Select(m => m.id).ToList();

                if (lst_idTerminalesSeleccionados != null && lst_idTerminalesSeleccionados.Count > 0)
                {
                    KRS_Empleados_TraspasoBiometria mdl_KRS_Empleados_TraspasoBiometria = null;

                    //Bucle de los terminales
                    foreach (long lng_idTerminal in lst_idTerminalesSeleccionados)
                    {
                        //Si no es nulo, actualizamos sus campos
                        mdl_KRS_Empleados_TraspasoBiometria = new KRS_Empleados_TraspasoBiometria();
                        mdl_KRS_Empleados_TraspasoBiometria.idEmpleado = g_mdl_KRS_Empleados.id;
                        mdl_KRS_Empleados_TraspasoBiometria.idTerminal = lng_idTerminal;
                        mdl_KRS_Empleados_TraspasoBiometria.traspasado = false;
                        mdl_KRS_Empleados_TraspasoBiometria.tipoAccion = _bol_Asignacion ? Variables.G_STR_TIPOACCION_INSERTAR : Variables.G_STR_TIPOACCION_ELIMINAR;

                        //Finalmente Grabamos el objeto creado
                        mdl_ValorDevuelto_Modelo = g_obj_KRS_Empleados_TraspasoBiometria_Datos.Grabar(mdl_KRS_Empleados_TraspasoBiometria);

                        if (!mdl_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            return mdl_ValorDevuelto_Modelo;
                        }                    
                    }
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(GrabarDatos_SicronizarDispositivoBiometrico_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Contratos
        
        #region Rellenar DataGrid de Contratos
        
        public void Rellenar_DataGrid_Contratos()
        {
            try
            {

                // Si la tarea asincrona esta en marcha la paro
                if (g_TareaAsincrona_Rellenar_DataGrid_Contratos != null)
                {
                    g_TareaAsincrona_Rellenar_DataGrid_Contratos.CancelAsync();
                    while (g_TareaAsincrona_Rellenar_DataGrid_Contratos.IsBusy)
                    {
                        Application.DoEvents();
                    }
                }
                else
                {
                    g_TareaAsincrona_Rellenar_DataGrid_Contratos = new BackgroundWorker();
                    g_TareaAsincrona_Rellenar_DataGrid_Contratos.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Contratos_DoWork);
                    g_TareaAsincrona_Rellenar_DataGrid_Contratos.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Contratos_ProgressChanged);
                    g_TareaAsincrona_Rellenar_DataGrid_Contratos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Contratos_Completed);
                    g_TareaAsincrona_Rellenar_DataGrid_Contratos.WorkerReportsProgress = true;
                }


                //Vaciar el Listado
                g_frm_P_Empleados.Exferia_DataGridView_Contratos.Rows.Clear();
                g_int_TotalRegistrosInsertados_Contratos = 0;
                g_int_TotalRegistros_Contratos = 0;
                g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Contratos;
                g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Contratos;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Contratos.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Empleados_Controladora) + "/" + nameof(Rellenar_DataGrid_Contratos));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_Contratos_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<KRS_Empleados_Contratos> lst_KRS_Empleados_Contratos = Filtrar_Contratos();

                if (lst_KRS_Empleados_Contratos != null && lst_KRS_Empleados_Contratos.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_Contratos = lst_KRS_Empleados_Contratos.Count();

                    foreach (KRS_Empleados_Contratos mdl_KRS_Empleados_Contratos in lst_KRS_Empleados_Contratos)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_Contratos += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Contratos(mdl_KRS_Empleados_Contratos, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Contratos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de Contratos
                g_frm_P_Empleados.Exferia_DataGridView_Contratos.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Contratos;
                g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Contratos;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Contratos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {}
        
        public DataGridViewRow Transformar_Modelo_A_Row_Contratos(KRS_Empleados_Contratos _mdl_KRS_Empleados_Contratos, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Empleados.Exferia_DataGridView_Contratos.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Empleados.Exferia_DataGridView_Contratos);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_ABS_Listado_KRS_Empleados_Contratos)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_KRS_Empleados_Contratos.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_KRS_Empleados_Contratos, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_KRS_Empleados_Contratos.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_KRS_Empleados_Contratos, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_KRS_Empleados_Contratos.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_KRS_Empleados_Contratos, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_KRS_Empleados_Contratos.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_KRS_Empleados_Contratos, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_KRS_Empleados_Contratos.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_KRS_Empleados_Contratos, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                {
                    TimeSpan tms_valor = (TimeSpan)_mdl_KRS_Empleados_Contratos.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_KRS_Empleados_Contratos, null);

                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = Funciones_KairosPRO.Convertir_TimeSpan_String(tms_valor);
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_KRS_Empleados_Contratos.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_KRS_Empleados_Contratos, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }
        
        private List<KRS_Empleados_Contratos> Filtrar_Contratos()
        {
            //Filtros Avanzados
            if (g_dct_ListadoFiltros_Contratos != null && g_dct_ListadoFiltros_Contratos.Count > 0)
            {
                return g_lst_KRS_Empleados_Contratos.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<KRS_Empleados_Contratos>(g_dct_ListadoFiltros_Contratos, g_obj_ABS_Listado_Contratos)).ToList();
            }
            else
            {
                return g_lst_KRS_Empleados_Contratos;
            }
        }
        #endregion

        public void Contratos_Actualizar_Registro(long _lng_idEmpleadoContrato, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                KRS_Empleados_Contratos mdl_KRS_Empleados_Contratos = g_obj_KRS_Empleados_Contratos_Datos.Obtener_Modelo_Por_Id(_lng_idEmpleadoContrato,Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO);

                if (mdl_KRS_Empleados_Contratos != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_KRS_Empleados_Contratos != null && g_lst_KRS_Empleados_Contratos.Count > 0)
                    {
                        KRS_Empleados_Contratos mdl_KRS_Empleados_Contratos_BUSQUEDA = g_lst_KRS_Empleados_Contratos.Where(m => m.id.Equals(mdl_KRS_Empleados_Contratos.id)).FirstOrDefault();
                        if (mdl_KRS_Empleados_Contratos_BUSQUEDA != null)
                        {
                            g_lst_KRS_Empleados_Contratos[g_lst_KRS_Empleados_Contratos.FindIndex(m => m.id.Equals(mdl_KRS_Empleados_Contratos.id))] = mdl_KRS_Empleados_Contratos;
                        }
                        else
                        {
                            g_lst_KRS_Empleados_Contratos.Add(mdl_KRS_Empleados_Contratos);
                        }
                    }
                    else
                    {
                        if (g_lst_KRS_Empleados_Contratos == null)
                        {
                            g_lst_KRS_Empleados_Contratos = new List<KRS_Empleados_Contratos>();
                        }

                        g_lst_KRS_Empleados_Contratos.Add(mdl_KRS_Empleados_Contratos);
                    }

                    //Actualizar el DataGridView #####################################################################################
                    //Modificar
                    if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                    {
                        DataGridViewRow row = g_frm_P_Empleados.Exferia_DataGridView_Contratos.Rows
                                   .Cast<DataGridViewRow>()
                                   .Where(r => r.Cells[nameof(KRS_Empleados_Contratos.id)].Value.Equals(_lng_idEmpleadoContrato)).FirstOrDefault();

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_Contratos(mdl_KRS_Empleados_Contratos, row);
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_Empleados.Exferia_DataGridView_Contratos.Rows.Add(Transformar_Modelo_A_Row_Contratos(mdl_KRS_Empleados_Contratos, null));

                        //Sumar Cantidad de Lineas Insertadas
                        g_int_TotalRegistros_Contratos += 1;
                        g_int_TotalRegistrosInsertados_Contratos += 1;

                        g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Contratos;
                        g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Contratos;
                    }

                    //ordenar
                    g_frm_P_Empleados.Exferia_DataGridView_Contratos.Sort(g_frm_P_Empleados.Exferia_DataGridView_Contratos.Columns[nameof(KRS_Empleados_Contratos.fechaDesde)], ListSortDirection.Descending);
                }
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(Contratos_Actualizar_Registro));
            }
        }
        public void Contratos_Borrar_Registro(List<long> _lst_idEmpleadoContrato)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_KRS_Empleados_Contratos != null && g_lst_KRS_Empleados_Contratos.Count > 0)
                {
                    List<KRS_Empleados_Contratos> lst_KRS_Empleados_Contratos_BUSQUEDA = g_lst_KRS_Empleados_Contratos.Where(m => _lst_idEmpleadoContrato.Contains(m.id)).ToList();
                    if (lst_KRS_Empleados_Contratos_BUSQUEDA != null && lst_KRS_Empleados_Contratos_BUSQUEDA.Count > 0)
                    {
                        foreach (KRS_Empleados_Contratos mdl_KRS_Empleados_Contratos in lst_KRS_Empleados_Contratos_BUSQUEDA)
                        {
                            g_lst_KRS_Empleados_Contratos.Remove(mdl_KRS_Empleados_Contratos);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Empleados.Exferia_DataGridView_Contratos.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idEmpleadoContrato.Contains(long.Parse(r.Cells[nameof(KRS_Empleados_Contratos.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_Empleados.Exferia_DataGridView_Contratos.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Lineas Borradas
                g_int_TotalRegistros_Contratos = g_int_TotalRegistrosInsertados_Contratos - _lst_idEmpleadoContrato.Count();
                g_int_TotalRegistrosInsertados_Contratos -= _lst_idEmpleadoContrato.Count();

                g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Contratos;
                g_frm_P_Empleados.Exferia_BarraProgreso_Contratos.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Contratos;

                g_frm_P_Empleados.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empleados_Controladora) + "/" + nameof(Contratos_Borrar_Registro));
            }
        }

        #region Borrar Datos Contratos
        public void BorrarDatos_Contratos(List<long> _lst_idContratos)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Empleados.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idContratos);

                    g_obj_TareaAsincrona_BorrarDatos_Contratos = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_Contratos.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_Contratos_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_Contratos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Contratos_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_Contratos.RunWorkerAsync(lst_Argumentos);

                    g_frm_PE_Esperando.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                g_frm_P_Empleados.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empleados_Controladora) + "/" + nameof(BorrarDatos_Contratos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_Contratos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idContratos = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_KRS_Empleados_Contratos_Datos.Borrar(lst_idContratos);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.Listado_Id = lst_idContratos;
                        mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Contratos_DoWork));

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Control_Errores)
                {
                    transaccion_SQL.Dispose();

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Exception ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Contratos_DoWork));

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                finally
                {
                    e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
                }
            }
        }
        private void TareaAsincrona_BorrarDatos_Contratos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Empleados.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)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    // Devolver al Listado el Row Borrar
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(Variables.G_STR_OPCION_KRS_EMPLEADOS_CONTRATOS);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_Empleados.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Empleados.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empleados_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Contratos_Completed));
            }
        }
        #endregion

        #endregion
    }
}
