using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Formularios;
using Exferia_KairosPRO._1_Modelos;
using Exferia_KairosPRO._2_Datos;
using Exferia_KairosPRO._4_Vistas.ControlesPersonalizados_DentroPaneles;
using Exferia_KairosPRO.General;
using Exferia_KairosPRO_EF;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Transactions;
using System.Windows.Forms;

namespace Exferia_KairosPRO._4_Vistas.Controladoras
{
    public class P_Fichajes_Controladora
    {
        #region Variables Generales
        private P_Fichajes g_frm_P_Fichajes = null;
        private PE_Esperando g_frm_PE_Esperando;

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

        public List<KRSS_Fichajes> g_lst_KRSS_Fichajes = new List<KRSS_Fichajes>();
        public List<KRSS_Pausas> g_lst_KRSS_Pausas = new List<KRSS_Pausas>();
        public List<KRS_DiasFestivos> g_lst_KRS_DiasFestivos = null;

        //Modelos Necesarios
        public KRS_JornadasCabecera g_mdl_KRS_JornadasCabecera = null;
        private KRS_ValoresGenerales g_mdl_KRS_ValoresGenerales = null;//Modelo de los datos cargados

        //Clases de negocio necesarias
        private KRSS_Fichajes_Datos g_obj_KRSS_Fichajes_Datos = new KRSS_Fichajes_Datos();
        private KRSS_Pausas_Datos g_obj_KRSS_Pausas_Datos = new KRSS_Pausas_Datos();
        private KRS_JornadasLinea_Datos g_obj_KRS_JornadasLinea_Datos = new KRS_JornadasLinea_Datos();
        private KRS_PausasTipos_Datos g_obj_KRS_PausasTipos_Datos = new KRS_PausasTipos_Datos();
        private KRS_JornadasPausas_Datos g_obj_KRS_JornadasPausas_Datos = new KRS_JornadasPausas_Datos();
        private KRS_HorasExtrasCabecera_Datos g_obj_KRS_HorasExtrasCabecera_Datos = new KRS_HorasExtrasCabecera_Datos();
        private KRS_HorasExtrasCalculadasCabecera_Datos g_obj_KRS_HorasExtrasCalculadasCabecera_Datos = new KRS_HorasExtrasCalculadasCabecera_Datos();
        private KRS_AusenciasProgramadasTipos_Datos g_obj_KRS_AusenciasProgramadasTipos_Datos = new KRS_AusenciasProgramadasTipos_Datos();
        private KRS_ArbolJerarquico_Grupos_Datos g_obj_KRS_ArbolJerarquico_Grupos_Datos = new KRS_ArbolJerarquico_Grupos_Datos();
        private KRS_ArbolJerarquico_Grupos_Empleados_Datos g_obj_KRS_ArbolJerarquico_Grupos_Empleados_Datos=new KRS_ArbolJerarquico_Grupos_Empleados_Datos();
        private KRS_HorasExtrasCalculadas_Supervisores_Datos g_obj_KRS_HorasExtrasCalculadas_Supervisores_Datos = new KRS_HorasExtrasCalculadas_Supervisores_Datos();
        private KRS_HorasExtrasCalculadasLineas_Datos g_obj_KRS_HorasExtrasCalculadasLineas_Datos = new KRS_HorasExtrasCalculadasLineas_Datos();
        private KRS_TareasPendientes_Datos g_obj_KRS_TareasPendientes_Datos = new KRS_TareasPendientes_Datos();
        private KRS_ValoresGenerales_Datos g_obj_KRS_ValoresGenerales_Datos = new KRS_ValoresGenerales_Datos();

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

        //Variables para la creacion de las lineas de la jornada...
        private int g_int_NumeroLineas = 0;
        private int g_int_PosicionY_Lineas = 5;
        private List<int> g_Array_ListadoLineas = new List<int>();
        private List<INTERNO_ComboBox_Modelo> g_lst_Tipos_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();

        //Variables para la creacion de las pausas de la jornada...
        private int g_int_NumeroPausas = 0;
        private int g_int_PosicionY_Pausas = 5;
        private List<int> g_Array_ListadoPausas = new List<int>();
        private List<INTERNO_ComboBox_Modelo> g_lst_TiposPausas_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();

        //Tarea Asincrona de anular/desanular Fichaje
        private BackgroundWorker g_obj_TareaAsincrona_AnularFichaje;
        private BackgroundWorker g_obj_TareaAsincrona_DesAnularFichaje;

        //Tarea Asincrona de anular/desanular pausa
        private BackgroundWorker g_obj_TareaAsincrona_AnularPausa;
        private BackgroundWorker g_obj_TareaAsincrona_DesAnularPausa;

        private DateTime g_dtt_FechaActual;

        private List<INTERNO_ComboBox_Modelo> g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo = null;

        private List<KRS_AusenciasProgramadasTipos> g_lst_KRS_AusenciasProgramadasTipos = null;
        private List<INTERNO_ComboBox_Modelo> g_lst_AusenciasProgramadasTipos_INTERNO_ComboBox_Modelo = null;

        public INTERNO_KRS_HorasExtrasCabecera_Modelo g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo = null;

        public KRS_HorasExtrasCalculadasCabecera g_mdl_KRS_HorasExtrasCalculadasCabecera = null;
        public bool g_bol_Supervisado = false;

        //Variables para la Creacion de las lineas de HorasExtras #################
        private int g_int_NumeroLineas_HorasExtras = 0;
        private int g_int_HorasExtras_PosicionY = 5;
        private List<int> g_lst_Lineas_HorasExtras = new List<int>();

        private bool g_bol_SeleccionarTabHorasExtras = false;
        private long g_lng_idEmpleado_SegunUsuario = -1;
        #endregion

        #region Constructor
        public P_Fichajes_Controladora(P_Fichajes _frm_P_Fichajes,DateTime _dtt_FechaActual, KRS_JornadasCabecera _mdl_KRS_JornadasCabecera, INTERNO_KRS_Empleados_Modelo _mdl_INTERNO_KRS_Empleados_Modelo, List<KRS_DiasFestivos> _lst_KRS_DiasFestivos, List<KRSS_Fichajes>  _lst_KRSS_Fichajes,List<KRSS_Pausas> _lst_KRSS_Pausas,bool _bol_SeleccionarTabHorasExtras)
        {
            g_frm_P_Fichajes = _frm_P_Fichajes;

            g_mdl_KRS_JornadasCabecera = _mdl_KRS_JornadasCabecera;
            g_mdl_INTERNO_KRS_Empleados_Modelo = _mdl_INTERNO_KRS_Empleados_Modelo;
            g_lst_KRS_DiasFestivos = _lst_KRS_DiasFestivos;
            g_lst_KRSS_Fichajes = _lst_KRSS_Fichajes;
            g_lst_KRSS_Pausas = _lst_KRSS_Pausas;
            g_bol_SeleccionarTabHorasExtras = _bol_SeleccionarTabHorasExtras;

            g_dtt_FechaActual = new DateTime(_dtt_FechaActual.Year,
                                            _dtt_FechaActual.Month,
                                            _dtt_FechaActual.Day,
                                            23, 59, 00);
            //Cargar para combos
            Cargar_Combos();

            g_lng_idEmpleado_SegunUsuario = Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado != null ? Variables.G_MDL_USUARIOVALIDADO_MODELO.empleado_Asociado.id : -1;

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Cargar ComboBox
        private void Cargar_Combos()
        {
            try
            {
                //Tipos de Jornadas
                g_lst_Tipos_INTERNO_ComboBox_Modelo = ListadosEstaticos.Devolver_Tipos_JornadasLinea();

                //Tipos de pausas
                List<KRS_PausasTipos> lst_KRS_PausasTipos = g_obj_KRS_PausasTipos_Datos.Obtener_ModeloListado();
                if (lst_KRS_PausasTipos != null && lst_KRS_PausasTipos.Count > 0)
                {
                    foreach (KRS_PausasTipos mdl_KRS_PausasTipos in lst_KRS_PausasTipos)
                    {
                        g_lst_TiposPausas_INTERNO_ComboBox_Modelo.Add(new INTERNO_ComboBox_Modelo(mdl_KRS_PausasTipos.id.ToString(), mdl_KRS_PausasTipos.descripcion, null));
                    }
                }

                //Tipos de DiasHorasExtras
                g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo = Exferia_KairosPRO.General.ListadosEstaticos.Devolver_TipoHorasExtras();
                if (g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo != null)
                {
                    g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.Items.Clear();
                    g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.DataSource = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo;
                    g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedIndex = 0;
                }

                //Tipos de ausenciasprogramdas ........................................................................................................
                g_lst_KRS_AusenciasProgramadasTipos = g_obj_KRS_AusenciasProgramadasTipos_Datos.Obtener_ModeloListado(false);

                //rellenar el listado del combo
                g_lst_AusenciasProgramadasTipos_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();
                g_lst_AusenciasProgramadasTipos_INTERNO_ComboBox_Modelo.Add(new INTERNO_ComboBox_Modelo("-1", "Todos", null));

                if (g_lst_KRS_AusenciasProgramadasTipos != null && g_lst_KRS_AusenciasProgramadasTipos.Count > 0)
                {
                    foreach (KRS_AusenciasProgramadasTipos mdl_KRS_AusenciasProgramadasTipos in g_lst_KRS_AusenciasProgramadasTipos)
                    {
                        g_lst_AusenciasProgramadasTipos_INTERNO_ComboBox_Modelo.Add(new INTERNO_ComboBox_Modelo(mdl_KRS_AusenciasProgramadasTipos.id.ToString(), mdl_KRS_AusenciasProgramadasTipos.descripcion, mdl_KRS_AusenciasProgramadasTipos.fechaBorrado));
                    }
                }
                g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.Items.Clear();
                g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.DataSource = g_lst_AusenciasProgramadasTipos_INTERNO_ComboBox_Modelo;
                g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedIndex = 0;
            
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora)+"/"+nameof(Cargar_Combos));
            }
        }
        #endregion

        #region Vaciar Datos
        public void Vaciar_Datos()
        {
            //Vaciar el datagrid para cargarlo correctamente
            g_frm_P_Fichajes.Exferia_DataGridView_Fichajes.Rows.Clear();
            g_frm_P_Fichajes.Exferia_DataGridView_Pausas.Rows.Clear();

            g_frm_P_Fichajes.Exferia_Label_PausasConfiguracion.Visible = true;

            //JornadasLinea
            g_int_NumeroLineas = 0;
            g_int_PosicionY_Lineas = 5;
            g_Array_ListadoLineas.Clear();
            g_frm_P_Fichajes.Exferia_Panel_Degradado_Lineas.Controls.Clear();

            //JornadasPausas
            g_int_NumeroPausas = 0;
            g_int_PosicionY_Pausas = 5;
            g_Array_ListadoPausas.Clear();
            g_frm_P_Fichajes.Exferia_Panel_Degradado_Pausas.Controls.Clear();

            //horas Extras
            g_int_NumeroLineas_HorasExtras = 0;
            g_int_HorasExtras_PosicionY = 5;
            g_lst_Lineas_HorasExtras.Clear();
            g_frm_P_Fichajes.Panel_HorasExtras.Controls.Clear();

            g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Id = -1;
            g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Codigo = "";
            g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Descripcion = "";
            g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_FechaBorrado = null;

        }
        #endregion

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

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

