using Exferia_Aplicacion.General;
using Exferia_Formularios;
using Exferia_General.General;
using Exferia_KairosPRO._1_Modelos;
using Exferia_KairosPRO._2_Datos;
using Exferia_KairosPRO.General;
using Exferia_KairosPRO_EF;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;

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

        //Clases de negocio necesarias
        private KRS_HorasExtrasLineas_Datos g_obj_KRS_HorasExtrasLineas_Datos = new KRS_HorasExtrasLineas_Datos();
        private KRS_AusenciasProgramadasTipos_Datos g_obj_KRS_AusenciasProgramadasTipos_Datos = new KRS_AusenciasProgramadasTipos_Datos();

        //Modelo necesarios
        private KRS_HorasExtrasLineas g_mdl_KRS_HorasExtrasLineas = null;

        //Listado de Gastos en memoria
        public List<KRS_HorasExtrasLineas> g_lst_KRS_HorasExtrasLineas = null;

        //El idHoraExtraCabecera de la pantalla
        public long g_lng_idHoraExtraCabecera;

        public bool g_bol_Termino_CargaDatos_Inicial = false;

        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;

        private List<INTERNO_KRS_HorasExtrasLineas_Listado_Modelo> g_lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo = null;

        #region Tareas Asincronas
        //Tarea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;
        public bool g_bol_Cargardatos_Termino = true;

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;

        //Tareea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;
        #endregion

        #endregion

        #region Constructor
        public P_HorasExtrasLinea_Controladora(P_HorasExtrasLinea _frm_P_HorasExtrasLinea, List<INTERNO_KRS_HorasExtrasLineas_Listado_Modelo> _lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo)
        {
            g_frm_P_HorasExtrasLinea = _frm_P_HorasExtrasLinea;
            g_lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo = _lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo;

            CargarCombos();

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Cargar datos de los comboBox
        private void CargarCombos()
        {
            //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_HorasExtrasLinea.Exferia_ComboBox_TiposDias.Items.Clear();
                g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposDias.DataSource = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo;
                g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposDias.SelectedIndex = 0;
            }

            //Tipos de ausenciasprogramdasTipos .......................................................................................................
            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_HorasExtrasLinea.Exferia_ComboBox_TiposAusenciasProgramadas.Items.Clear();
            g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposAusenciasProgramadas.DataSource = g_lst_AusenciasProgramadasTipos_INTERNO_ComboBox_Modelo;
            g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedIndex = 0;
            

        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //Modelo
            g_mdl_KRS_HorasExtrasLineas = null;

            //Tipos de dias
            g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposDias.SelectedIndex = 0;

            //Tipo de Ausenciaprogramda
            g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedIndex = 0;
            
            //Dias
            g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Lunes.Checked = false;
            g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Martes.Checked = false;
            g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Miercoles.Checked = false;
            g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Jueves.Checked = false;
            g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Viernes.Checked = false;
            g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Sabado.Checked = false;
            g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Domingo.Checked = false;

            //HoraInicio
            g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio.Text = "";

            //HoraFin
            g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraFin.Text = "";

            //horareal
            g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraReal.Text = "";

            //horacalculada
            g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraCalculada.Text = "";

            //ordenaplicacion
            g_frm_P_HorasExtrasLinea.Exferia_TextBox_OrdenAplicacion.Text = "1";

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

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

            g_frm_P_HorasExtrasLinea.P_Base_SeModificoDatosPantalla = false;
        }
        #endregion

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

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

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos != null)
                {
                    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.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = false;
                }

                //Vaciar
                VaciarDatos();

                g_bol_Cargardatos_Termino = false;

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

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

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

                g_bol_Cargardatos_Termino = true;

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(RecargarDatos), true);
            }
        }

        private void TareaAsincrona_CargarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                // Cargar Valores
                if (CargarDatos(g_frm_P_HorasExtrasLinea.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_HorasExtrasLinea_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.Message, ex, nameof(P_HorasExtrasLinea_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_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_HorasExtrasLinea.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)
                {
                    Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    g_frm_P_HorasExtrasLinea.Salir_P_Base();
                }
                else
                {
                    //Dias
                    if (g_mdl_KRS_HorasExtrasLineas.tipo.ToString().Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_DIA.Codigo))
                    {
                        g_frm_P_HorasExtrasLinea.Panel_TipoAusenciaProgramada.Visible = false;
                        g_frm_P_HorasExtrasLinea.Panel_Dias.Visible = true;
                    }
                    //Tipos de Ausencia programada
                    else if (g_mdl_KRS_HorasExtrasLineas.tipo.ToString().Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_TIPOAUSENCIAPROGRAMADA.Codigo))
                    {
                        g_frm_P_HorasExtrasLinea.Panel_Dias.Visible = false;
                        g_frm_P_HorasExtrasLinea.Panel_TipoAusenciaProgramada.Visible = true;
                    }
                    else
                    {
                        g_frm_P_HorasExtrasLinea.Panel_TipoAusenciaProgramada.Visible = false;
                        g_frm_P_HorasExtrasLinea.Panel_Dias.Visible = false;
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_HorasExtrasLinea.Salir_P_Base();
            }
            finally
            {
                g_bol_Cargardatos_Termino = true;
            }
        }

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

            try
            {
                g_mdl_KRS_HorasExtrasLineas = g_obj_KRS_HorasExtrasLineas_Datos.Obtener(_lng_id);

                //Si no es Nulo Cargo lo Datos
                if (g_mdl_KRS_HorasExtrasLineas != null)
                {
                    //tipo
                    g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposDias.SelectedItem = g_lst_TiposDiasHorasExtras_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_KRS_HorasExtrasLineas.tipo.ToString())).FirstOrDefault();

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

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

                    //horaInicio
                    g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio.Text = Funciones_KairosPRO.Convertir_TimeSpan_String(g_mdl_KRS_HorasExtrasLineas.horaInicio);

                    //horaFin
                    g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraFin.Text = Funciones_KairosPRO.Convertir_TimeSpan_String(g_mdl_KRS_HorasExtrasLineas.horaFin);

                    //horaCalculo
                    g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraCalculada.Text = g_mdl_KRS_HorasExtrasLineas.horaCalculo.ToString();

                    //horaReal
                    g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraReal.Text = g_mdl_KRS_HorasExtrasLineas.horaReal.ToString();

                    //ordenAplicacion
                    g_frm_P_HorasExtrasLinea.Exferia_TextBox_OrdenAplicacion.Text = g_mdl_KRS_HorasExtrasLineas.ordenAplicacion.ToString();

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

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

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

                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_HorasExtrasLinea.P_Base_TituloPantalla += " [" + str_ValorAMostrarFinal + "] -Modificar";
                        }
                    }

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

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos()
        {
            try
            {
                g_frm_P_HorasExtrasLinea.Enabled = false;
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_GRABANDODATOS());

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

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(GrabarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }

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

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

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_HorasExtrasLinea.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 tuvo el problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_HorasExtrasLinea, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }
                }
                else
                {
                    if (g_frm_P_HorasExtrasLinea.P_Base_PantallaOrigen != null)
                    {
                        //Devolder al Listado el Row Añadido/Modificado
                        List<object> lst_obj = new List<object>();
                        lst_obj.Add(g_frm_P_HorasExtrasLinea.g_mdl_PRV_OpcionesDetalle.opcion);
                        lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);

                        g_frm_P_HorasExtrasLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                        g_frm_P_HorasExtrasLinea.P_Base_SeModificoDatosPantalla = false;
                    }

                    g_frm_P_HorasExtrasLinea.Close();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

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


            try
            {

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

                // La hora de inicio no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_FechaHora_Respuesta = Funciones.Hora_Validacion(g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio.Text);

                    if (int_FechaHora_Respuesta == 1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_HorasExtrasLinea.Exferia_Label_HoraInicio.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio;
                    }
                    else if (int_FechaHora_Respuesta == 2)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_HorasExtrasLinea.Exferia_Label_HoraInicio.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio;
                    }
                }


                // La hora fin no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_FechaHora_Respuesta = Funciones.Hora_Validacion(g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraFin.Text);

                    if (int_FechaHora_Respuesta == 1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_HorasExtrasLinea.Exferia_Label_HoraFin.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraFin;
                    }
                    else if (int_FechaHora_Respuesta == 2)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_HorasExtrasLinea.Exferia_Label_HoraFin.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraFin;
                    }
                }

                // La hora real no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraReal.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO("horas");
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraReal;
                }

                // La hora calculada no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraCalculada.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO("horas");
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraCalculada;
                }

                //El orden de aplicacion no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_HorasExtrasLinea.Exferia_TextBox_OrdenAplicacion.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_HorasExtrasLinea.Exferia_Label_OrdenAplicacion.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_OrdenAplicacion;
                }

                //La hora inicio no puede ser mayor que la de fin
                TimeSpan? tms_HoraInicio = null;
                TimeSpan? tms_HoraFin = null;
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    tms_HoraInicio = TimeSpan.ParseExact(g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio.Text, "hh\\:mm", CultureInfo.InvariantCulture);
                    tms_HoraFin = TimeSpan.ParseExact(g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraFin.Text, "hh\\:mm", CultureInfo.InvariantCulture);

                    if (tms_HoraInicio> tms_HoraFin)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_KAIROSPROHORASEXTRAS_HORAINICIOMAYORHORAFIN(g_frm_P_HorasExtrasLinea.Exferia_Label_HoraInicio.Text, g_frm_P_HorasExtrasLinea.Exferia_Label_HoraFin.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio;
                    }
                }

                //Ver si hay coincidencias en otras lineas, segun el tipo y las horas de inicio y fin
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo != null &&
                    g_lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo.Count > 0)
                {
                    //Es de Tipo Dia
                    string str_Dia = "";
                    if (((INTERNO_ComboBox_Modelo)g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposDias.SelectedItem).Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_DIA.Codigo))
                    {
                        if (g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Lunes.Checked)
                        {
                            str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_LUNES;
                        }
                        else if (g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Martes.Checked)
                        {
                            str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MARTES;
                        }
                        else if (g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Miercoles.Checked)
                        {
                            str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_MIERCOLES;
                        }
                        else if (g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Jueves.Checked)
                        {
                            str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_JUEVES;
                        }
                        else if (g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Viernes.Checked)
                        {
                            str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_VIERNES;
                        }
                        else if (g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Sabado.Checked)
                        {
                            str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_SABADO;
                        }
                        else if (g_frm_P_HorasExtrasLinea.Exferia_CheckBox_Dia_Domingo.Checked)
                        {
                            str_Dia = Variables.G_STR_CALENDARIO_DIASEMANA_INICIAL_DOMINGO;
                        }
                    }

                    //Es de Tipo Ausenciaprogramada
                    long lng_idAusenciaProgramadaTipo = -1;
                    if (((INTERNO_ComboBox_Modelo)g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposDias.SelectedItem).Identificador.Equals(Variables_KairosPRO.G_MDL_TIPOHORAEXTRA_TIPOAUSENCIAPROGRAMADA.Codigo))
                    {
                        lng_idAusenciaProgramadaTipo = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposAusenciasProgramadas.SelectedItem).Identificador);
                    }

                    //Filtrar la Consulta
                    List<INTERNO_KRS_HorasExtrasLineas_Listado_Modelo> lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo_FILTRADO = g_lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo.Where(m => (g_mdl_KRS_HorasExtrasLineas!=null ? m.id!= g_mdl_KRS_HorasExtrasLineas.id : 1==1) &&
                                                                                                                                                                                                 (lng_idAusenciaProgramadaTipo!=-1 ? (m.idAusenciaProgramadaTipo!=null && m.idAusenciaProgramadaTipo.Value.Equals(lng_idAusenciaProgramadaTipo)) : 1 == 1) &&
                                                                                                                                                                                                 (str_Dia.Trim().Length > 0 ? (m.dia != null && m.dia.Equals(str_Dia)) : 1 == 1) &&
                                                                                                                                                                                                 (m.tipo == int.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposDias.SelectedItem).Identificador)))
                                                                                                                                                                                      .ToList();

                    if (lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo_FILTRADO!=null && 
                        lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo_FILTRADO.Count>0)
                    {
                        foreach (INTERNO_KRS_HorasExtrasLineas_Listado_Modelo mdl_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo in lst_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo_FILTRADO)
                        {
                            //Si la hora de inicio del registro actual esta por encima de la hora de inicio del registro de BD y por debajo de la hora fin del registro de base de datos
                            if (tms_HoraInicio.Value>= mdl_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo.horaInicio &&
                                tms_HoraInicio.Value<= mdl_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo.horaFin)
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_KAIROSPROHORASEXTRAS_HORASDENTRORANGOOTRAS(g_frm_P_HorasExtrasLinea.Exferia_Label_HoraInicio.Text);
                                mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio;

                                break;
                            }
                            //Si la hora fin del registro actual esta por encima de la hora de inicio del registro de BD y por debajo de la hora fin del registro de base de datos
                            else if ( tms_HoraFin.Value >= mdl_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo.horaInicio &&
                                      tms_HoraFin.Value <= mdl_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo.horaFin)
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_KAIROSPROHORASEXTRAS_HORASDENTRORANGOOTRAS(g_frm_P_HorasExtrasLinea.Exferia_Label_HoraFin.Text);
                                mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraFin;

                                break;
                            }
                            //Si la hora de inicio del registro actual esta por debajo de la hora de inicio del registro de BD y la hora fin esta por encima de la hora fin del registro de base de datos
                            else if (tms_HoraInicio.Value <= mdl_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo.horaInicio &&
                                     tms_HoraFin.Value >= mdl_INTERNO_KRS_HorasExtrasLineas_Listado_Modelo.horaFin)
                            {
                                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_KAIROSPROHORASEXTRAS_HORASDENTRORANGOOTRAS(g_frm_P_HorasExtrasLinea.Exferia_Label_HoraInicio.Text);
                                mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio;

                                break;
                            }
                        }
                    }
                }
            }
            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.Message, ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(ValidarDatos));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                KRS_HorasExtrasLineas mdl_KRS_HorasExtrasLineas = new KRS_HorasExtrasLineas();

                //id
                mdl_KRS_HorasExtrasLineas.id = g_mdl_KRS_HorasExtrasLineas != null ? g_mdl_KRS_HorasExtrasLineas.id : -1;

                //codigoCliente
                mdl_KRS_HorasExtrasLineas.codigoCliente = Variables.G_LNG_IDCLIENTE_LICENCIAVALIDADO;

                //idHoraExtraCabecera
                mdl_KRS_HorasExtrasLineas.idHoraExtraCabecera = g_lng_idHoraExtraCabecera;

                //tipo
                mdl_KRS_HorasExtrasLineas.tipo = int.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_HorasExtrasLinea.Exferia_ComboBox_TiposDias.SelectedItem).Identificador);

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

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

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

                //horaReal
                mdl_KRS_HorasExtrasLineas.horaReal = Convert.ToDecimal(g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraReal.Text.Trim());

                //horaCalculo
                mdl_KRS_HorasExtrasLineas.horaCalculo = Convert.ToDecimal(g_frm_P_HorasExtrasLinea.Exferia_TextBox_HoraExtraCalculada.Text.Trim());

                //horaInicio
                mdl_KRS_HorasExtrasLineas.horaInicio = TimeSpan.ParseExact(g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraInicio.Text, "hh\\:mm", CultureInfo.InvariantCulture);

                //horaFin
                mdl_KRS_HorasExtrasLineas.horaFin = TimeSpan.ParseExact(g_frm_P_HorasExtrasLinea.Exferia_TextBox_ConMascara_HoraFin.Text, "hh\\:mm", CultureInfo.InvariantCulture);

                //ordenAplicacion
                mdl_KRS_HorasExtrasLineas.ordenAplicacion = int.Parse(g_frm_P_HorasExtrasLinea.Exferia_TextBox_OrdenAplicacion.Text);

                //Grabamos el modelo ya relleno
                mdl_ValorDevuelto_Modelo = g_obj_KRS_HorasExtrasLineas_Datos.Grabar(mdl_KRS_HorasExtrasLineas);

                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo.Objeto = g_lst_KRS_HorasExtrasLineas;
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(GrabarDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Datos
        public void BorrarDatos()
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_HorasExtrasLinea.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    g_obj_TareaAsincrona_BorrarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Completed);
                    g_obj_TareaAsincrona_BorrarDatos.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_HorasExtrasLinea.Enabled = true;

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

            try
            {
                mdl_ValorDevuelto_Modelo = BorrarDatos_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_HorasExtrasLinea.Enabled = true;

            try
            {


                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Resultado = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    if (g_frm_P_HorasExtrasLinea.P_Base_PantallaOrigen != null)
                    {
                        List<object> lst_obj = new List<object>();
                        mdl_ValorDevuelto_Modelo_Resultado.Listado_Id = new List<long>();
                        mdl_ValorDevuelto_Modelo_Resultado.Listado_Id.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                        lst_obj.Add(g_frm_P_HorasExtrasLinea.g_mdl_PRV_OpcionesDetalle.opcion);
                        lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                        g_frm_P_HorasExtrasLinea.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    g_frm_P_HorasExtrasLinea.Close();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    mdl_ValorDevuelto_Modelo = g_obj_KRS_HorasExtrasLineas_Datos.Borrar(g_mdl_KRS_HorasExtrasLineas != null ? g_mdl_KRS_HorasExtrasLineas.id : -1);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Termino Transaccion
                        transaccion_SQL.Complete();
                    }

                    return mdl_ValorDevuelto_Modelo;
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_HorasExtrasLinea_Controladora) + "/" + nameof(BorrarDatos_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_ValorDevuelto_Modelo;
        }
        #endregion
    }
}
