using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General._0_Modelos;
using Exferia_General._1_Datos;
using Exferia_General._3_Vistas.ControlesPersonalizados_DentroPaneles;
using Exferia_General._3_Vistas.ListadosSeleccion;
using Exferia_General.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_General._3_Vistas.Controladoras
{
    public class P_Empresa_Ejercicio_Controladora
    {

        #region Variables Generales
        private P_Empresa_Ejercicio g_frm_P_Empresa_Ejercicio = 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

        private GEN_EjerciciosActivos_Empresa_Datos g_obj_GEN_EjerciciosActivos_Empresa_Datos = new GEN_EjerciciosActivos_Empresa_Datos();

        private GEN_EjerciciosActivos_Empresa g_mdl_GEN_EjerciciosActivos_Empresa = null;//Modelo de los datos cargados

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

        private INTERNO_GEN_Empresas_Modelo g_mdl_INTERNO_GEN_Empresas_Modelo = null;
        private GTT_ConfiguracionEnteAEAT g_mdl_GTT_ConfiguracionEnteAEAT = null;
        private List<INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo> g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo = null;

        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        private bool g_bol_GrabarDatos_TerminoCorrectamente = true;

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

        private List<INTERNO_ComboBox_Modelo> g_lst_PerfilesFuncionalidad_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();
        private List<INTERNO_ComboBox_Modelo> g_lst_TiposRecursos_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();
        private List<INTERNO_ComboBox_Modelo> g_lst_TiposNotificaciones_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();

        #endregion

        #region Constructor
        public P_Empresa_Ejercicio_Controladora(P_Empresa_Ejercicio _frm_P_Empresa_Ejercicio,
                                                INTERNO_GEN_Empresas_Modelo _mdl_INTERNO_GEN_Empresas_Modelo,
                                                List<INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo> _lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo)
        {
            g_frm_P_Empresa_Ejercicio = _frm_P_Empresa_Ejercicio;
            g_mdl_INTERNO_GEN_Empresas_Modelo = _mdl_INTERNO_GEN_Empresas_Modelo;
            g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo = _lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo;

            Cargar_DatosIniciales();
                
            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        private void Cargar_DatosIniciales()
        {
            try
            {
                // Exferia_ComboBox_PerfilesFuncionalidad
                GEN_PerfilesFuncionalidad_Datos obj_GEN_PerfilesFuncionalidad_Datos = new GEN_PerfilesFuncionalidad_Datos();
                List<INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo> lst_INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo = obj_GEN_PerfilesFuncionalidad_Datos.Obtener_Listado();

                if (lst_INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo != null && lst_INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo.Count > 0)
                {
                    foreach(INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo mdl_INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo in lst_INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo)
                    {
                        g_lst_PerfilesFuncionalidad_INTERNO_ComboBox_Modelo.Add(new INTERNO_ComboBox_Modelo(mdl_INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo.id.ToString(), mdl_INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo.descripcion, mdl_INTERNO_GEN_PerfilesFuncionalidad_Listado_Modelo.fechaBorrado));
                    }
                }
                if (g_lst_PerfilesFuncionalidad_INTERNO_ComboBox_Modelo != null && g_lst_PerfilesFuncionalidad_INTERNO_ComboBox_Modelo.Count > 0)
                {
                    g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.Items.Clear();
                    g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.DataSource = g_lst_PerfilesFuncionalidad_INTERNO_ComboBox_Modelo;
                    g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.SelectedIndex = 0;
                }

                //Tipos de Recursos
                g_lst_TiposRecursos_INTERNO_ComboBox_Modelo = ListadosEstaticos.Devolver_TiposRecursos();
                if (g_lst_TiposRecursos_INTERNO_ComboBox_Modelo != null && g_lst_TiposRecursos_INTERNO_ComboBox_Modelo.Count > 0)
                {
                    g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoRecurso.Items.Clear();
                    g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoRecurso.DataSource = g_lst_TiposRecursos_INTERNO_ComboBox_Modelo;
                    g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoRecurso.SelectedIndex = 0;
                }

                //Tipos de Notificaciones
                g_lst_TiposNotificaciones_INTERNO_ComboBox_Modelo = ListadosEstaticos_Combos.Devolver_Tipos_Notificacion();
                if (g_lst_TiposNotificaciones_INTERNO_ComboBox_Modelo != null && g_lst_TiposNotificaciones_INTERNO_ComboBox_Modelo.Count > 0)
                {
                    g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoNotificacion.Items.Clear();
                    g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoNotificacion.DataSource = g_lst_TiposNotificaciones_INTERNO_ComboBox_Modelo;
                    g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoNotificacion.SelectedIndex = 0;
                }

            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_Ejercicio_Controladora) + "/" + nameof(Cargar_DatosIniciales));
            }
        }
        #endregion

        #region Vaciar datos
        public void VaciarDatos()
        {
            g_mdl_GEN_EjerciciosActivos_Empresa = null;
            g_mdl_GTT_ConfiguracionEnteAEAT = null;

            //Anyo control
            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_AnyoControl.Text = "";
            
            //descripcion
            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_Descripcion.Text = "";
            
            //Temporada Inicio
            g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio.Exferia_FechaSeleccion_Fecha = "";
            
            //Temporada Fin
            g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin.Exferia_FechaSeleccion_Fecha = "";
            
            //Cierre administrativo
            g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreAdministrativo.Exferia_FechaSeleccion_Fecha = "";
            
            //Cierre Contable
            g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreContable.Exferia_FechaSeleccion_Fecha = "";

            //perfil de Funcionalidad
            g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.SelectedIndex = 0;

            //Moneda
            g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Id = -1;
            g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Codigo = "";
            g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Descripcion = "";
            g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_FechaBorrado = null;

            //Impuesto
            g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Id = -1;
            g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Codigo = "";
            g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Descripcion = "";
            g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_FechaBorrado = null;

            //recargo
            g_frm_P_Empresa_Ejercicio.Exferia_CheckBox_RecargoEquivalencia.Checked = false;
            
            //Autorizacion pedido de compra automatico
            g_frm_P_Empresa_Ejercicio.Exferia_CheckBox_AutorizarPedidoCompraAutomatico.Checked = false;

            //Autorizacion pedido de venta automatico
            g_frm_P_Empresa_Ejercicio.Exferia_CheckBox_AutorizarPedidoVentaAutomatico.Checked = false;

            //CodigoOficinaLiquidadora
            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_CodigoOficinaLiquidadora.Text = "";
            
            //CodigoOrganoDictadorAcuerdo
            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_CodigoOrganoDictadorAcuerdo.Text = "";
            
            //PeriodoPrescripcion
            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_PeriodoPrescripcion.Text = "";
            
            //NumeroOrdenLiquidacionInicial
            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_NumeroOrdenLiquidacionInicial.Text = "";
            
            //TipoRecurso
            g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoRecurso.SelectedIndex = 0;
            
            //TipoNotificacion
            g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoNotificacion.SelectedIndex = 0;
            
            //FechaNotificacion
            g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaNotificacion.Exferia_FechaSeleccion_Fecha = "";
            
            //FechaVencimientoVoluntaria
            g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaVencimientoVoluntaria.Exferia_FechaSeleccion_Fecha = "";
            
            //FechaCertificacionProvidenciaApremio
            g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaCertificacionProvidenciaApremio.Exferia_FechaSeleccion_Fecha = "";

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_Empresa_Ejercicio.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_Empresa_Ejercicio.P_Base_TituloPantalla = (g_frm_P_Empresa_Ejercicio.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_Empresa_Ejercicio.Tag.ToString());
            //#################################################################################################

            g_mdl_GEN_EjerciciosActivos_Empresa = null;
        }
        #endregion

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

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

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        #endregion

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Empresa_Ejercicio.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();

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Empresa_Ejercicio.Enabled = true;
                g_bol_Termino_CargaDatos_Inicial = 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_Empresa_Ejercicio_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_Empresa_Ejercicio.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, nameof(P_Empresa_Ejercicio_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_Empresa_Ejercicio_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;
            }

            //Desbloquear el Formulario
            g_frm_P_Empresa_Ejercicio.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_Empresa_Ejercicio.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Ejercicio_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Empresa_Ejercicio.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                Funciones.Poner_Foco_Objeto(g_frm_P_Empresa_Ejercicio, g_frm_P_Empresa_Ejercicio.Exferia_TextBox_AnyoControl);
            }
        }

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

            try
            {
                g_mdl_GEN_EjerciciosActivos_Empresa = g_obj_GEN_EjerciciosActivos_Empresa_Datos.Obtener(_lng_id);

                //Si no es Nulo Cargo los Datos
                if (g_mdl_GEN_EjerciciosActivos_Empresa != null)
                {
                    //Paginador ..................................................................................
                    if (g_frm_P_Empresa_Ejercicio.P_Base_PantallaOrigen != null &&
                       g_frm_P_Empresa_Ejercicio.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                       g_frm_P_Empresa_Ejercicio.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_GEN_EjerciciosActivos_Empresa.id;
                        int int_PaginaDelObjeto = g_frm_P_Empresa_Ejercicio.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_Empresa_Ejercicio.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

                        g_frm_P_Empresa_Ejercicio.g_obj_Funciones_Paginador.SetPaginaActual(int_PaginaDelObjeto);
                        //Asignanado al paginador la pagina actual
                        g_frm_P_Empresa_Ejercicio.Exferia_Paginador_Ejercicios.PaginaActual = g_frm_P_Empresa_Ejercicio.g_obj_Funciones_Paginador.GetPaginaActual();
                    }
                    //.............................................................................................

                    //anioControl
                    g_frm_P_Empresa_Ejercicio.Exferia_TextBox_AnyoControl.Text = g_mdl_GEN_EjerciciosActivos_Empresa.anioControl.ToString();

                    //descripcion
                    g_frm_P_Empresa_Ejercicio.Exferia_TextBox_Descripcion.Text = g_mdl_GEN_EjerciciosActivos_Empresa.descripcion;

                    //temporadaFechaInicio
                    g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio.Exferia_FechaSeleccion_Fecha = g_mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaInicio.ToString("dd/MM/yyyy");

                    //temporadaFechaFin
                    g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin.Exferia_FechaSeleccion_Fecha = g_mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin.ToString("dd/MM/yyyy");

                    //cierreAdministrativo
                    if (g_mdl_GEN_EjerciciosActivos_Empresa.cierreAdministrativo!=null)
                    {
                        g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreAdministrativo.Exferia_FechaSeleccion_Fecha = g_mdl_GEN_EjerciciosActivos_Empresa.cierreAdministrativo.Value.ToString("dd/MM/yyyy");
                    }

                    //cierreContable
                    if (g_mdl_GEN_EjerciciosActivos_Empresa.cierreContable != null)
                    {
                        g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreContable.Exferia_FechaSeleccion_Fecha = g_mdl_GEN_EjerciciosActivos_Empresa.cierreContable.Value.ToString("dd/MM/yyyy");
                    }

                    //perfil de Funcionalidad
                    if (g_lst_PerfilesFuncionalidad_INTERNO_ComboBox_Modelo != null && g_lst_PerfilesFuncionalidad_INTERNO_ComboBox_Modelo.Count > 0)
                    {
                        g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.SelectedItem = g_lst_PerfilesFuncionalidad_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_GEN_EjerciciosActivos_Empresa.idPerfilFuncionalidad.ToString())).FirstOrDefault();
                    }

                    //Moneda 
                    if (g_mdl_GEN_EjerciciosActivos_Empresa.GEN_Monedas!=null)
                    {
                        g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Id = g_mdl_GEN_EjerciciosActivos_Empresa.GEN_Monedas.id;
                        g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Codigo = g_mdl_GEN_EjerciciosActivos_Empresa.GEN_Monedas.moneda;
                        g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Descripcion = g_mdl_GEN_EjerciciosActivos_Empresa.GEN_Monedas.descripcion;
                        g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_FechaBorrado = g_mdl_GEN_EjerciciosActivos_Empresa.GEN_Monedas.fechaBorrado;
                    }

                    //Impuesto 
                    if (g_mdl_GEN_EjerciciosActivos_Empresa.GEN_ImpuestosCabecera != null)
                    {
                        g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Id = g_mdl_GEN_EjerciciosActivos_Empresa.GEN_ImpuestosCabecera.id;
                        g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Codigo = g_mdl_GEN_EjerciciosActivos_Empresa.GEN_ImpuestosCabecera.codigo;
                        g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Descripcion = g_mdl_GEN_EjerciciosActivos_Empresa.GEN_ImpuestosCabecera.descripcion;
                        g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_FechaBorrado = g_mdl_GEN_EjerciciosActivos_Empresa.GEN_ImpuestosCabecera.fechaBorrado;
                    }

                    //recargo
                    g_frm_P_Empresa_Ejercicio.Exferia_CheckBox_RecargoEquivalencia.Checked= g_mdl_GEN_EjerciciosActivos_Empresa.recargo!=null ? g_mdl_GEN_EjerciciosActivos_Empresa.recargo.Value : false;

                    //autorizarPedidoCompraAutomatico
                    g_frm_P_Empresa_Ejercicio.Exferia_CheckBox_AutorizarPedidoCompraAutomatico.Checked = g_mdl_GEN_EjerciciosActivos_Empresa.autorizarPedidoCompraAutomatico != null ? g_mdl_GEN_EjerciciosActivos_Empresa.autorizarPedidoCompraAutomatico.Value : false;

                    //autorizarPedidoVentaAutomatico
                    g_frm_P_Empresa_Ejercicio.Exferia_CheckBox_AutorizarPedidoVentaAutomatico.Checked = g_mdl_GEN_EjerciciosActivos_Empresa.autorizarPedidoVentaAutomatico != null ? g_mdl_GEN_EjerciciosActivos_Empresa.autorizarPedidoVentaAutomatico.Value : false;

                    //Configuracion Ente AEAT ######################################################
                    if (g_mdl_GEN_EjerciciosActivos_Empresa.GTT_ConfiguracionEnteAEAT != null)
                    {
                        g_mdl_GTT_ConfiguracionEnteAEAT = g_mdl_GEN_EjerciciosActivos_Empresa.GTT_ConfiguracionEnteAEAT.FirstOrDefault();

                        if (g_mdl_GTT_ConfiguracionEnteAEAT != null)
                        {
                            //codigoOficinaLiquidacion
                            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_CodigoOficinaLiquidadora.Text = g_mdl_GTT_ConfiguracionEnteAEAT.codigoOficinaLiquidacion != null ? g_mdl_GTT_ConfiguracionEnteAEAT.codigoOficinaLiquidacion.Value.ToString() : "";

                            //codigoOrganoDictadorAcuerdo
                            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_CodigoOrganoDictadorAcuerdo.Text = g_mdl_GTT_ConfiguracionEnteAEAT.codigoOrganoDictadorAcuerdo;
                            
                            //periodoPrescripcionMeses
                            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_PeriodoPrescripcion.Text = g_mdl_GTT_ConfiguracionEnteAEAT.periodoPrescripcionMeses != null ? g_mdl_GTT_ConfiguracionEnteAEAT.periodoPrescripcionMeses.Value.ToString() : "";
                            
                            //numeroOrdenLiquidacionInicial
                            g_frm_P_Empresa_Ejercicio.Exferia_TextBox_NumeroOrdenLiquidacionInicial.Text = g_mdl_GTT_ConfiguracionEnteAEAT.numeroOrdenLiquidacionInicial != null ? g_mdl_GTT_ConfiguracionEnteAEAT.numeroOrdenLiquidacionInicial.Value.ToString() : "";
                            
                            //tipoRecurso
                            if (g_mdl_GTT_ConfiguracionEnteAEAT.tipoRecurso!=null && g_lst_TiposRecursos_INTERNO_ComboBox_Modelo != null && g_lst_TiposRecursos_INTERNO_ComboBox_Modelo.Count > 0)
                            {
                                g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoRecurso.SelectedItem = g_lst_TiposRecursos_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_GTT_ConfiguracionEnteAEAT.tipoRecurso)).FirstOrDefault();
                            }
                            
                            //tipoNotificacion
                            if (g_mdl_GTT_ConfiguracionEnteAEAT.tipoNotificacion_PermanenciaGeneral != null && g_lst_TiposNotificaciones_INTERNO_ComboBox_Modelo != null && g_lst_TiposNotificaciones_INTERNO_ComboBox_Modelo.Count > 0)
                            {
                                g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoNotificacion.SelectedItem = g_lst_TiposNotificaciones_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_GTT_ConfiguracionEnteAEAT.tipoNotificacion_PermanenciaGeneral)).FirstOrDefault();
                            }

                            //Fecha Notificacion
                            if (g_mdl_GTT_ConfiguracionEnteAEAT.fechaNotificacion_PermanenciaGeneral != null)
                            {
                                g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaNotificacion.Exferia_FechaSeleccion_Fecha = g_mdl_GTT_ConfiguracionEnteAEAT.fechaNotificacion_PermanenciaGeneral.Value.ToString("dd/MM/yyyy");
                            }

                            //Fecha Vencimiento voluntaria
                            if (g_mdl_GTT_ConfiguracionEnteAEAT.fechaVencimientoVoluntario_PermanenciaGeneral != null)
                            {
                                g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaVencimientoVoluntaria.Exferia_FechaSeleccion_Fecha = g_mdl_GTT_ConfiguracionEnteAEAT.fechaVencimientoVoluntario_PermanenciaGeneral.Value.ToString("dd/MM/yyyy");
                            }

                            //Fecha Certificacion Providencia de Apremio
                            if (g_mdl_GTT_ConfiguracionEnteAEAT.fechaCertificacionProvidenciaApremio != null)
                            {
                                g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaCertificacionProvidenciaApremio.Exferia_FechaSeleccion_Fecha = g_mdl_GTT_ConfiguracionEnteAEAT.fechaCertificacionProvidenciaApremio.Value.ToString("dd/MM/yyyy");
                            }
                        }
                    }

                    //Mostrar Campo en el Titulo de mantenimiento
                    string str_MenuSuperior_Codigo = "";
                    if (g_frm_P_Empresa_Ejercicio.g_mdl_INTERNO_OpcionesDetalle_Modelo!= null &&
                       g_frm_P_Empresa_Ejercicio.g_mdl_INTERNO_OpcionesDetalle_Modelo.camposMostrar_TituloMantenimiento != null &&
                       g_frm_P_Empresa_Ejercicio.g_mdl_INTERNO_OpcionesDetalle_Modelo.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de Campos
                        string[] arr_Campos = g_frm_P_Empresa_Ejercicio.g_mdl_INTERNO_OpcionesDetalle_Modelo.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_Empresa_Ejercicio.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_Empresa_Ejercicio.P_Base_TituloPantalla = (g_frm_P_Empresa_Ejercicio.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }

                        dynamic dnm_Objeto = g_mdl_GEN_EjerciciosActivos_Empresa;
                        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;
                            }

                            //anyocontrol
                            if (str_campo.Equals(nameof(g_mdl_GEN_EjerciciosActivos_Empresa.anioControl)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_GEN_EjerciciosActivos_Empresa.anioControl;
                            }
                            //descripcion
                            else if (str_campo.Equals(nameof(g_mdl_GEN_EjerciciosActivos_Empresa.descripcion)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_GEN_EjerciciosActivos_Empresa.descripcion.ToString();
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Empresa_Ejercicio.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_Empresa_Ejercicio.Tag.ToString(), str_MenuSuperior_Codigo);

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos()
        {
            try
            {
                g_bol_GrabarDatos_TerminoCorrectamente = true;

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

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_bol_GrabarDatos_TerminoCorrectamente = false;

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

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

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

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Ejercicio_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_Empresa_Ejercicio.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)
                {
                    g_bol_GrabarDatos_TerminoCorrectamente = 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_Empresa_Ejercicio, mdl_ValorDevuelto_Modelo_Resultado.Objeto);

                            //Si tuviera valor se cambia
                            if (mdl_ValorDevuelto_Modelo_Resultado.Valor_Anterior != null)
                            {
                                g_bol_Termino_CargaDatos_Inicial = false;
                                Funciones.Poner_Valor_Objeto(mdl_ValorDevuelto_Modelo_Resultado.Objeto, mdl_ValorDevuelto_Modelo_Resultado.Valor_Anterior);
                                g_bol_Termino_CargaDatos_Inicial = true;
                            }
                        }
                    }
                }
                else
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_Empresa_Ejercicio.g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    g_frm_P_Empresa_Ejercicio.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Empresa_Ejercicio.P_Base_SeModificoDatosPantalla = false;

                    //Salir
                    g_frm_P_Empresa_Ejercicio.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Ejercicio_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
            {
                // Debe Tener un Año seleccionado
                if (g_frm_P_Empresa_Ejercicio.Exferia_TextBox_AnyoControl.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empresa_Ejercicio.Exferia_Label_AnyoControl.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_TextBox_AnyoControl;
                }

                // El año de control debe ser correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto &&
                    (g_frm_P_Empresa_Ejercicio.Exferia_TextBox_AnyoControl.Text.Trim().Length < 4 || 
                    int.Parse(g_frm_P_Empresa_Ejercicio.Exferia_TextBox_AnyoControl.Text.Trim()) < 1900))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_INCORRECTO(g_frm_P_Empresa_Ejercicio.Exferia_Label_AnyoControl.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_TextBox_AnyoControl;
                }

                // Debe Tener una Descripcion
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && 
                    g_frm_P_Empresa_Ejercicio.Exferia_TextBox_Descripcion.Text.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empresa_Ejercicio.Exferia_Label_Descripcion.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_TextBox_Descripcion;
                }

                // Fecha Temporada Inicio no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

                    if (int_fechaAlta_Respuesta == 1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio;
                    }
                    else if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio;
                    }
                }

                // Fecha Temporada Fin no puede estar vacia
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

                    if (int_fechaAlta_Respuesta == 1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin;
                    }
                    else if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin;
                    }
                }

                // Si hay Moneda de envio validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Impuesto de envio validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    //Fecha convertidas a datetime
                    DateTime dtt_Desde = DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                    DateTime dtt_Hasta = DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                    // Validar que la fecha inicio no pueda ser mayor que la fecha fin
                    if (dtt_Hasta != null && dtt_Desde > dtt_Hasta)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_FECHASINTERVALOINCORRECTO(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio.Exferia_FechaSeleccion_Descripcion, g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio;
                    }
                }

                //Fecha de Cierre Administrativo
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreAdministrativo.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));
                    if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreAdministrativo.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreAdministrativo;
                    }
                }

                //Fecha de Cierre Contable
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreContable.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));
                    if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreContable.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreContable;
                    }
                }

                //Tiene que tener un Perfil seleccionado
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    long lng_ValorDevuelto = -1;
                    if ((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.SelectedItem != null &&
                      !((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.SelectedItem).Identificador.Equals("-1"))
                    {
                        lng_ValorDevuelto = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.SelectedItem).Identificador);
                    }

                    if (lng_ValorDevuelto<0)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_NOSELECCIONADO(g_frm_P_Empresa_Ejercicio.Exferia_Label_PerfilFuncionalidad.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad;
                    }
                }

               //Las fechas no puede estar contenida en otra fecha de ejercicio diferente ...............................
               if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
               {
                    DateTime dtt_Desde = DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                    DateTime dtt_Hasta = DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                    if (g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo != null)
                    {
                        foreach (INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_AUX in g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo)
                        {
                            if ((g_mdl_GEN_EjerciciosActivos_Empresa != null && g_mdl_GEN_EjerciciosActivos_Empresa.id != mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_AUX.id) ||
                                g_mdl_GEN_EjerciciosActivos_Empresa == null)
                            {
                                DateTime dtt_Desde_Auxiliar = mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_AUX.temporadaFechaInicio;
                                DateTime dtt_Hasta_Auxiliar = mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_AUX.temporadaFechaFin;

                                if ((dtt_Desde >= dtt_Desde_Auxiliar && dtt_Desde <= dtt_Hasta_Auxiliar) ||
                                    (dtt_Hasta >= dtt_Desde_Auxiliar && dtt_Hasta <= dtt_Hasta_Auxiliar))
                                {
                                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_VALIDACION_FECHASEJERCICIOS_FECHACONTENIDADENTRODEOTRA();
                                    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, nameof(P_Empresa_Ejercicio_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();

            //Iniciar transaccion
            using (TransactionScope obj_TransactionScope = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    GEN_EjerciciosActivos_Empresa mdl_GEN_EjerciciosActivos_Empresa = new GEN_EjerciciosActivos_Empresa();
                    long lng_idEjercicio = -1;
                    DateTime? dtt_fechaNula = null;
                    int? int_Nulo = null;

                    //id
                    mdl_GEN_EjerciciosActivos_Empresa.id = g_mdl_GEN_EjerciciosActivos_Empresa != null ? g_mdl_GEN_EjerciciosActivos_Empresa.id : -1;

                    //idEmpresa
                    mdl_GEN_EjerciciosActivos_Empresa.idEmpresa = g_mdl_INTERNO_GEN_Empresas_Modelo.id;

                    // Año control
                    mdl_GEN_EjerciciosActivos_Empresa.anioControl = g_frm_P_Empresa_Ejercicio.Exferia_TextBox_AnyoControl.Text;

                    // Descripcion
                    mdl_GEN_EjerciciosActivos_Empresa.descripcion = g_frm_P_Empresa_Ejercicio.Exferia_TextBox_Descripcion.Text;

                    // Perfil Funcionalidad
                    long lng_idPerfilFuncionalidad = -1;
                    if ((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.SelectedItem != null &&
                      !((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.SelectedItem).Identificador.Equals("-1"))
                    {
                        lng_idPerfilFuncionalidad = long.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_PerfilFuncionalidad.SelectedItem).Identificador);
                    }
                    mdl_GEN_EjerciciosActivos_Empresa.idPerfilFuncionalidad = lng_idPerfilFuncionalidad;

                    //Fecha Inicio
                    mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaInicio = DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaInicio.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                    //Fecha Fin
                    mdl_GEN_EjerciciosActivos_Empresa.temporadaFechaFin = DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_TemporadaFin.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture); ;

                    //Moneda
                    if (g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Id > 0)
                    {
                        mdl_GEN_EjerciciosActivos_Empresa.idMoneda = g_frm_P_Empresa_Ejercicio.Exferia_F3_Moneda.Exferia_F3_Id;
                    }
                    else
                    {
                        mdl_GEN_EjerciciosActivos_Empresa.idMoneda = null;
                    }

                    //Impuesto
                    if (g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Id > 0)
                    {
                        mdl_GEN_EjerciciosActivos_Empresa.idImpuestoCabecera = g_frm_P_Empresa_Ejercicio.Exferia_F3_Impuesto.Exferia_F3_Id;
                    }
                    else
                    {
                        mdl_GEN_EjerciciosActivos_Empresa.idImpuestoCabecera = null;
                    }

                    //Recargo
                    mdl_GEN_EjerciciosActivos_Empresa.recargo = g_frm_P_Empresa_Ejercicio.Exferia_CheckBox_RecargoEquivalencia.Checked;

                    //Autorizar pedido Compra automatico
                    mdl_GEN_EjerciciosActivos_Empresa.autorizarPedidoCompraAutomatico = g_frm_P_Empresa_Ejercicio.Exferia_CheckBox_AutorizarPedidoCompraAutomatico.Checked;

                    //Autorizar pedido Venta automatico
                    mdl_GEN_EjerciciosActivos_Empresa.autorizarPedidoVentaAutomatico = g_frm_P_Empresa_Ejercicio.Exferia_CheckBox_AutorizarPedidoVentaAutomatico.Checked;

                    //Cierre Administrativo
                    mdl_GEN_EjerciciosActivos_Empresa.cierreAdministrativo = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreAdministrativo.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "" ? DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreAdministrativo.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : dtt_fechaNula;

                    //Cierre Contable
                    mdl_GEN_EjerciciosActivos_Empresa.cierreContable = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreContable.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "" ? DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_CierreContable.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : dtt_fechaNula; ;

                    // GRABAR
                    mdl_ValorDevuelto_Modelo = g_obj_GEN_EjerciciosActivos_Empresa_Datos.Grabar(mdl_GEN_EjerciciosActivos_Empresa);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        // Obtenemos el idEjercicio
                        lng_idEjercicio = mdl_ValorDevuelto_Modelo.Id;

                        #region CONFIGURACION ENTE AEAT
                        GTT_ConfiguracionEnteAEAT mdl_GTT_ConfiguracionEnteAEAT = new GTT_ConfiguracionEnteAEAT();

                        //Configuracion AEAT
                        // id
                        mdl_GTT_ConfiguracionEnteAEAT.id = g_mdl_GTT_ConfiguracionEnteAEAT != null ? g_mdl_GTT_ConfiguracionEnteAEAT.id : -1;

                        // idEjercicio
                        mdl_GTT_ConfiguracionEnteAEAT.idEjercicio = lng_idEjercicio;

                        // codigoOficinaLiquidacion
                        mdl_GTT_ConfiguracionEnteAEAT.codigoOficinaLiquidacion = g_frm_P_Empresa_Ejercicio.Exferia_TextBox_CodigoOficinaLiquidadora.Text.Trim().Length > 0 ? int.Parse(g_frm_P_Empresa_Ejercicio.Exferia_TextBox_CodigoOficinaLiquidadora.Text) : int_Nulo;

                        // codigoOrganoDictadorAcuerdo
                        mdl_GTT_ConfiguracionEnteAEAT.codigoOrganoDictadorAcuerdo = g_frm_P_Empresa_Ejercicio.Exferia_TextBox_CodigoOrganoDictadorAcuerdo.Text;

                        // tipoRecurso
                        string str_ValorDevuelto = "";
                        if ((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoRecurso.SelectedItem != null &&
                          !((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoRecurso.SelectedItem).Identificador.Equals("-1"))
                        {
                            str_ValorDevuelto = ((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoRecurso.SelectedItem).Identificador;
                        }
                        mdl_GTT_ConfiguracionEnteAEAT.tipoRecurso = str_ValorDevuelto;

                        // periodoPrescripcionMeses
                        mdl_GTT_ConfiguracionEnteAEAT.periodoPrescripcionMeses = g_frm_P_Empresa_Ejercicio.Exferia_TextBox_PeriodoPrescripcion.Text.Trim().Length > 0 ? int.Parse(g_frm_P_Empresa_Ejercicio.Exferia_TextBox_PeriodoPrescripcion.Text) : int_Nulo;

                        // numeroOrdenLiquidacionInicial
                        mdl_GTT_ConfiguracionEnteAEAT.numeroOrdenLiquidacionInicial = g_frm_P_Empresa_Ejercicio.Exferia_TextBox_NumeroOrdenLiquidacionInicial.Text.Trim().Length > 0 ? int.Parse(g_frm_P_Empresa_Ejercicio.Exferia_TextBox_NumeroOrdenLiquidacionInicial.Text) : int_Nulo;

                        //Tipo de Notificacion
                        if ((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoNotificacion.SelectedItem != null &&
                            !((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoNotificacion.SelectedItem).Identificador.Equals(""))
                        {
                            mdl_GTT_ConfiguracionEnteAEAT.tipoNotificacion_PermanenciaGeneral = ((INTERNO_ComboBox_Modelo)g_frm_P_Empresa_Ejercicio.Exferia_ComboBox_TipoNotificacion.SelectedItem).Identificador;
                        }
                        else
                        {
                            mdl_GTT_ConfiguracionEnteAEAT.tipoNotificacion_PermanenciaGeneral = null;
                        }

                        //Fecha Notificacion
                        mdl_GTT_ConfiguracionEnteAEAT.fechaNotificacion_PermanenciaGeneral = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaNotificacion.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "" ? DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaNotificacion.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : dtt_fechaNula; ;

                        //Fecha Vencimiento voluntaria
                        mdl_GTT_ConfiguracionEnteAEAT.fechaVencimientoVoluntario_PermanenciaGeneral = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaVencimientoVoluntaria.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "" ? DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaVencimientoVoluntaria.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : dtt_fechaNula; ;

                        //Fecha Certificacion providencia de Apremio
                        mdl_GTT_ConfiguracionEnteAEAT.fechaCertificacionProvidenciaApremio = g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaCertificacionProvidenciaApremio.Exferia_FechaSeleccion_Fecha.Trim(' ', '/') != "" ? DateTime.ParseExact(g_frm_P_Empresa_Ejercicio.Exferia_FechaSeleccion_FechaCertificacionProvidenciaApremio.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture) : dtt_fechaNula; ;


                        //Cargamos el ensamblado
                        Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_GESTIONTASAS + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type = m_assembly.GetType("" + Variables.G_STR_LIBRERIA_GESTIONTASAS + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                        //creamos la instancia
                        var obj_Clase = Activator.CreateInstance(m_type);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_GRABAR_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);


                        //Obtener valores
                        object[] arr_Parametros = { Variables.G_STR_OPCION_GTT_CONFIGURACIONENTEAEAT, mdl_GTT_ConfiguracionEnteAEAT };

                        //Pasamos los parametros al metodo y lo ejecutamos
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CONFIGURACIONENTEAEAT = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

                        if (!mdl_INTERNO_ValorDevuelto_Modelo_CONFIGURACIONENTEAEAT.TodoCorrecto)
                        {
                            mdl_ValorDevuelto_Modelo= mdl_INTERNO_ValorDevuelto_Modelo_CONFIGURACIONENTEAEAT;
                        }
                        #endregion

                        //TERMINO TRANSACCION
                        if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            //Termino Transaccion
                            obj_TransactionScope.Complete();
                            //Liberar transaccion
                            obj_TransactionScope.Dispose();

                            //Actualiazr la variable de valores generales
                            INTERNO_ValoresGenerales_Modelo mdl_INTERNO_ValoresGenerales_Modelo = Datos_Generales.GEN_ValoresGenerales_Obtener_Por_IdUsuario(Variables.G_MDL_USUARIOVALIDADO_MODELO.id);
                            if (mdl_INTERNO_ValoresGenerales_Modelo != null)
                            {
                                mdl_INTERNO_ValoresGenerales_Modelo = Datos_Generales.GEN_EjerciciosActivos_Empresa_Validar(mdl_INTERNO_ValoresGenerales_Modelo, Variables.G_DTT_FECHA_INICIAL_PORDEFECTO);
                                if (mdl_INTERNO_ValoresGenerales_Modelo != null)
                                {
                                    Variables.G_MDL_INTERNO_VALORESGENERALES_MODELO = mdl_INTERNO_ValoresGenerales_Modelo;
                                }
                            }
                        }
                    }

                    //Liberar transaccion
                    obj_TransactionScope.Dispose();



                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    obj_TransactionScope.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Ejercicio_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    obj_TransactionScope.Dispose();
                }
                finally
                {
                    //Liberar transaccion
                    obj_TransactionScope.Dispose();
                }
            }

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

                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Ejercicio_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
            {
                // Borrar 
                mdl_ValorDevuelto_Modelo = BorrarDatos_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Ejercicio_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

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

                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            //Quitar Pantalla de Espera
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear Formulario
            g_frm_P_Empresa_Ejercicio.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    // Devolver al Listado el Row Borrar
                    List<object> lst_obj = new List<object>();

                    //opcion
                    lst_obj.Add(g_frm_P_Empresa_Ejercicio.g_mdl_INTERNO_OpcionesDetalle_Modelo.opcion);

                    //Ids a borrar
                    List<long> lst_id = new List<long>();
                    lst_id.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    lst_obj.Add(lst_id);

                    g_frm_P_Empresa_Ejercicio.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_ELIMINAR);

                    g_frm_P_Empresa_Ejercicio.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_Empresa_Ejercicio.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Ejercicio_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    mdl_ValorDevuelto_Modelo = g_obj_GEN_EjerciciosActivos_Empresa_Datos.Borrar(g_mdl_GEN_EjerciciosActivos_Empresa != null ? g_mdl_GEN_EjerciciosActivos_Empresa.id : -1);

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Termino Transaccion
                        transaccion_SQL.Complete();
                    }
                }
                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, nameof(P_Empresa_Ejercicio_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
    }
}