                Vaciar_Datos();

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

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

                }
                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;
                }
                
                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_CargarDatos.RunWorkerAsync();
                //#################################################################################################

                g_frm_PE_Esperando.ShowDialog();
            }
            catch(Exception ex)
            {
                g_frm_P_Fichajes.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_Fichajes_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
            {
                //Fichajes
                if (g_lst_KRSS_Fichajes != null && g_lst_KRSS_Fichajes.Count > 0)
                {
                    g_lst_KRSS_Fichajes= new List<KRSS_Fichajes>(g_lst_KRSS_Fichajes.OrderBy(x => x.fechaHora));
                    DataGridViewRow obj_DataGridViewRow;
                    foreach (KRSS_Fichajes mdl_KRSS_Fichajes in g_lst_KRSS_Fichajes)
                    {
                        //Se cancelo la tarea asincrona
                        if (g_bol_Cancelar_TareaAsincrona_CargarDatos)
                        {
                            return;
                        }

                        //Añadir Fila con Columnas
                        obj_DataGridViewRow = Transformar_Modelo_A_Row_Fichaje(mdl_KRSS_Fichajes, null);

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

                        Thread.Sleep(5);
                    }
                }

                //Pausas
                if (g_lst_KRSS_Pausas != null && g_lst_KRSS_Pausas.Count > 0)
                {
                    g_lst_KRSS_Pausas = new List<KRSS_Pausas>(g_lst_KRSS_Pausas.OrderBy(x => x.fechaHora));
                    DataGridViewRow obj_DataGridViewRow;
                    foreach (KRSS_Pausas mdl_KRSS_Pausas in g_lst_KRSS_Pausas)
                    {
                        //Se cancelo la tarea asincrona
                        if (g_bol_Cancelar_TareaAsincrona_CargarDatos)
                        {
                            return;
                        }

                        //Añadir Fila con Columnas
                        obj_DataGridViewRow = Transformar_Modelo_A_Row_Pausas(mdl_KRSS_Pausas, null);

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

                        Thread.Sleep(5);
                    }
                }

                //Jornada Lineas
                if (g_frm_P_Fichajes.Exferia_Panel_Degradado_Lineas.Controls.Count==0)
                {
                    if (g_mdl_KRS_JornadasCabecera != null)
                    {
                        if (g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea == null || g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea.Count == 0)
                        {
                            g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea = g_obj_KRS_JornadasLinea_Datos.Obtener_ModeloListado_Por_JornadaCabecera(g_mdl_KRS_JornadasCabecera.id);
                        }

                        if (g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea != null && g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea.Count() > 0)
                        {
                            List<INTERNO_VerificacionFichajes_JornadasLinea_Modelo> lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo = new List<INTERNO_VerificacionFichajes_JornadasLinea_Modelo>();

                            foreach (KRS_JornadasLinea mdl_KRS_JornadasLinea in g_mdl_KRS_JornadasCabecera.KRS_JornadasLinea)
                            {
                                INTERNO_VerificacionFichajes_JornadasLinea_Modelo mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo = new INTERNO_VerificacionFichajes_JornadasLinea_Modelo();
                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.id = mdl_KRS_JornadasLinea.id;
                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.hora = mdl_KRS_JornadasLinea.hora;
                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.tipo = mdl_KRS_JornadasLinea.tipo;
                                if (mdl_KRS_JornadasLinea.tipo==Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_AUSENCIAOBLIGADA)
                                {
                                    mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.tipo_Descripcion = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_AUSENCIAOBLIGADA;
                                }
                                else if (mdl_KRS_JornadasLinea.tipo == Variables_KairosPRO.G_LNG_JORNADALINEA_TIPO_CODIGO_FLEXIBLE)
                                {
                                    mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.tipo_Descripcion = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_FLEXIBLE;
                                }
                                else 
                                {
                                    mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.tipo_Descripcion = Variables_KairosPRO.G_STR_JORNADALINEA_TIPO_DESCRIPCION_PRESENCIAOBLIGADA;
                                }
                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.sumaTiempo = mdl_KRS_JornadasLinea.sumaTiempo;
                                mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.saltaDia = mdl_KRS_JornadasLinea.saltaDia;

                                lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo.Add(mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                            }

                            //Añadir Solicitudes Ausentismo si lo hubiera
                            Funciones_KairosPRO.Obtener_JornadaLineas_ConSolicitudesDeAusentismoPorHoras(g_mdl_INTERNO_KRS_Empleados_Modelo.id, g_dtt_FechaActual, ref lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);

                            foreach (INTERNO_VerificacionFichajes_JornadasLinea_Modelo mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo in lst_INTERNO_VerificacionFichajes_JornadasLinea_Modelo)
                            {
                                ((BackgroundWorker)sender).ReportProgress(2, mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                            }
                        }
                    }
                }

                //Jornada Pausas
                if (g_frm_P_Fichajes.Exferia_Panel_Degradado_Pausas.Controls.Count == 0)
                {
                    if (g_mdl_KRS_JornadasCabecera != null)
                    {
                        if (g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas == null || g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas.Count == 0)
                        {
                            g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas = g_obj_KRS_JornadasPausas_Datos.Obtener_ModeloListado_Por_JornadaCabecera(g_mdl_KRS_JornadasCabecera.id);
                        }

                        if (g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas != null && g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas.Count() > 0)
                        {
                            foreach (KRS_JornadasPausas mdl_KRS_JornadasPausas in g_mdl_KRS_JornadasCabecera.KRS_JornadasPausas)
                            {
                                ((BackgroundWorker)sender).ReportProgress(3, mdl_KRS_JornadasPausas);
                            }
                        }
                    }
                }

                //Obtener Registro Horas Extras
                g_mdl_KRS_HorasExtrasCalculadasCabecera = g_obj_KRS_HorasExtrasCalculadasCabecera_Datos.Obtener(g_mdl_INTERNO_KRS_Empleados_Modelo.id, new DateTime(g_dtt_FechaActual.Year, g_dtt_FechaActual.Month, g_dtt_FechaActual.Day, 0, 0, 0));
                g_bol_Supervisado=g_obj_KRS_ArbolJerarquico_Grupos_Datos.Empleado_Supervisado_HorasExtras(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO,g_mdl_INTERNO_KRS_Empleados_Modelo.id,g_lng_idEmpleado_SegunUsuario);

                //Obtener los datos de servicioWEB
                g_mdl_KRS_ValoresGenerales = g_obj_KRS_ValoresGenerales_Datos.Obtener_Modelo_Por_CodigoCliente(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_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_Fichajes_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
            {
                if (e.ProgressPercentage == 1)
                {
                    DataGridViewRow dgvr_Fila = (DataGridViewRow)e.UserState;

                    g_frm_P_Fichajes.Exferia_DataGridView_Fichajes.Rows.Add(dgvr_Fila);
                }
                else if (e.ProgressPercentage == 2)
                {
                    Crear_Linea((INTERNO_VerificacionFichajes_JornadasLinea_Modelo)e.UserState);
                }
                else if (e.ProgressPercentage == 3)
                {
                    g_frm_P_Fichajes.Exferia_Label_PausasConfiguracion.Visible = false;
                    Crear_Pausa((KRS_JornadasPausas)e.UserState);
                }
                else if (e.ProgressPercentage == 4)
                {
                    DataGridViewRow dgvr_Fila = (DataGridViewRow)e.UserState;

                    g_frm_P_Fichajes.Exferia_DataGridView_Pausas.Rows.Add(dgvr_Fila);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_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_Fichajes.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_Fichajes.Salir_P_Base();
                    }
                }
                else
                {
                    if (g_mdl_KRS_JornadasCabecera != null)
                    {
                        g_frm_P_Fichajes.Exferia_Label_Jornada.Text = g_mdl_KRS_JornadasCabecera.descripcion;
                        g_frm_P_Fichajes.Exferia_Label_Jornada.ForeColor = ColorTranslator.FromHtml(g_mdl_KRS_JornadasCabecera.colorLetra != null ? g_mdl_KRS_JornadasCabecera.colorLetra : "");
                        g_frm_P_Fichajes.Exferia_Label_Jornada.BackColor = ColorTranslator.FromHtml(g_mdl_KRS_JornadasCabecera.colorFondo != null ? g_mdl_KRS_JornadasCabecera.colorFondo : "");
                    }


                    //Cargar ya Grabadas
                    if (g_mdl_KRS_HorasExtrasCalculadasCabecera!=null)
                    {
                        g_bol_Termino_CargaDatosHorasExtras = false;

                        //HorasExtrasCabecera
                        g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo = g_obj_KRS_HorasExtrasCabecera_Datos.Obtener(g_mdl_KRS_HorasExtrasCalculadasCabecera.idHoraExtraCabecera);

                        g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Id = g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCabecera.id;
                        g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Codigo = g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCabecera.codigo;
                        g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Descripcion = g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCabecera.descripcion;
                        g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_FechaBorrado = g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCabecera.fechaBorrado;

                        //tipo
                        g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_KRS_HorasExtrasCalculadasCabecera.tipo.ToString())).FirstOrDefault();

                        //totalHorasExtrasReales
                        g_frm_P_Fichajes.Exferia_Label_HorasExtras_Totales_Reales.Text = g_mdl_KRS_HorasExtrasCalculadasCabecera.totalHorasExtrasReales.ToString();

                        //totalHorasExtrasConvertidas
                        g_frm_P_Fichajes.Exferia_Label_HorasExtras_Totales_Convertidas.Text = g_mdl_KRS_HorasExtrasCalculadasCabecera.totalHorasExtrasConvertidas.ToString();

                        //Dias
                        if (g_mdl_KRS_HorasExtrasCalculadasCabecera.tipo.ToString() == Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_DIA.Codigo)
                        {
                            if (g_mdl_KRS_HorasExtrasCalculadasCabecera.dia.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_LUNES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Lunes.Checked = true;
                            }
                            else if (g_mdl_KRS_HorasExtrasCalculadasCabecera.dia.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MARTES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Martes.Checked = true;
                            }
                            else if (g_mdl_KRS_HorasExtrasCalculadasCabecera.dia.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MIERCOLES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Miercoles.Checked = true;
                            }
                            else if (g_mdl_KRS_HorasExtrasCalculadasCabecera.dia.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_JUEVES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Jueves.Checked = true;
                            }
                            else if (g_mdl_KRS_HorasExtrasCalculadasCabecera.dia.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_VIERNES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Viernes.Checked = true;
                            }
                            else if (g_mdl_KRS_HorasExtrasCalculadasCabecera.dia.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_SABADO))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Sabado.Checked = true;
                            }
                            else if (g_mdl_KRS_HorasExtrasCalculadasCabecera.dia.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_DOMINGO))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Domingo.Checked = true;
                            }
                        }
                        //TipoAusenciaProgramada
                        else if (g_mdl_KRS_HorasExtrasCalculadasCabecera.tipo.ToString() == Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_TIPOAUSENCIAPROGRAMADA.Codigo)
                        {
                            if (g_mdl_KRS_HorasExtrasCalculadasCabecera.idAusenciaProgramadaTipo != null)
                            {
                                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo = g_lst_AusenciasProgramadasTipos_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_KRS_HorasExtrasCalculadasCabecera.idAusenciaProgramadaTipo.Value.ToString())).FirstOrDefault();

                                if (mdl_INTERNO_ComboBox_Modelo != null)
                                {
                                    g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedItem = mdl_INTERNO_ComboBox_Modelo;
                                }
                                else
                                {
                                    g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedIndex = 0;
                                }
                            }
                            else
                            {
                                g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedIndex = 0;
                            }
                        }

                        //Variables para las lineas de Horas Extras
                        g_int_HorasExtras_PosicionY = 5;
                        g_int_NumeroLineas_HorasExtras = 0;
                        g_lst_Lineas_HorasExtras.Clear();
                        g_frm_P_Fichajes.Panel_HorasExtras.Controls.Clear();

                        if (g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCalculadasLineas != null &&
                            g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCalculadasLineas.Count>0)
                        {
                            foreach (KRS_HorasExtrasCalculadasLineas mdl_KRS_HorasExtrasCalculadasLineas in g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCalculadasLineas)
                            {
                                Crear_CTU_P_Fichajes_HorasExtras(mdl_KRS_HorasExtrasCalculadasLineas);
                            }
                        }


                        //no se puede modificar nada
                        SoloLectura.Empezar(g_frm_P_Fichajes.TabPage_HorasExtras,true);

                        //Si esta aceptada o reclazada si quietan los botones de autorizar y rechazar
                        if (g_mdl_KRS_HorasExtrasCalculadasCabecera.estado==Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_ACEPTADO.Codigo)
                        {
                            g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Autorizar.Visible = false;
                            g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Rechazar.Visible = false;
                            g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Borrar.Visible = true;

                            //Titulo de grabadas
                            g_frm_P_Fichajes.Exferia_Label_SinColor_GrabadasTitulo.Text = Mensajes.G_STR_KAIROSPRO_FICHAJES_HORASEXTRAS_ACEPTADAS().ToUpper();
                        }
                        else if (g_mdl_KRS_HorasExtrasCalculadasCabecera.estado == Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_CANCELADO.Codigo)
                        {
                            g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Autorizar.Visible = false;
                            g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Rechazar.Visible = false;
                            g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Borrar.Visible = true;

                            //Titulo de grabadas
                            g_frm_P_Fichajes.Exferia_Label_SinColor_GrabadasTitulo.Text = Mensajes.G_STR_KAIROSPRO_FICHAJES_HORASEXTRAS_RECHAZADAS().ToUpper();
                        }
                        else
                        {
                            //Titulo de EN CURSO
                            g_frm_P_Fichajes.Exferia_Label_SinColor_GrabadasTitulo.Text = Mensajes.G_STR_KAIROSPRO_FICHAJES_HORASEXTRAS_ENCURSO().ToUpper();

                            //Si el usuario ya contexto
                            if (g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCalculadas_Supervisores!=null &&
                                g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCalculadas_Supervisores.Count>0 &&
                                g_mdl_KRS_HorasExtrasCalculadasCabecera.KRS_HorasExtrasCalculadas_Supervisores.ToList().Exists(m=>m.idEmpleado.Equals(g_lng_idEmpleado_SegunUsuario)))
                            {
                                g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Autorizar.Visible = false;
                                g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Rechazar.Visible = false;
                                g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Borrar.Visible = true;
                            }
                            else
                            {
                                g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Autorizar.Visible = true;
                                g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Rechazar.Visible = true;
                                g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Borrar.Visible = false;
                            }
                        }

                        g_bol_Termino_CargaDatosHorasExtras = true;
                    }
                    //Si el Empleado tiene idHoraExtraCabecera cargo los datos
                    else if (g_mdl_INTERNO_KRS_Empleados_Modelo.idHoraExtraCabecera!=null)
                    {
                        //HorasExtrasCabecera
                        g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo = g_obj_KRS_HorasExtrasCabecera_Datos.Obtener(g_mdl_INTERNO_KRS_Empleados_Modelo.idHoraExtraCabecera.Value);

                        g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Id = g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo.id;
                        g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Codigo = g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo.codigo;
                        g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Descripcion = g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo.descripcion;
                        g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_FechaBorrado = g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo.fechaBorrado;

                        g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Autorizar.Visible = true;
                        g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Rechazar.Visible = true;
                        g_frm_P_Fichajes.Exferia_Button_ConBorde_HorasExtras_Borrar.Visible = false;

                        HorasExtras_CargaDatos(g_mdl_INTERNO_KRS_Empleados_Modelo.idHoraExtraCabecera.Value);
                    }

                    //Ver si el Empleado(usuario) pede ver las horas extras
                    if (g_bol_Supervisado == false)
                    {
                        g_frm_P_Fichajes.TabPage_HorasExtras.Parent = null;
                    }
                    else
                    {
                        if (g_bol_SeleccionarTabHorasExtras)
                        {
                            g_frm_P_Fichajes.Exferia_TabControl_JornadaHorasExtras.SelectedIndex = 1;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Fichajes.Salir_P_Base();
            }
            finally
            {
                g_bol_Termino_CargaDatosHorasExtras = true;

                g_frm_P_Fichajes.P_Base_SeModificoDatosPantalla = false;
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Fichaje(KRSS_Fichajes _mdl_KRSS_Fichajes, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Fichajes.Exferia_DataGridView_Fichajes.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Fichajes.Exferia_DataGridView_Fichajes);
            }

            //id
            obj_DataGridViewRow.Cells[0].Value = _mdl_KRSS_Fichajes.id;

            //anulado
            if (_mdl_KRSS_Fichajes.anulado != null)
            {
                obj_DataGridViewRow.Cells[1].Value = true;
            }
            else
            {
                obj_DataGridViewRow.Cells[1].Value = false;
            }

            //entradaSalida
            //Para poner las entradas salidas de las fichajes
            if (_mdl_KRSS_Fichajes.entradaSalida.Equals("E"))
            {
                obj_DataGridViewRow.Cells[2].Value = "Entrada";
            }
            else
            {
                obj_DataGridViewRow.Cells[2].Value = "Salida";
            }

            //fechaHora
            obj_DataGridViewRow.Cells[3].Value = _mdl_KRSS_Fichajes.fechaHora;

            //observaciones
            obj_DataGridViewRow.Cells[4].Value = _mdl_KRSS_Fichajes.observaciones;

            //modificado
            if (_mdl_KRSS_Fichajes.modificado != null)
            {
                obj_DataGridViewRow.Cells[5].Value = "X";
            }

            //validado
            if (_mdl_KRSS_Fichajes.anulado == null)
            {
                if (_mdl_KRSS_Fichajes.validado == null)
                {
                    obj_DataGridViewRow.Cells[6].Value = Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_SINVALIDAR;
                }
                else if (_mdl_KRSS_Fichajes.validado == 1)
                {
                    obj_DataGridViewRow.Cells[6].Value = Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_VALIDADO_CONINCIDENCIAS;
                }
                else if (_mdl_KRSS_Fichajes.validado == 0)
                {
                    obj_DataGridViewRow.Cells[6].Value = Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_VALIDADO_SININCIDENCIAS;
                }
            }
            else
            {
                obj_DataGridViewRow.Cells[6].Value = Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_FICHAJESANULADOS;
            }

            return obj_DataGridViewRow;
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Pausas(KRSS_Pausas _mdl_KRSS_Pausas, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Fichajes.Exferia_DataGridView_Pausas.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Fichajes.Exferia_DataGridView_Pausas);
            }

            //id
            obj_DataGridViewRow.Cells[0].Value = _mdl_KRSS_Pausas.id;

            //anulado
            if (_mdl_KRSS_Pausas.anulado != null)
            {
                obj_DataGridViewRow.Cells[1].Value = true;
            }
            else
            {
                obj_DataGridViewRow.Cells[1].Value = false;
            }

            //Tipo
            obj_DataGridViewRow.Cells[2].Value = _mdl_KRSS_Pausas.KRS_PausasTipos.descripcion;

            //entradaSalida
            //Para poner las entradas salidas de las fichajes
            if (_mdl_KRSS_Pausas.entradaSalida.Equals("E"))
            {
                obj_DataGridViewRow.Cells[3].Value = "Fin";
            }
            else
            {
                obj_DataGridViewRow.Cells[3].Value = "Inicio";
            }

            //fechaHora
            obj_DataGridViewRow.Cells[4].Value = _mdl_KRSS_Pausas.fechaHora;

            //observaciones
            obj_DataGridViewRow.Cells[5].Value = _mdl_KRSS_Pausas.observaciones;

            //modificado
            if (_mdl_KRSS_Pausas.modificado != null)
            {
                obj_DataGridViewRow.Cells[6].Value = "X";
            }

            //validado
            if (_mdl_KRSS_Pausas.anulado == null)
            {
                if (_mdl_KRSS_Pausas.validado == null)
                {
                    obj_DataGridViewRow.Cells[7].Value = Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_SINVALIDAR;
                }
                else if (_mdl_KRSS_Pausas.validado == 1 || _mdl_KRSS_Pausas.validado == 2)
                {
                    obj_DataGridViewRow.Cells[7].Value = Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_VALIDADO_CONINCIDENCIAS;
                }
                else if (_mdl_KRSS_Pausas.validado == 0)
                {
                    obj_DataGridViewRow.Cells[7].Value = Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_VALIDADO_SININCIDENCIAS;
                }
            }
            else
            {
                obj_DataGridViewRow.Cells[7].Value = Colores.G_COLOR_KAIROSPRO_FICHAJE_DIA_FICHAJESANULADOS;
            }

            return obj_DataGridViewRow;
        }
        #endregion

        #region Jornada Lineas
        public void Crear_Linea(INTERNO_VerificacionFichajes_JornadasLinea_Modelo _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo)
        {
            //añadir control Creadp del subproceso en el hilo principal...........
            if (g_frm_P_Fichajes.InvokeRequired)
            {
                g_frm_P_Fichajes.Invoke((MethodInvoker)delegate
                {
                    Crear_Linea(_mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
                });
                return;
            }

            g_int_NumeroLineas += 1;

            //Calcular el tamaño del panel ###########
            int int_AnchoPanelprincipal = 518;
            if (g_frm_P_Fichajes.Exferia_Panel_Degradado_Lineas.Controls != null && g_frm_P_Fichajes.Exferia_Panel_Degradado_Lineas.Controls.Count > 0 && g_Array_ListadoLineas.Count>0)
            {
                int_AnchoPanelprincipal = g_frm_P_Fichajes.Exferia_Panel_Degradado_Lineas.Controls.Find("controlusuario_CTU_P_Jornada_Lineas_Sololectura" + g_Array_ListadoLineas[0], false).FirstOrDefault().Width;
            }

            //Objeto Personalizado
            CTU_P_Jornada_Lineas_Sololectura controlusuario_CTU_P_Jornada_Lineas_Sololectura = new CTU_P_Jornada_Lineas_Sololectura(g_int_NumeroLineas, _mdl_INTERNO_VerificacionFichajes_JornadasLinea_Modelo);
            controlusuario_CTU_P_Jornada_Lineas_Sololectura.Name = "controlusuario_CTU_P_Jornada_Lineas_Sololectura" + g_int_NumeroLineas;
            controlusuario_CTU_P_Jornada_Lineas_Sololectura.Size = new Size(int_AnchoPanelprincipal, 23);
            controlusuario_CTU_P_Jornada_Lineas_Sololectura.Location = new Point(5, g_int_PosicionY_Lineas);
            controlusuario_CTU_P_Jornada_Lineas_Sololectura.Anchor = (AnchorStyles.Top | AnchorStyles.Left);

            //Añadir al panel Principal
            g_frm_P_Fichajes.Exferia_Panel_Degradado_Lineas.Controls.Add(controlusuario_CTU_P_Jornada_Lineas_Sololectura);
            g_Array_ListadoLineas.Add(g_int_NumeroLineas);

            //Sumar Posicion
            g_int_PosicionY_Lineas += controlusuario_CTU_P_Jornada_Lineas_Sololectura.Height + 5;
        }
        #endregion

        #region Jornada Pausas
        public void Crear_Pausa(KRS_JornadasPausas _mdl_KRS_JornadasPausas)
        {
            //añadir control Creadp del subproceso en el hilo principal...........
            if (g_frm_P_Fichajes.InvokeRequired)
            {
                g_frm_P_Fichajes.Invoke((MethodInvoker)delegate
                {
                    Crear_Pausa(_mdl_KRS_JornadasPausas);
                });
                return;
            }

            g_int_NumeroPausas += 1;

            //Calcular el tamaño del panel ###########
            int int_AnchoPanelprincipal = 530;
            if (g_frm_P_Fichajes.Exferia_Panel_Degradado_Pausas.Controls != null && g_frm_P_Fichajes.Exferia_Panel_Degradado_Pausas.Controls.Count > 0 && g_Array_ListadoPausas.Count > 0)
            {
                int_AnchoPanelprincipal = g_frm_P_Fichajes.Exferia_Panel_Degradado_Pausas.Controls.Find("controlusuario_CTU_P_Jornada_Pausas" + g_Array_ListadoPausas[0], false).FirstOrDefault().Width;
            }

            //Clonar el listado
            List<INTERNO_ComboBox_Modelo> lst_Tipos_INTERNO_ComboBox_Modelo = Funciones.Clonar(g_lst_Tipos_INTERNO_ComboBox_Modelo);

            //Objeto Personalizado
            CTU_P_Jornada_Pausas controlusuario_CTU_P_Jornada_Pausas = new CTU_P_Jornada_Pausas(g_frm_P_Fichajes, g_int_NumeroPausas, g_lst_TiposPausas_INTERNO_ComboBox_Modelo, _mdl_KRS_JornadasPausas, false);
            controlusuario_CTU_P_Jornada_Pausas.Name = "controlusuario_CTU_P_Jornada_Pausas" + g_int_NumeroPausas;
            controlusuario_CTU_P_Jornada_Pausas.Size = new Size(int_AnchoPanelprincipal, 23);
            controlusuario_CTU_P_Jornada_Pausas.Location = new Point(5, g_int_PosicionY_Pausas);
            controlusuario_CTU_P_Jornada_Pausas.Anchor = (AnchorStyles.Top | AnchorStyles.Left);

            //Añadir al panel Principal
            g_frm_P_Fichajes.Exferia_Panel_Degradado_Pausas.Controls.Add(controlusuario_CTU_P_Jornada_Pausas);
            g_Array_ListadoPausas.Add(g_int_NumeroPausas);

            //Sumar Posicion
            g_int_PosicionY_Pausas += controlusuario_CTU_P_Jornada_Pausas.Height + 5;

            SoloLectura.Empezar(controlusuario_CTU_P_Jornada_Pausas, true);
        }
        #endregion

        #region Anular Fichaje
        public void AnularFichaje(long _lng_id)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_PREGUNTA_ANULAR_FICHAJE()))
                {
                    g_frm_P_Fichajes.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                    g_obj_TareaAsincrona_AnularFichaje = new BackgroundWorker();
                    g_obj_TareaAsincrona_AnularFichaje.DoWork += new DoWorkEventHandler(TareaAsincrona_AnularFichaje_DoWork);
                    g_obj_TareaAsincrona_AnularFichaje.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_AnularFichaje_Completed);

                    g_obj_TareaAsincrona_AnularFichaje.RunWorkerAsync(_lng_id);

                    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_Fichajes.Enabled = true;

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

            try
            {
                long lng_id = (long)e.Argument;

                mdl_ValorDevuelto_Modelo = AnularFichaje_Final(lng_id);

                //Verificaion de los fichaje del dia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    Verificacion_Fichajes obj_Verificacion_Fichajes = new Verificacion_Fichajes();

                    obj_Verificacion_Fichajes.Proceso(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO, g_dtt_FechaActual, g_mdl_INTERNO_KRS_Empleados_Modelo, false,g_frm_P_Fichajes.P_Base_ValoresGenerales.lng_idEmpresa);
                    
                }

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_AnularFichaje_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_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_AnularFichaje_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_AnularFichaje_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Fichajes.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_Fichajes, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }
                    
                }
                else
                {
                    g_frm_P_Fichajes.P_Base_ActualizarRegistro_ConObjeto(Variables.G_STR_OPCION_KRSS_FICHAJES,Enumerados.G_ENUM_TIPOACCION.INT_NADA);
                    RecargarDatos();
                    g_frm_P_Fichajes.g_bol_ActualizarCalendario = true;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_AnularFichaje_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Fichajes.Salir_P_Base();
            }
            finally
            {
                g_frm_P_Fichajes.P_Base_SeModificoDatosPantalla = false;
               
            }
        }
        private INTERNO_ValorDevuelto_Modelo AnularFichaje_Final(long _lng_id)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    DateTime dtt_Hoy = DateTime.Now;

                    mdl_ValorDevuelto_Modelo = g_obj_KRSS_Fichajes_Datos.Anular_Fichaje(_lng_id,dtt_Hoy);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //termino transaccion
                        transaccion_SQL.Complete();

                        g_lst_KRSS_Fichajes.Where(x => x.id.Equals(_lng_id)).FirstOrDefault().modificado = dtt_Hoy;
                        g_lst_KRSS_Fichajes.Where(x => x.id.Equals(_lng_id)).FirstOrDefault().anulado = dtt_Hoy;
                    }

                    return mdl_ValorDevuelto_Modelo;
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(AnularFichaje_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_ValorDevuelto_Modelo;
        }
        #endregion
        #region DesAnular Fichaje
        public void DesAnularFichaje(long _lng_id)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_PREGUNTA_DESANULAR_FICHAJE()))
                {
                    g_frm_P_Fichajes.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                    g_obj_TareaAsincrona_DesAnularFichaje = new BackgroundWorker();
                    g_obj_TareaAsincrona_DesAnularFichaje.DoWork += new DoWorkEventHandler(TareaAsincrona_DesAnularFichaje_DoWork);
                    g_obj_TareaAsincrona_DesAnularFichaje.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_AnularFichaje_Completed);

                    g_obj_TareaAsincrona_DesAnularFichaje.RunWorkerAsync(_lng_id);

                    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_Fichajes.Enabled = true;

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

            try
            {
                long lng_id = (long)e.Argument;

                mdl_ValorDevuelto_Modelo = DesAnularFichaje_Final(lng_id);

                //Verificaion de los fichaje del dia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    Verificacion_Fichajes obj_Verificacion_Fichajes = new Verificacion_Fichajes();

                    obj_Verificacion_Fichajes.Proceso(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO, g_dtt_FechaActual, g_mdl_INTERNO_KRS_Empleados_Modelo, false, g_frm_P_Fichajes.P_Base_ValoresGenerales.lng_idEmpresa);
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_DesAnularFichaje_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_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_DesAnularFichaje_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_DesAnularFichaje_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Fichajes.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_Fichajes, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                }
                else
                {
                    g_frm_P_Fichajes.P_Base_ActualizarRegistro_ConObjeto(Variables.G_STR_OPCION_KRSS_FICHAJES, Enumerados.G_ENUM_TIPOACCION.INT_NADA);
                    RecargarDatos();

                    g_frm_P_Fichajes.g_bol_ActualizarCalendario = true;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_DesAnularFichaje_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Fichajes.Salir_P_Base();
            }
            finally
            {
                g_frm_P_Fichajes.P_Base_SeModificoDatosPantalla = false;
               
            }
        }
        private INTERNO_ValorDevuelto_Modelo DesAnularFichaje_Final(long _lng_id)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    DateTime dtt_Hoy = DateTime.Now;

                    mdl_ValorDevuelto_Modelo = g_obj_KRSS_Fichajes_Datos.DesAnular_Fichaje(_lng_id, dtt_Hoy);
                    
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //termino transaccion
                        transaccion_SQL.Complete();

                        g_lst_KRSS_Fichajes.Where(x => x.id.Equals(_lng_id)).FirstOrDefault().modificado = dtt_Hoy;
                        g_lst_KRSS_Fichajes.Where(x => x.id.Equals(_lng_id)).FirstOrDefault().anulado = null;
                    }

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

        #region Anular Pausa
        public void AnularPausa(long _lng_id)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_PREGUNTA_ANULAR_PAUSA()))
                {
                    g_frm_P_Fichajes.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                    g_obj_TareaAsincrona_AnularPausa = new BackgroundWorker();
                    g_obj_TareaAsincrona_AnularPausa.DoWork += new DoWorkEventHandler(TareaAsincrona_AnularPausa_DoWork);
                    g_obj_TareaAsincrona_AnularPausa.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_AnularPausa_Completed);

                    g_obj_TareaAsincrona_AnularPausa.RunWorkerAsync(_lng_id);

                    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_Fichajes.Enabled = true;

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

            try
            {
                long lng_id = (long)e.Argument;

                mdl_ValorDevuelto_Modelo = AnularPausa_Final(lng_id);

                //Verificaion de los Pausa del dia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    Verificacion_Pausas obj_Verificacion_Pausas = new Verificacion_Pausas();

                    obj_Verificacion_Pausas.Proceso(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO, g_dtt_FechaActual, g_mdl_INTERNO_KRS_Empleados_Modelo, true, g_frm_P_Fichajes.P_Base_ValoresGenerales.lng_idEmpresa);

                }

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_AnularPausa_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_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_AnularPausa_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_AnularPausa_Completed(object sender, RunWorkerCompletedEventArgs e)
        {

            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Fichajes.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_Fichajes, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                }
                else
                {
                    g_frm_P_Fichajes.P_Base_ActualizarRegistro_ConObjeto(Variables.G_STR_OPCION_KRSS_PAUSAS, Enumerados.G_ENUM_TIPOACCION.INT_NADA);
                    RecargarDatos();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_AnularPausa_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Fichajes.Salir_P_Base();
            }
            finally
            {
                g_frm_P_Fichajes.P_Base_SeModificoDatosPantalla = false;

            }
        }
        private INTERNO_ValorDevuelto_Modelo AnularPausa_Final(long _lng_id)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    DateTime dtt_Hoy = DateTime.Now;

                    mdl_ValorDevuelto_Modelo = g_obj_KRSS_Pausas_Datos.Anular_Pausa(_lng_id, dtt_Hoy);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //termino transaccion
                        transaccion_SQL.Complete();

                        g_lst_KRSS_Pausas.Where(x => x.id.Equals(_lng_id)).FirstOrDefault().modificado = dtt_Hoy;
                        g_lst_KRSS_Pausas.Where(x => x.id.Equals(_lng_id)).FirstOrDefault().anulado = dtt_Hoy;
                    }
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(AnularPausa_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_ValorDevuelto_Modelo;
        }
        #endregion
        #region DesAnular Pausa
        public void DesAnularPausa(long _lng_id)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_PREGUNTA_DESANULAR_PAUSA()))
                {
                    g_frm_P_Fichajes.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                    g_obj_TareaAsincrona_DesAnularPausa = new BackgroundWorker();
                    g_obj_TareaAsincrona_DesAnularPausa.DoWork += new DoWorkEventHandler(TareaAsincrona_DesAnularPausa_DoWork);
                    g_obj_TareaAsincrona_DesAnularPausa.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_AnularPausa_Completed);

                    g_obj_TareaAsincrona_DesAnularPausa.RunWorkerAsync(_lng_id);

                    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_Fichajes.Enabled = true;

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

            try
            {
                long lng_id = (long)e.Argument;

                mdl_ValorDevuelto_Modelo = DesAnularPausa_Final(lng_id);

                //Verificaion de los Pausa del dia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    Verificacion_Pausas obj_Verificacion_Pausas = new Verificacion_Pausas();

                    obj_Verificacion_Pausas.Proceso(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO, g_dtt_FechaActual, g_mdl_INTERNO_KRS_Empleados_Modelo, true, g_frm_P_Fichajes.P_Base_ValoresGenerales.lng_idEmpresa);
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_DesAnularPausa_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_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_DesAnularPausa_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_DesAnularPausa_Completed(object sender, RunWorkerCompletedEventArgs e)
        {

            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Fichajes.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_Fichajes, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                }
                else
                {
                    g_frm_P_Fichajes.P_Base_ActualizarRegistro_ConObjeto(Variables.G_STR_OPCION_KRSS_PAUSAS, Enumerados.G_ENUM_TIPOACCION.INT_NADA);
                    RecargarDatos();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_DesAnularPausa_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Fichajes.Salir_P_Base();
            }
            finally
            {
                g_frm_P_Fichajes.P_Base_SeModificoDatosPantalla = false;

            }
        }
        private INTERNO_ValorDevuelto_Modelo DesAnularPausa_Final(long _lng_id)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    DateTime dtt_Hoy = DateTime.Now;

                    mdl_ValorDevuelto_Modelo = g_obj_KRSS_Pausas_Datos.DesAnular_Pausa(_lng_id, dtt_Hoy);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //termino transaccion
                        transaccion_SQL.Complete();

                        g_lst_KRSS_Pausas.Where(x => x.id.Equals(_lng_id)).FirstOrDefault().modificado = dtt_Hoy;
                        g_lst_KRSS_Pausas.Where(x => x.id.Equals(_lng_id)).FirstOrDefault().anulado = null;
                    }
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(DesAnularPausa_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_ValorDevuelto_Modelo;
        }
        #endregion
    
        #region HorasExtras
        public void HorasExtras_CargaDatos(long _lng_idHoraExtraCabecera)
        {
            try
            {
                g_bol_Termino_CargaDatosHorasExtras = false;

                #region Vaciamos Todo y Bloqueamos Todo
                //Tipos de dias
                g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedIndex = 0;
                g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.Enabled = false;

                //Tipo de Ausenciaprogramda
                g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedIndex = 0;

                //Dias
                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Lunes.Checked = false;
                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Martes.Checked = false;
                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Miercoles.Checked = false;
                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Jueves.Checked = false;
                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Viernes.Checked = false;
                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Sabado.Checked = false;
                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Domingo.Checked = false;

                //Variables para las lineas de Horas Extras
                g_int_HorasExtras_PosicionY = 5;
                g_int_NumeroLineas_HorasExtras = 0;
                g_lst_Lineas_HorasExtras.Clear();
                g_frm_P_Fichajes.Panel_HorasExtras.Controls.Clear();
                #endregion

                //Fecha Actual si Horas
                DateTime dtt_fechaActual_SinHoras = new DateTime(g_dtt_FechaActual.Year, g_dtt_FechaActual.Month, g_dtt_FechaActual.Day, 0, 0, 0);

                //Buscar las HorasExtrasCabcera y Lineas
                g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo = g_obj_KRS_HorasExtrasCabecera_Datos.Obtener(_lng_idHoraExtraCabecera);
                
                //Verificar datos
                if (g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo!=null)
                {
                    //Es dia Festivo
                    bool bol_EsDiaFestivo = false;
                    if (g_lst_KRS_DiasFestivos != null && g_lst_KRS_DiasFestivos.Count > 0 && g_lst_KRS_DiasFestivos.Exists(m => m.fechaDesde >= dtt_fechaActual_SinHoras && m.fechaDesde <= dtt_fechaActual_SinHoras))
                    {
                        bol_EsDiaFestivo = true;
                    }

                    //Es Tipo de Ausencia Programada
                    bool bol_EsAusenciaProgramadaTipo = false;
                    if (g_mdl_INTERNO_KRS_Empleados_Modelo.KRS_AusenciasProgramadas != null &&
                        g_mdl_INTERNO_KRS_Empleados_Modelo.KRS_AusenciasProgramadas.Count > 0 &&
                        g_mdl_INTERNO_KRS_Empleados_Modelo.KRS_AusenciasProgramadas.ToList().Exists(m => m.fechaDesde <= dtt_fechaActual_SinHoras && m.fechaHasta >= dtt_fechaActual_SinHoras))
                    {
                        bol_EsAusenciaProgramadaTipo = true;
                    }

                    //Dia Actual
                    DayOfWeek dow_primerDia = dtt_fechaActual_SinHoras.DayOfWeek;
                    string str_DiaActual = "";
                    if (dow_primerDia.Equals(DayOfWeek.Monday))
                    {
                        str_DiaActual = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_LUNES;
                    }
                    else if (dow_primerDia.Equals(DayOfWeek.Tuesday))
                    {
                        str_DiaActual = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MARTES;
                    }
                    else if (dow_primerDia.Equals(DayOfWeek.Wednesday))
                    {
                        str_DiaActual = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MIERCOLES;
                    }
                    else if (dow_primerDia.Equals(DayOfWeek.Thursday))
                    {
                        str_DiaActual = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_JUEVES;
                    }
                    else if (dow_primerDia.Equals(DayOfWeek.Friday))
                    {
                        str_DiaActual = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_VIERNES;
                    }
                    else if (dow_primerDia.Equals(DayOfWeek.Saturday))
                    {
                        str_DiaActual = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_SABADO;
                    }
                    else if (dow_primerDia.Equals(DayOfWeek.Sunday))
                    {
                        str_DiaActual = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_DOMINGO;
                    }

                    //Orden de Aplicacion
                    if (g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo.Lineas!=null)
                    {
                        //Se ordenan las lineas apra que muestra la prioridad del tipo para este dia
                        foreach(int int_Tipo in g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo.Lineas.OrderBy(m => m.ordenAplicacion).ThenByDescending(m => m.horaCalculo).ThenBy(m => m.tipo).Select(m => m.tipo).ToList())
                        {
                            //Dia Festivo
                            if (int_Tipo.ToString()==Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_FESTIVOS.Codigo &&
                                bol_EsDiaFestivo)
                            {
                                //Combo de Tipo
                                g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_FESTIVOS.Codigo)).FirstOrDefault();

                                break;
                            }

                            //AusenciaProgramadaTipo
                            if (int_Tipo.ToString() == Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_TIPOAUSENCIAPROGRAMADA.Codigo &&
                                bol_EsAusenciaProgramadaTipo)
                            {
                                //Combo de Tipo
                                g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_TIPOAUSENCIAPROGRAMADA.Codigo)).FirstOrDefault();


                                //Combo de AusenciaProgramdasTipo
                                KRS_AusenciasProgramadas mdl_KRS_AusenciasProgramadas = g_mdl_INTERNO_KRS_Empleados_Modelo.KRS_AusenciasProgramadas.ToList().Where(m => m.fechaDesde <= dtt_fechaActual_SinHoras && m.fechaHasta >= dtt_fechaActual_SinHoras).FirstOrDefault();
                                INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo = g_lst_AusenciasProgramadasTipos_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(mdl_KRS_AusenciasProgramadas.idAusenciaProgramadaTipo.ToString())).FirstOrDefault();
                                if (mdl_INTERNO_ComboBox_Modelo != null)
                                {
                                    g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedItem = mdl_INTERNO_ComboBox_Modelo;
                                }
                                else
                                {
                                    g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedIndex = 0;
                                }

                                break;
                            }

                            //Dia o jornada Normal
                            if (int_Tipo.ToString() == Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_DIA.Codigo ||
                                int_Tipo.ToString() == Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_JORNADANORMAL.Codigo) 
                            {
                                
                                //Ver si tiene alguna linea para el dia actual
                                if (g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo.Lineas != null &&
                                    g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo.Lineas.Exists(m => m.dia != null && m.dia.Equals(str_DiaActual)))
                                {
                                    //Combo Tipo
                                    g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_DIA.Codigo)).FirstOrDefault();

                                    //CheckBox Dia
                                    if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_LUNES))
                                    {
                                        g_frm_P_Fichajes.Exferia_CheckBox_Dia_Lunes.Checked = true;
                                    }
                                    else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MARTES))
                                    {
                                        g_frm_P_Fichajes.Exferia_CheckBox_Dia_Martes.Checked = true;
                                    }
                                    else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MIERCOLES))
                                    {
                                        g_frm_P_Fichajes.Exferia_CheckBox_Dia_Miercoles.Checked = true;
                                    }
                                    else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_JUEVES))
                                    {
                                        g_frm_P_Fichajes.Exferia_CheckBox_Dia_Jueves.Checked = true;
                                    }
                                    else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_VIERNES))
                                    {
                                        g_frm_P_Fichajes.Exferia_CheckBox_Dia_Viernes.Checked = true;
                                    }
                                    else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_SABADO))
                                    {
                                        g_frm_P_Fichajes.Exferia_CheckBox_Dia_Sabado.Checked = true;
                                    }
                                    else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_DOMINGO))
                                    {
                                        g_frm_P_Fichajes.Exferia_CheckBox_Dia_Domingo.Checked = true;
                                    }
                                }
                                //Jornada normal
                                else
                                {
                                    //Combo Tipo
                                    g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_JORNADANORMAL.Codigo)).FirstOrDefault();
                                }

                                break;
                            }
                        }
                    }
                    else
                    {
                        //Es dia festivo
                        if (bol_EsDiaFestivo)
                        {
                            //Combo de Tipo
                            g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_FESTIVOS.Codigo)).FirstOrDefault();
                        }
                        //Es Tipo de AusenciaProgramada
                        else if (bol_EsAusenciaProgramadaTipo)
                        {
                            //Combo de Tipo
                            g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_TIPOAUSENCIAPROGRAMADA.Codigo)).FirstOrDefault();


                            //Combo de AusenciaProgramdasTipo
                            KRS_AusenciasProgramadas mdl_KRS_AusenciasProgramadas = g_mdl_INTERNO_KRS_Empleados_Modelo.KRS_AusenciasProgramadas.ToList().Where(m => m.fechaDesde <= dtt_fechaActual_SinHoras && m.fechaHasta >= dtt_fechaActual_SinHoras).FirstOrDefault();
                            INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo = g_lst_AusenciasProgramadasTipos_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(mdl_KRS_AusenciasProgramadas.idAusenciaProgramadaTipo.ToString())).FirstOrDefault();
                            if (mdl_INTERNO_ComboBox_Modelo != null)
                            {
                                g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedItem = mdl_INTERNO_ComboBox_Modelo;
                            }
                            else
                            {
                                g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedIndex = 0;
                            }
                        }
                        else
                        {
                            //Combo Tipo
                            g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_DIA.Codigo)).FirstOrDefault();

                            //CheckBox Dia
                            if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_LUNES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Lunes.Checked = true;
                            }
                            else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MARTES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Martes.Checked = true;
                            }
                            else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MIERCOLES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Miercoles.Checked = true;
                            }
                            else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_JUEVES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Jueves.Checked = true;
                            }
                            else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_VIERNES))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Viernes.Checked = true;
                            }
                            else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_SABADO))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Sabado.Checked = true;
                            }
                            else if (str_DiaActual.Equals(Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_DOMINGO))
                            {
                                g_frm_P_Fichajes.Exferia_CheckBox_Dia_Domingo.Checked = true;
                            }
                        }
                    }

                    //Calcular las Lineas
                    HorasExtras_CalcularLineas();

                    g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(HorasExtras_CargaDatos));
            }
            finally
            {
                g_bol_Termino_CargaDatosHorasExtras = true;
            }
        }
        public void HorasExtras_CalcularLineas()
        {
            try
            {
                //Variables para las lineas de Horas Extras
                g_int_HorasExtras_PosicionY = 5;
                g_int_NumeroLineas_HorasExtras = 0;
                g_lst_Lineas_HorasExtras.Clear();
                g_frm_P_Fichajes.Panel_HorasExtras.Controls.Clear();

                #region Dia Seleccionado
                string str_Dia = "";
                if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Lunes.Checked)
                {
                    str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_LUNES;
                }
                else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Martes.Checked)
                {
                    str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MARTES;
                }
                else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Miercoles.Checked)
                {
                    str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MIERCOLES;
                }
                else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Jueves.Checked)
                {
                    str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_JUEVES;
                }
                else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Viernes.Checked)
                {
                    str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_VIERNES;
                }
                else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Sabado.Checked)
                {
                    str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_SABADO;
                }
                else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Domingo.Checked)
                {
                    str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_DOMINGO;
                }
                #endregion

                #region Tipo de Ausencia Programada
                long lng_idAusenciaProgramadaTipo = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedItem).Identificador);
                #endregion

                List<KRS_HorasExtrasCalculadasLineas> lst_KRS_KRS_HorasExtrasCalculadasLineas = Funciones_KairosPRO.HorasExtras_CalcularLineas(new DateTime(g_dtt_FechaActual.Year, g_dtt_FechaActual.Month, g_dtt_FechaActual.Day, 0, 0, 0),
                                                                        g_lst_KRSS_Fichajes,
                                                                        g_lst_KRS_DiasFestivos,
                                                                        g_mdl_INTERNO_KRS_Empleados_Modelo,
                                                                        false,
                                                                        g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo,
                                                                        -1,
                                                                        int.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem).Identificador),
                                                                        lng_idAusenciaProgramadaTipo,
                                                                        str_Dia
                                                                        );

                //Mostrar los Controles Personalizados
                if (lst_KRS_KRS_HorasExtrasCalculadasLineas.Count > 0)
                {
                    foreach (KRS_HorasExtrasCalculadasLineas mdl_KRS_HorasExtrasCalculadasLineas in lst_KRS_KRS_HorasExtrasCalculadasLineas)
                    {
                        Crear_CTU_P_Fichajes_HorasExtras(mdl_KRS_HorasExtrasCalculadasLineas);
                    }
                }

                HorasExtras_CalcularTotales();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(HorasExtras_CalcularLineas));
            }
        }
        #region CTU_P_Fichajes_HorasExtras
        public void Crear_CTU_P_Fichajes_HorasExtras(KRS_HorasExtrasCalculadasLineas _mdl_KRS_HorasExtrasCalculadasLineas)
        {
            //Añadir control creado en subproceso en el hilo principal ...........................................
            if (g_frm_P_Fichajes.InvokeRequired)// Line #1
            {
                g_frm_P_Fichajes.Invoke((MethodInvoker)delegate
                {
                    Crear_CTU_P_Fichajes_HorasExtras(_mdl_KRS_HorasExtrasCalculadasLineas);
                });

                return;
            }
            //....................................................................................................

            g_int_NumeroLineas_HorasExtras++;

            //Calcular el Tamaño del pantel ##############################################################
            int int_AnchoPanel = (442 * g_frm_P_Fichajes.Panel_HorasExtras.Width) / 476;
            if (g_frm_P_Fichajes.Panel_HorasExtras.Controls != null && g_frm_P_Fichajes.Panel_HorasExtras.Controls.Count > 0 && g_lst_Lineas_HorasExtras.Count > 0)
            {
                int_AnchoPanel = g_frm_P_Fichajes.Panel_HorasExtras.Controls.Find("controlusuario_CTU_P_Fichajes_HorasExtras" + g_lst_Lineas_HorasExtras[0], false).FirstOrDefault().Width;
            }

            //Objeto Personalizado
            int int_PosicionRelativa = g_int_HorasExtras_PosicionY + (g_frm_P_Fichajes.Panel_HorasExtras.DisplayRectangle.Y + 5);
            CTU_P_Fichajes_HorasExtras controlusuario_CTU_P_Fichajes_HorasExtras = new CTU_P_Fichajes_HorasExtras(g_int_NumeroLineas_HorasExtras,_mdl_KRS_HorasExtrasCalculadasLineas);
            controlusuario_CTU_P_Fichajes_HorasExtras.Name = "controlusuario_CTU_P_Fichajes_HorasExtras" + g_int_NumeroLineas_HorasExtras;
            controlusuario_CTU_P_Fichajes_HorasExtras.Size = new System.Drawing.Size(int_AnchoPanel, 174);

            controlusuario_CTU_P_Fichajes_HorasExtras.Location = new System.Drawing.Point(5, int_PosicionRelativa);
            controlusuario_CTU_P_Fichajes_HorasExtras.Anchor = (AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);
            controlusuario_CTU_P_Fichajes_HorasExtras.Boton_P_Fichajes_HorasExtrasDelete_Click += new EventHandler<INTERNO_EventArgs>(Boton_P_Fichajes_HorasExtrasDelete);
            controlusuario_CTU_P_Fichajes_HorasExtras.Boton_P_Fichajes_HorasExtrasRecalcular += new EventHandler(Boton_P_Fichajes_HorasExtras_RecalcularTotal);

            //Añadimos al panel principal
            g_frm_P_Fichajes.Panel_HorasExtras.Controls.Add(controlusuario_CTU_P_Fichajes_HorasExtras);

            g_int_HorasExtras_PosicionY += 174 + 5;

            g_lst_Lineas_HorasExtras.Add(g_int_NumeroLineas_HorasExtras);
        }
        private void Boton_P_Fichajes_HorasExtrasDelete(object sender, INTERNO_EventArgs e)
        {
            g_frm_P_Fichajes.P_Base_SeModificoDatosPantalla = true;

            CTU_P_Fichajes_HorasExtras obj_CTU_P_Fichajes_HorasExtras_Borrar = (CTU_P_Fichajes_HorasExtras)g_frm_P_Fichajes.Panel_HorasExtras.Controls.Find("controlusuario_CTU_P_Fichajes_HorasExtras" + e.NumeroObjeto, false).FirstOrDefault();

            obj_CTU_P_Fichajes_HorasExtras_Borrar.Dispose();

            g_lst_Lineas_HorasExtras.Remove(e.NumeroObjeto);

            g_int_HorasExtras_PosicionY -= (174 + 5);

            CTU_P_Fichajes_HorasExtras obj_A_Cambiar;
            foreach (int valores_ModificarPosicion in g_lst_Lineas_HorasExtras.Where(m => m > e.NumeroObjeto).ToList())
            {
                obj_A_Cambiar = (CTU_P_Fichajes_HorasExtras)g_frm_P_Fichajes.Panel_HorasExtras.Controls.Find("controlusuario_CTU_P_Fichajes_HorasExtras" + valores_ModificarPosicion, false).FirstOrDefault();
                if (obj_A_Cambiar != null)
                {
                    obj_A_Cambiar.Location = new System.Drawing.Point(obj_A_Cambiar.Location.X, obj_A_Cambiar.Location.Y - (174 + 5));
                }
            }            
        }
        private void Boton_P_Fichajes_HorasExtras_RecalcularTotal(object sender,EventArgs e)
        {
            HorasExtras_CalcularTotales();
        }

        #endregion

        private void HorasExtras_CalcularTotales()
        {
            decimal dcm_HorasExtrasReales = 0m;
            decimal dcm_HorasExtrasAutorizadas = 0m;
            decimal dcm_HorasExtrasConvertidas = 0m;

            if (g_lst_Lineas_HorasExtras != null && g_lst_Lineas_HorasExtras.Count > 0)
            {
                CTU_P_Fichajes_HorasExtras obj_A_Cambiar;
                foreach (int valores_ModificarPosicion in g_lst_Lineas_HorasExtras)
                {
                    obj_A_Cambiar = (CTU_P_Fichajes_HorasExtras)g_frm_P_Fichajes.Panel_HorasExtras.Controls.Find("controlusuario_CTU_P_Fichajes_HorasExtras" + valores_ModificarPosicion, false).FirstOrDefault();
                    if (obj_A_Cambiar != null)
                    {
                        dcm_HorasExtrasReales += obj_A_Cambiar.CTU_P_Fichajes_HorasExtras_HorasReales;
                        dcm_HorasExtrasAutorizadas += obj_A_Cambiar.CTU_P_Fichajes_HorasExtras_Horas;
                        dcm_HorasExtrasConvertidas += obj_A_Cambiar.CTU_P_Fichajes_HorasExtras_HorasConvertidas;
                    }
                }
            }

            //rellenar labels
            g_frm_P_Fichajes.Exferia_Label_HorasExtras_Totales_Reales.Text = string.Format("{0:0.00}", Funciones.RedondearDecimal(dcm_HorasExtrasReales, 2));
            g_frm_P_Fichajes.Exferia_Label_HorasExtras_Totales_Convertidas.Text = string.Format("{0:0.00}", Funciones.RedondearDecimal(dcm_HorasExtrasConvertidas, 2));
        }

        #region Horas extras Grabar

        public void HorasExtras_Grabar(bool _bol_AutorizarRechazar)
        {
            try
            {
                g_frm_P_Fichajes.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

                BackgroundWorker obj_TareaAsincrona_HorasExtras_Grabar = new BackgroundWorker();
                obj_TareaAsincrona_HorasExtras_Grabar.DoWork += new DoWorkEventHandler(TareaAsincrona_HorasExtras_Grabar_DoWork);
                obj_TareaAsincrona_HorasExtras_Grabar.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_HorasExtras_Grabar_Completed);

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

                obj_TareaAsincrona_HorasExtras_Grabar.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_Fichajes.Enabled = true;

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

            try
            {
                List<object> lst_Argumentos = (List<object>)e.Argument;


                bool bol_AutorizarRechazar=(bool)lst_Argumentos[0];
                string str_MotivoCancelacion = (string)lst_Argumentos[1];

                //Validar Primero
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_VALIDACION = HorasExtras_ValidarDatos();
                if (mdl_ValorDevuelto_Modelo_VALIDACION.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo = HorasExtras_Grabar_Final(bol_AutorizarRechazar, str_MotivoCancelacion);
                }
                else
                {
                    mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_HorasExtras_Grabar_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_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_HorasExtras_Grabar_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_HorasExtras_Grabar_Completed(object sender, RunWorkerCompletedEventArgs e)
        {

            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Fichajes.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_Fichajes, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }
                }
                else
                {
                    if (g_bol_SeleccionarTabHorasExtras)
                    {
                        if (g_frm_P_Fichajes.P_Base_PantallaOrigen!=null)
                        {
                            g_frm_P_Fichajes.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(Variables.G_STR_OPCION_KRSS_FICHAJES, Enumerados.G_ENUM_TIPOACCION.INT_NADA);
                        }
                    }


                    RecargarDatos();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_HorasExtras_Grabar_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
            }
        }

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

            try
            {
               
                //HorasExtrasCabecera no puede ser nulo
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //HorasExtrasCabecera validar que es correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Fichajes.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_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si se selecciono el tipo de dia, tiene que tener un dia seleccionado
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (((INTERNO_ComboBox_Modelo)g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem).Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_DIA.Codigo))
                    {
                        if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Lunes.Checked == false &&
                            g_frm_P_Fichajes.Exferia_CheckBox_Dia_Martes.Checked == false &&
                            g_frm_P_Fichajes.Exferia_CheckBox_Dia_Miercoles.Checked == false &&
                            g_frm_P_Fichajes.Exferia_CheckBox_Dia_Jueves.Checked == false &&
                            g_frm_P_Fichajes.Exferia_CheckBox_Dia_Viernes.Checked == false &&
                            g_frm_P_Fichajes.Exferia_CheckBox_Dia_Sabado.Checked == false &&
                            g_frm_P_Fichajes.Exferia_CheckBox_Dia_Domingo.Checked == false)
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_VALIDACIONES_NOHAYREGISTROSSELECCIONADOS("día");
                        }
                    }
                }


                //validar lineas 
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (g_lst_Lineas_HorasExtras!=null && g_lst_Lineas_HorasExtras.Count>0)
                    {
                        CTU_P_Fichajes_HorasExtras obj_A_Cambiar;
                        foreach (int valores_ModificarPosicion in g_lst_Lineas_HorasExtras)
                        {
                            obj_A_Cambiar = (CTU_P_Fichajes_HorasExtras)g_frm_P_Fichajes.Panel_HorasExtras.Controls.Find("controlusuario_CTU_P_Fichajes_HorasExtras" + valores_ModificarPosicion, false).FirstOrDefault();
                            if (obj_A_Cambiar != null)
                            {
                                mdl_ValorDevuelto_Modelo = obj_A_Cambiar.ValidarDatos();

                                if (mdl_ValorDevuelto_Modelo.TodoCorrecto==false)
                                {
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_KAIROSPRO_FICHAJES_HORASEXTRAS_NOTIENELINEAS();
                    }
                }

            }
            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_Fichajes_Controladora) + "/" + nameof(HorasExtras_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 HorasExtras_Grabar_Final(bool _bol_AutorizarRechazar,string _str_MotivoCancelacion)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            mdl_ValorDevuelto_Modelo.Mensaje = "";

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    long lng_idHorasExtrasCalculadasCabecera = -1;
                    DateTime dtt_Fecha = new DateTime(g_dtt_FechaActual.Year, g_dtt_FechaActual.Month, g_dtt_FechaActual.Day, 0, 0, 0);
                    DateTime dtt_fechaActual = DateTime.Now.Date;

                    string str_Estado = "";
                    if (_bol_AutorizarRechazar == false)
                    {
                        //ESTADO A CANCELADO
                        str_Estado = Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_CANCELADO.Codigo;
                    }
                    else
                    {
                        if (Solicitud_Aceptar_ValidarGrupos(dtt_fechaActual))
                        {
                            //ESTADO A ACEPTADO
                            str_Estado = Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_ACEPTADO.Codigo;
                        }
                        else
                        {
                            //ESTADO A ENCURSO
                            str_Estado = Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_ENCURSO.Codigo;
                        }
                    }


                    if (g_mdl_KRS_HorasExtrasCalculadasCabecera==null)
                    {
                        KRS_HorasExtrasCalculadasCabecera mdl_KRS_HorasExtrasCalculadasCabecera = new KRS_HorasExtrasCalculadasCabecera();

                        //id
                        mdl_KRS_HorasExtrasCalculadasCabecera.id = -1;

                        //codigoCliente
                        mdl_KRS_HorasExtrasCalculadasCabecera.codigoCliente = Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO;

                        //idEmpleado
                        mdl_KRS_HorasExtrasCalculadasCabecera.idEmpleado = g_mdl_INTERNO_KRS_Empleados_Modelo.id;

                        //fecha
                        mdl_KRS_HorasExtrasCalculadasCabecera.fecha = dtt_Fecha;

                        //idHoraExtraCabecera
                        mdl_KRS_HorasExtrasCalculadasCabecera.idHoraExtraCabecera = g_frm_P_Fichajes.Exferia_F3_HorasExtrasCabecera.Exferia_F3_Id;

                        //tipo
                        mdl_KRS_HorasExtrasCalculadasCabecera.tipo = int.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_Fichajes.Exferia_ComboBox_TiposDias.SelectedItem).Identificador);

                        //totalHorasExtras
                        mdl_KRS_HorasExtrasCalculadasCabecera.totalHorasExtrasReales = Convert.ToDecimal(g_frm_P_Fichajes.Exferia_Label_HorasExtras_Totales_Reales.Text.Trim());

                        //totalHorasExtras
                        mdl_KRS_HorasExtrasCalculadasCabecera.totalHorasExtrasConvertidas = Convert.ToDecimal(g_frm_P_Fichajes.Exferia_Label_HorasExtras_Totales_Convertidas.Text.Trim());

                        //dia
                        if (mdl_KRS_HorasExtrasCalculadasCabecera.tipo.ToString().Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_DIA.Codigo))
                        {
                            if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Lunes.Checked)
                            {
                                mdl_KRS_HorasExtrasCalculadasCabecera.dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_LUNES;
                            }
                            else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Martes.Checked)
                            {
                                mdl_KRS_HorasExtrasCalculadasCabecera.dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MARTES;
                            }
                            else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Miercoles.Checked)
                            {
                                mdl_KRS_HorasExtrasCalculadasCabecera.dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MIERCOLES;
                            }
                            else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Jueves.Checked)
                            {
                                mdl_KRS_HorasExtrasCalculadasCabecera.dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_JUEVES;
                            }
                            else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Viernes.Checked)
                            {
                                mdl_KRS_HorasExtrasCalculadasCabecera.dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_VIERNES;
                            }
                            else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Sabado.Checked)
                            {
                                mdl_KRS_HorasExtrasCalculadasCabecera.dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_SABADO;
                            }
                            else if (g_frm_P_Fichajes.Exferia_CheckBox_Dia_Domingo.Checked)
                            {
                                mdl_KRS_HorasExtrasCalculadasCabecera.dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_DOMINGO;
                            }
                        }
                        else
                        {
                            mdl_KRS_HorasExtrasCalculadasCabecera.dia = null;
                        }

                        //idAusenciaProgramadaTipo
                        if (mdl_KRS_HorasExtrasCalculadasCabecera.tipo.ToString().Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_TIPOAUSENCIAPROGRAMADA.Codigo))
                        {
                            long lng_idAusenciaProgramadaTipo = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_Fichajes.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedItem).Identificador);

                            if (lng_idAusenciaProgramadaTipo > 0)
                            {
                                mdl_KRS_HorasExtrasCalculadasCabecera.idAusenciaProgramadaTipo = lng_idAusenciaProgramadaTipo;
                            }
                            else
                            {
                                mdl_KRS_HorasExtrasCalculadasCabecera.idAusenciaProgramadaTipo = null;
                            }
                        }
                        else
                        {
                            mdl_KRS_HorasExtrasCalculadasCabecera.idAusenciaProgramadaTipo = null;
                        }


                        //Estado
                        mdl_KRS_HorasExtrasCalculadasCabecera.estado = str_Estado;

                        //FECHA Y MOTIVO
                        if (str_Estado==Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_ACEPTADO.Codigo)
                        {
                            mdl_KRS_HorasExtrasCalculadasCabecera.motivoCancelacion = "";
                            mdl_KRS_HorasExtrasCalculadasCabecera.fechaAceptacionCancelacion =dtt_fechaActual;
                        }
                        else if (str_Estado == Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_CANCELADO.Codigo)
                        {
                            mdl_KRS_HorasExtrasCalculadasCabecera.motivoCancelacion = _str_MotivoCancelacion;
                            mdl_KRS_HorasExtrasCalculadasCabecera.fechaAceptacionCancelacion = dtt_fechaActual;
                        }
                        else
                        {
                            mdl_KRS_HorasExtrasCalculadasCabecera.motivoCancelacion = "";
                            mdl_KRS_HorasExtrasCalculadasCabecera.fechaAceptacionCancelacion = null;
                        }

                        //Grabamos el modelo ya relleno
                        mdl_ValorDevuelto_Modelo = g_obj_KRS_HorasExtrasCalculadasCabecera_Datos.Insertar(mdl_KRS_HorasExtrasCalculadasCabecera);

                        lng_idHorasExtrasCalculadasCabecera = mdl_ValorDevuelto_Modelo.Id;

                        //GRABAR LAS LINEAS
                        g_obj_KRS_HorasExtrasCalculadasLineas_Datos.Borrar(lng_idHorasExtrasCalculadasCabecera);

                        CTU_P_Fichajes_HorasExtras obj_A_Cambiar;
                        foreach (int valores_ModificarPosicion in g_lst_Lineas_HorasExtras)
                        {
                            obj_A_Cambiar = (CTU_P_Fichajes_HorasExtras)g_frm_P_Fichajes.Panel_HorasExtras.Controls.Find("controlusuario_CTU_P_Fichajes_HorasExtras" + valores_ModificarPosicion, false).FirstOrDefault();
                            if (obj_A_Cambiar != null)
                            {
                                KRS_HorasExtrasCalculadasLineas mdl_KRS_HorasExtrasCalculadasLineas= obj_A_Cambiar.Obtener(lng_idHorasExtrasCalculadasCabecera);

                                g_obj_KRS_HorasExtrasCalculadasLineas_Datos.Insertar(mdl_KRS_HorasExtrasCalculadasLineas);
                            }
                        }
                    }
                    else
                    {
                        dtt_Fecha = g_mdl_KRS_HorasExtrasCalculadasCabecera.fecha;
                        lng_idHorasExtrasCalculadasCabecera = g_mdl_KRS_HorasExtrasCalculadasCabecera.id;
                        g_obj_KRS_HorasExtrasCalculadasCabecera_Datos.Actualizar_Estado(lng_idHorasExtrasCalculadasCabecera, Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO, str_Estado, "", dtt_fechaActual);
                    }

                    //SUPERVISOR
                    KRS_HorasExtrasCalculadas_Supervisores mdl_KRS_HorasExtrasCalculadas_Supervisores = new KRS_HorasExtrasCalculadas_Supervisores();

                    mdl_KRS_HorasExtrasCalculadas_Supervisores.idHoraExtraCalculadaCabecera = lng_idHorasExtrasCalculadasCabecera;
                    mdl_KRS_HorasExtrasCalculadas_Supervisores.codigoCliente = Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO;
                    mdl_KRS_HorasExtrasCalculadas_Supervisores.idEmpleado = g_lng_idEmpleado_SegunUsuario;
                    mdl_KRS_HorasExtrasCalculadas_Supervisores.estado = _bol_AutorizarRechazar ? Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_ACEPTADO.Codigo : Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_CANCELADO.Codigo;
                    mdl_KRS_HorasExtrasCalculadas_Supervisores.fechaAceptacionCancelacion = dtt_fechaActual;

                    g_obj_KRS_HorasExtrasCalculadas_Supervisores_Datos.Insertar(mdl_KRS_HorasExtrasCalculadas_Supervisores);

                    #region KRS_TareasPendientes
                    if (str_Estado == Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_ENCURSO.Codigo)
                    {
                        g_obj_KRS_TareasPendientes_Datos.Actualizar_Campo_Leido_HorasExtras(g_mdl_INTERNO_KRS_Empleados_Modelo.id, Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO, dtt_Fecha, lng_idHorasExtrasCalculadasCabecera, g_lng_idEmpleado_SegunUsuario);
                    }
                    else
                    {
                        g_obj_KRS_TareasPendientes_Datos.Actualizar_Campo_Leido_HorasExtras(g_mdl_INTERNO_KRS_Empleados_Modelo.id, Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO, dtt_Fecha, lng_idHorasExtrasCalculadasCabecera, -1);
                    }

                    //Crear una Tareapendiente para el empleado
                    //Respuesta para el empleado
                    KRS_TareasPendientes mdl_KRS_TareasPendientes = new KRS_TareasPendientes();
                    mdl_KRS_TareasPendientes.codigoCliente = Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO;
                    mdl_KRS_TareasPendientes.fechaEnvio = dtt_fechaActual;
                    mdl_KRS_TareasPendientes.fechaHorasExtras = dtt_Fecha;
                    mdl_KRS_TareasPendientes.id = -1;
                    mdl_KRS_TareasPendientes.idEmpleadoEmisor = g_lng_idEmpleado_SegunUsuario;
                    mdl_KRS_TareasPendientes.idEmpleadoReceptor = g_mdl_INTERNO_KRS_Empleados_Modelo.id;
                    mdl_KRS_TareasPendientes.idHorasExtrasCalculadasCabecera = lng_idHorasExtrasCalculadasCabecera;
                    mdl_KRS_TareasPendientes.idSolicitudAusenciaProgramada = null;
                    mdl_KRS_TareasPendientes.leido = false;
                    mdl_KRS_TareasPendientes.tipo = int.Parse(Variables_KairosPRO.G_MDL_TIPO_TAREAPENDIENTE_RESPUESTAEMPLEADO.Codigo);

                    g_obj_KRS_TareasPendientes_Datos.Grabar(mdl_KRS_TareasPendientes);

                    //Crear una Tareapendiente para todos los supervisores que quieran el resultado
                    if (str_Estado == Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_ACEPTADO.Codigo ||
                        str_Estado == Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_CANCELADO.Codigo)
                    {
                        List<INTERNO_AUX_ArbolJerarquico_Grupos_AUX_Modelo> lst_INTERNO_AUX_ArbolJerarquico_Grupos_AUX_Modelo = g_obj_KRS_ArbolJerarquico_Grupos_Datos.Obtener_Listado_Supervisores_SoloResultado(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO, g_mdl_INTERNO_KRS_Empleados_Modelo.id, -1);
                        if (lst_INTERNO_AUX_ArbolJerarquico_Grupos_AUX_Modelo != null && lst_INTERNO_AUX_ArbolJerarquico_Grupos_AUX_Modelo.Count > 0)
                        {
                            List<long> lst_idEmpleadosSupervisores = lst_INTERNO_AUX_ArbolJerarquico_Grupos_AUX_Modelo.Select(m => m.IdEmpleado).Distinct().ToList();

                            foreach (long lng_idEmpleadoSupervisor in lst_idEmpleadosSupervisores)
                            {
                                KRS_TareasPendientes mdl_KRS_TareasPendientes_Supervisores = new KRS_TareasPendientes();
                                mdl_KRS_TareasPendientes_Supervisores.codigoCliente = Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO;
                                mdl_KRS_TareasPendientes_Supervisores.fechaEnvio = dtt_fechaActual;
                                mdl_KRS_TareasPendientes_Supervisores.fechaHorasExtras = dtt_Fecha;
                                mdl_KRS_TareasPendientes_Supervisores.id = -1;
                                mdl_KRS_TareasPendientes_Supervisores.idEmpleadoEmisor = g_mdl_INTERNO_KRS_Empleados_Modelo.id;
                                mdl_KRS_TareasPendientes_Supervisores.idEmpleadoReceptor = lng_idEmpleadoSupervisor;
                                mdl_KRS_TareasPendientes_Supervisores.idHorasExtrasCalculadasCabecera = lng_idHorasExtrasCalculadasCabecera;
                                mdl_KRS_TareasPendientes_Supervisores.idSolicitudAusenciaProgramada = null;
                                mdl_KRS_TareasPendientes_Supervisores.leido = false;
                                mdl_KRS_TareasPendientes_Supervisores.tipo = int.Parse(Variables_KairosPRO.G_MDL_TIPO_TAREAPENDIENTE_RESPUESTASUPERVISOR.Codigo);

                                g_obj_KRS_TareasPendientes_Datos.Grabar(mdl_KRS_TareasPendientes_Supervisores);
                            }
                        }
                    }

                    #endregion

                    //Termmio Transaccion
                    transaccion_SQL.Complete();
                    transaccion_SQL.Dispose();


                    #region Enviar Correo
                    if (g_mdl_KRS_ValoresGenerales!=null &&
                        (str_Estado == Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_ACEPTADO.Codigo ||
                         str_Estado == Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_CANCELADO.Codigo))
                    {
                        try
                        {
                            //Cargamos el ensamblado #########################################################################################################################################################################
                            Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_SERVICIOWEB + ".dll");
                            //Obtenemos el tipo de la clase
                            Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_SERVICIOWEB + "." + Variables.G_STR_LIBRERIA_DATOSSERVICIOWEB);
                            //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_DATOSSERVICIOWEB_PROCEDIMIENTO_KAIROSPRO_ENVIARCORREO_AUTORIZACIONHORASEXTRAS, BindingFlags.Instance | BindingFlags.NonPublic);

                            //Obtener valores
                            object[] arr_Parametros_1 = {   g_mdl_KRS_ValoresGenerales.servicioWeb_IP,
                                                            g_mdl_KRS_ValoresGenerales.servicioWeb_Puerto,
                                                            (str_Estado == Variables_KairosPRO.G_MDL_ESTADOSOLICITUD_ACEPTADO.Codigo ? 2 : 3),
                                                            lng_idHorasExtrasCalculadasCabecera,
                                                            DateTime.Now.Date
                                                        };

                            //Pasamos los parametros al metodo y lo ejecutamos
                            obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                            //##################################################################################################################################################################################################                    
                        }
                        catch (Exception)
                        { }
                    }

                    #endregion

                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Detalle_Controladora) + "/" + nameof(HorasExtras_Grabar_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                finally
                {
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_ValorDevuelto_Modelo;
        }

        #endregion

        #region Horas extras Borrar

        public void HorasExtras_Borrar()
        {
            try
            {
                g_frm_P_Fichajes.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                BackgroundWorker obj_TareaAsincrona_HorasExtras_Borrar = new BackgroundWorker();
                obj_TareaAsincrona_HorasExtras_Borrar.DoWork += new DoWorkEventHandler(TareaAsincrona_HorasExtras_Borrar_DoWork);
                obj_TareaAsincrona_HorasExtras_Borrar.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_HorasExtras_Borrar_Completed);

                obj_TareaAsincrona_HorasExtras_Borrar.RunWorkerAsync();

                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_Fichajes.Enabled = true;

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

            try
            {
                // Se utiliza la transaccion por la llamada al procedimiento de almacenado
                using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
                {
                    try
                    {

                        //KRS_HorasExtrasCalculadasCabecera
                        mdl_INTERNO_ValorDevuelto_Modelo = g_obj_KRS_HorasExtrasCalculadasCabecera_Datos.Borrar(g_mdl_KRS_HorasExtrasCalculadasCabecera != null ? g_mdl_KRS_HorasExtrasCalculadasCabecera.id : -1);

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            //termino transaccion
                            transaccion_SQL.Complete();

                        }
                    }
                    catch (Control_Errores)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                    }
                    catch (Exception ex)
                    {
                        Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_HorasExtras_Borrar_DoWork));

                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                    }
                    finally
                    {
                        transaccion_SQL.Dispose();
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_HorasExtras_Borrar_DoWork));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_HorasExtras_Borrar_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_HorasExtras_Borrar_Completed(object sender, RunWorkerCompletedEventArgs e)
        {

            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Fichajes.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_Fichajes, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }
                }
                else
                {
                    RecargarDatos();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(TareaAsincrona_HorasExtras_Borrar_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        #endregion
        #endregion

        #region ValidarGrupos
        private bool Solicitud_Aceptar_ValidarGrupos(DateTime _dtt_fechaActual)
        {
            bool bol_Aceptar = false;
            try
            {

                //Grupos
                List<KRS_ArbolJerarquico_Grupos> lst_KRS_ArbolJerarquico_Grupos = g_obj_KRS_ArbolJerarquico_Grupos_Datos.Obtener_Listado_Para_Validacion(Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO,
                                                                                                                                                        g_mdl_INTERNO_KRS_Empleados_Modelo.id,
                                                                                                                                                        -1,
                                                                                                                                                        Variables_KairosPRO.G_INT_ARBOLJERARQUICO_GRUPOS_TIPO_RESPUESTA);


                if (lst_KRS_ArbolJerarquico_Grupos != null && lst_KRS_ArbolJerarquico_Grupos.Count > 0)
                {
                    //buscar datos de empleados
                    List<INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo> lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo = g_obj_KRS_ArbolJerarquico_Grupos_Empleados_Datos.Obtener_Listado_Para_Validacion_AutorizacionHE(lst_KRS_ArbolJerarquico_Grupos.Select(m => m.id).ToList(),
                                                                                                                                                                                                                                                                Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO,
                                                                                                                                                                                                                                                                (g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo!=null ? g_mdl_INTERNO_KRS_HorasExtrasCabecera_Modelo.id:-1));

                    if (lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo!=null && lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo.Count>0)
                    {
                        foreach (INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo mdl_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo in lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo.Where(m => m.IdEmpleado == g_lng_idEmpleado_SegunUsuario && m.FechaAceptacionCancelacion == null))
                        {
                            mdl_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo.FechaAceptacionCancelacion = _dtt_fechaActual;
                        }
                    }

                    //Recorrer grupos
                    List<KRS_ArbolJerarquico_Grupos> lst_KRS_ArbolJerarquico_Grupos_FILTRADO = lst_KRS_ArbolJerarquico_Grupos.Where(m => m.idPadre == null).ToList();

                    if (lst_KRS_ArbolJerarquico_Grupos_FILTRADO != null && lst_KRS_ArbolJerarquico_Grupos_FILTRADO.Count > 0)
                    {
                        foreach (KRS_ArbolJerarquico_Grupos mdl_KRS_ArbolJerarquico_Grupos in lst_KRS_ArbolJerarquico_Grupos_FILTRADO)
                        {
                            bol_Aceptar = Solicitud_Aceptar_ValidarGrupos_Recursivo(lst_KRS_ArbolJerarquico_Grupos, lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo, mdl_KRS_ArbolJerarquico_Grupos);
                        }
                    }
                }

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(Solicitud_Aceptar_ValidarGrupos), true);
            }

            return bol_Aceptar;
        }

        private bool Solicitud_Aceptar_ValidarGrupos_Recursivo(List<KRS_ArbolJerarquico_Grupos> _lst_KRS_ArbolJerarquico_Grupos,
                                                                List<INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo> _lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo,
                                                                KRS_ArbolJerarquico_Grupos _mdl_KRS_ArbolJerarquico_Grupos)
        {
            List<bool> lst_Respuesta_Aceptada = new List<bool>();
            bool bol_Aceptado = false;
            try
            {
                //Ver Si hay empleados dento del grupo primero
                if (_lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo != null && _lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo.Count > 0)
                {
                    List<INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo> lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo_FILTRADO = _lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo.Where(M => M.IdGrupo.Equals(_mdl_KRS_ArbolJerarquico_Grupos.id)).ToList();
                    if (lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo_FILTRADO != null && lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo_FILTRADO.Count > 0)
                    {
                        bool bol_Empleado = false;
                        foreach (INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo mdl_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo in lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo_FILTRADO)
                        {
                            if (_mdl_KRS_ArbolJerarquico_Grupos.tipoGrupo.Equals("Y"))
                            {
                                if (mdl_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo.FechaAceptacionCancelacion == null)
                                {
                                    bol_Empleado = false;
                                    break;
                                }
                                else
                                {
                                    bol_Empleado = true;
                                }
                            }
                            else
                            {
                                if (mdl_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo.FechaAceptacionCancelacion != null)
                                {
                                    bol_Empleado = true;
                                    break;
                                }
                                else
                                {
                                    bol_Empleado = false;
                                }
                            }
                        }

                        lst_Respuesta_Aceptada.Add(bol_Empleado);
                    }
                }


                //Grupos internos
                List<KRS_ArbolJerarquico_Grupos> lst_KRS_ArbolJerarquico_Grupos_FILTRADO = _lst_KRS_ArbolJerarquico_Grupos.Where(m => m.idPadre != null && m.idPadre == _mdl_KRS_ArbolJerarquico_Grupos.id).ToList();
                if (lst_KRS_ArbolJerarquico_Grupos_FILTRADO != null && lst_KRS_ArbolJerarquico_Grupos_FILTRADO.Count > 0)
                {
                    foreach (KRS_ArbolJerarquico_Grupos mdl_KRS_ArbolJerarquico_Grupos in lst_KRS_ArbolJerarquico_Grupos_FILTRADO)
                    {
                        lst_Respuesta_Aceptada.Add(Solicitud_Aceptar_ValidarGrupos_Recursivo(_lst_KRS_ArbolJerarquico_Grupos, _lst_INTERNO_AUX_ArbolJerarquico_GruposEmpleados_Validacion_Modelo, mdl_KRS_ArbolJerarquico_Grupos));
                    }
                }


                //Validar el Grupo
                if (lst_Respuesta_Aceptada.Count > 0)
                {
                    if (_mdl_KRS_ArbolJerarquico_Grupos.tipoGrupo.Equals("Y"))
                    {
                        if (lst_Respuesta_Aceptada.Exists(m => m == false))
                        {
                            bol_Aceptado = false;
                        }
                        else
                        {
                            bol_Aceptado = true;
                        }
                    }
                    else
                    {
                        if (lst_Respuesta_Aceptada.Exists(m => m == true))
                        {
                            bol_Aceptado = true;
                        }
                        else
                        {
                            bol_Aceptado = false;
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(P_Fichajes_Controladora) + "/" + nameof(Solicitud_Aceptar_ValidarGrupos), true);
            }

            return bol_Aceptado;
        }
        #endregion

    }
}
