using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Listado_Filtros;
using Exferia_Aplicacion.Sincronizacion;
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.Listados;
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_Controladora
    {

        #region Variables Generales
        private P_Empresa g_frm_P_Empresa = 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 Datos Necesarias para la carga de datos
        private GEN_Empresas_Datos g_obj_GEN_Empresas_Datos = new GEN_Empresas_Datos();
        private GEN_EmpresasLogos_Datos g_obj_GEN_EmpresasLogos_Datos = new GEN_EmpresasLogos_Datos();
        private GEN_EjerciciosActivos_Empresa_Datos g_obj_GEN_EjerciciosActivos_Empresa_Datos = new GEN_EjerciciosActivos_Empresa_Datos();
        private GEN_Empresas_RegistrosSanitarios_Datos g_obj_GEN_Empresas_RegistrosSanitarios_Datos = new GEN_Empresas_RegistrosSanitarios_Datos();

        public INTERNO_GEN_Empresas_Modelo g_mdl_INTERNO_GEN_Empresas_Modelo = null;//Modelo de los datos cargados
        public GEN_EmpresasLogos g_mdl_GEN_EmpresasLogos = null;//Modelo del logo de la empresa

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

        //Array de imagen
        public byte[] g_arr_Logo_Empresa;
        public Image g_img_Logo_Empresa;

        //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 bool g_bol_BorrarDatos_VolverListado = true;

        //Variables para la creacion de las Lineas de RegistrosSanitarios ################
        private int g_int_RegistrosSanitarios_PosicionY = 5;
        private int g_int_NumeroLineas_RegistrosSanitarios = 0;
        private List<int> g_Array_ListadoLineas_RegistrosSanitarios = new List<int>();

        public bool g_bol_CampoCodigo_Numerico = false;

        #region Ejercicios
        //Tarea Asincrona para la Rellenar DataGridView de EjerciciosActivos_Empresa
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa;

        //Tarea Asincrona para Borrar EjerciciosActivos_Empresa en base de datos
        private BackgroundWorker g_TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos;

        //Listado de EjerciciosActivos_Empresa
        public List<INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo> g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo = null;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_EjerciciosActivos_Empresa_Columnas;

        //Para el filtrado del listado de EjerciciosActivos_Empresa
        public List<string> g_lst_ColumnasAMostrar_GEN_EjerciciosActivos_Empresa = new List<string>();
        public ABS_Listado_GEN_EjerciciosActivos_Empresa g_obj_ABS_Listado_GEN_EjerciciosActivos_Empresa = new ABS_Listado_GEN_EjerciciosActivos_Empresa();
        public Dictionary<string, object> g_dct_ListadoFiltros_GEN_EjerciciosActivos_Empresa = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_EjerciciosActivos_Empresa = 0;
        private int g_int_TotalRegistros_EjerciciosActivos_Empresa = 0;

        #endregion

        #endregion

        #region Constructor
        public P_Empresa_Controladora(P_Empresa _frm_P_Empresa)
        {
            g_frm_P_Empresa = _frm_P_Empresa;

            Cargar_DatosIniciales();

            //(Tarea Asincrona) Cargar Listado de Lineas ############################################################################################################################################
            g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa.WorkerSupportsCancellation = true;

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        private void Cargar_DatosIniciales()
        {
            try
            {
                //Rellenamos y cargamos los f3 y los listados estaticos en las direcciones
                g_frm_P_Empresa.Exferia_Direccion_Facturacion.ActualizarRegistros(g_frm_P_Empresa);
                g_frm_P_Empresa.Exferia_Direccion_Envio.ActualizarRegistros(g_frm_P_Empresa);
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_Controladora) + "/" + nameof(Cargar_DatosIniciales));
            }
        }
        #endregion

        #region Vaciar datos
        public void VaciarDatos()
        {
            //codigo
            g_frm_P_Empresa.Exferia_TextBox_Codigo.Text = "";
            //descripcion
            g_frm_P_Empresa.Exferia_TextBox_Descripcion.Text = "";
            //razonsocial
            g_frm_P_Empresa.Exferia_TextBox_RazonSocial.Text = "";
            //DatosAEAT_Representante_Nombre
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_Representante_Nombre.Text = "";
            //DatosAEAT_Representante_Cargo
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_Representante_Cargo.Text = "";
            //DatosAEAT_RegistroMercantil_Provincia
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Provincia.Text = "";
            //DatosAEAT_RegistroMercantil_Tomo
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Tomo.Text = "";
            //DatosAEAT_RegistroMercantil_Folio
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Folio.Text = "";
            //DatosAEAT_RegistroMercantil_Hoja
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Hoja.Text = "";
            //DatosAEAT_CodigoAEAT_CNAE
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_CNAE.Text = "";
            //DatosAEAT_CodigoAEAT_IAE
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_IAE.Text = "";
            //DatosAEAT_CodigoAEAT_INE
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_INE.Text = "";
            //DatosAEAT_CodigoAEAT_NRBE
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_NRBE.Text = "";
            //DatosAEAT_Representante_NIF
            g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_Representante_NIF.Exferia_TextBox_CIFNIF_Valor = "";

            //Administracion
            g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Id = -1;
            g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Codigo = "";
            g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Descripcion = "";
            g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_FechaBorrado = null;

            //CIF
            g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF.Exferia_TextBox_CIFNIF_Valor = "";

            //NoCargarMicros
            g_frm_P_Empresa.Exferia_CheckBox_NoCargarMicros.Checked = false;

            //PermiteCobrarAlbaran
            g_frm_P_Empresa.Exferia_CheckBox_PermiteCobrarAlbaran.Checked = false;

            //TelefonoPrincipal
            g_frm_P_Empresa.Exferia_TextBox_TelefonoPrincipal.Text = "";
            //TelefonoParticular
            g_frm_P_Empresa.Exferia_TextBox_TelefonoParticular.Text = "";
            //Movil
            g_frm_P_Empresa.Exferia_TextBox_Movil.Text = "";
            //Fax
            g_frm_P_Empresa.Exferia_TextBox_Fax.Text = "";
            //Email
            g_frm_P_Empresa.Exferia_TextBox_Email_Email.Exferia_TextBox_Email_Valor = "";
            //RegistroMercantil
            g_frm_P_Empresa.Exferia_TextBox_RegistroMercantil.Text = "";

            //Email_Documentacion
            g_frm_P_Empresa.Exferia_TextBox_Email_Documentacion.Exferia_TextBox_Email_Valor = "";
            //Email_Administracion
            g_frm_P_Empresa.Exferia_TextBox_Email_Administracion.Exferia_TextBox_Email_Valor = "";
            //Email_Gerencia
            g_frm_P_Empresa.Exferia_TextBox_Email_Gerencia.Exferia_TextBox_Email_Valor = "";

            //Direcciones
            g_frm_P_Empresa.Exferia_Direccion_Envio.VaciarDatos();
            g_frm_P_Empresa.Exferia_Direccion_Facturacion.VaciarDatos();

            //Foto
            g_arr_Logo_Empresa = null;
            g_img_Logo_Empresa = null;
            g_frm_P_Empresa.PictureBox_Empresa_Logo.Image = null;
            g_frm_P_Empresa.PictureBox_Empresa_Logo.Tag = "";

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

            g_mdl_INTERNO_GEN_Empresas_Modelo = null;
        }
        #endregion

        #region BuscarCodigoSiguiente
        public INTERNO_ValorDevuelto_Modelo Buscar_CodigoSiguiente()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente(nameof(GEN_Empresas),
                                                                                        nameof(GEN_Empresas.codigo),
                                                                                        "",
                                                                                        -1,
                                                                                        true,
                                                                                        g_frm_P_Empresa.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_Empresa.Exferia_TextBox_Codigo.Text = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO(g_frm_P_Empresa.Exferia_Label_Codigo.Text);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_Controladora) + "/" + nameof(Buscar_CodigoSiguiente));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

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

                    //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;
        }
        public bool ComprobarCambios_AfectaLineas()
        {
            if (g_mdl_INTERNO_GEN_Empresas_Modelo==null)
            {
                GrabarDatos();

                //Te quedas esperando 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.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();

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

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

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

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

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Empresa_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.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
                else
                {
                    if (g_mdl_INTERNO_GEN_Empresas_Modelo != null)
                    {
                        //Crear las Lineas de Registros Sanitaros
                        if (g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Empresas_RegistrosSanitarios != null && g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Empresas_RegistrosSanitarios.Count() > 0)
                        {
                            foreach (GEN_Empresas_RegistrosSanitarios mdl_GEN_Empresas_RegistrosSanitarios in g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Empresas_RegistrosSanitarios)
                            {
                                ((BackgroundWorker)sender).ReportProgress(2, mdl_GEN_Empresas_RegistrosSanitarios);
                            }
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_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_Empresa_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                if (e.ProgressPercentage == 1)
                {

                }
                else if (e.ProgressPercentage == 2)
                {
                    Crear_RegistrosSanitarios_Linea((GEN_Empresas_RegistrosSanitarios)e.UserState);
                }
            }
            catch (Exception ex)
            {

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_ProgressChanged));
            }
        }
        private void TareaAsincrona_CargarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear el Formulario
            g_frm_P_Empresa.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.Salir_P_Base();
                }
                else
                {
                    //Validar Controles Personalizados
                    g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF.Validar_CIFNIF();
                    g_frm_P_Empresa.Exferia_TextBox_Email_Email.Validar_Email();
                    g_frm_P_Empresa.Exferia_TextBox_Email_Administracion.Validar_Email();
                    g_frm_P_Empresa.Exferia_TextBox_Email_Documentacion.Validar_Email();
                    g_frm_P_Empresa.Exferia_TextBox_Email_Gerencia.Validar_Email();

                    //PictureBox
                    if (g_img_Logo_Empresa != null)
                    {
                        g_frm_P_Empresa.PictureBox_Empresa_Logo.Image = g_img_Logo_Empresa;
                        Funciones.PictureBox_RedimencionarImagen(g_frm_P_Empresa.PictureBox_Empresa_Logo, g_frm_P_Empresa.PictureBox_Empresa_Logo.Image);
                    }

                    //Rellenar los Ejercicios
                    Rellenar_DataGrid_EjerciciosActivos_Empresa();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Empresa.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                g_frm_P_Empresa.Exferia_TextBox_Codigo.Exferia_TextBox_Foco();
            }
        }

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

            try
            {
                //Obtener la Empresa
                g_mdl_INTERNO_GEN_Empresas_Modelo = g_obj_GEN_Empresas_Datos.Obtener(_lng_id);

                //Si no es Nulo Cargo lo Datos
                if (g_mdl_INTERNO_GEN_Empresas_Modelo != null)
                {
                    //Logo
                    g_mdl_GEN_EmpresasLogos = g_obj_GEN_EmpresasLogos_Datos.Obtener(g_mdl_INTERNO_GEN_Empresas_Modelo.id);

                    //Paginador ................................................................................
                    if (g_frm_P_Empresa.P_Base_PantallaOrigen != null &&
                        g_frm_P_Empresa.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados != null &&
                        g_frm_P_Empresa.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Count > 0)
                    {
                        long lng_id_ParaPaginacion = g_mdl_INTERNO_GEN_Empresas_Modelo.id;
                        int int_PaginaDelObjeto = g_frm_P_Empresa.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.IndexOf(g_frm_P_Empresa.P_Base_PantallaOrigen.P_Base_Objetos_Filtrados.Where(n => n.ID.Equals(lng_id_ParaPaginacion)).FirstOrDefault());

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

                    // codigo
                    g_frm_P_Empresa.Exferia_TextBox_Codigo.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.codigo;
                    //descripcion
                    g_frm_P_Empresa.Exferia_TextBox_Descripcion.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.descripcion;
                    //razonSocial
                    g_frm_P_Empresa.Exferia_TextBox_RazonSocial.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.razonSocial;
                    //telefonoOficina
                    g_frm_P_Empresa.Exferia_TextBox_TelefonoPrincipal.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.telefonoOficina;
                    //telefonoParticular
                    g_frm_P_Empresa.Exferia_TextBox_TelefonoParticular.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.telefonoParticular;
                    //telefonoMovil
                    g_frm_P_Empresa.Exferia_TextBox_Movil.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.telefonoMovil;
                    //telefonoFax
                    g_frm_P_Empresa.Exferia_TextBox_Fax.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.telefonoFax;
                    //registroMercantil
                    g_frm_P_Empresa.Exferia_TextBox_RegistroMercantil.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.registroMercantil;
                    //representante_Nombre
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_Representante_Nombre.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.representante_Nombre;
                    //representante_Cargo
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_Representante_Cargo.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.representante_Cargo;
                    //registroMercantil_Provincia
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Provincia.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.registroMercantil_Provincia;
                    //registroMercantil_Tomo
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Tomo.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.registroMercantil_Tomo;
                    //registroMercantil_Folio
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Folio.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.registroMercantil_Folio;
                    //registroMercantil_Hoja
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Hoja.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.registroMercantil_Hoja;
                    //CNAE
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_CNAE.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.CNAE;
                    //IAE
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_IAE.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.IAE;
                    //INE
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_INE.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.INE;
                    //NRBE
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_NRBE.Text = g_mdl_INTERNO_GEN_Empresas_Modelo.NRBE;

                    //nif
                    g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF.Exferia_TextBox_CIFNIF_Valor = g_mdl_INTERNO_GEN_Empresas_Modelo.nif;
                    //representante_NIF
                    g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_Representante_NIF.Exferia_TextBox_CIFNIF_Valor = g_mdl_INTERNO_GEN_Empresas_Modelo.representante_NIF;

                    //email
                    g_frm_P_Empresa.Exferia_TextBox_Email_Email.Exferia_TextBox_Email_Valor = g_mdl_INTERNO_GEN_Empresas_Modelo.email;
                    //emailDocumentacion
                    g_frm_P_Empresa.Exferia_TextBox_Email_Documentacion.Exferia_TextBox_Email_Valor = g_mdl_INTERNO_GEN_Empresas_Modelo.emailDocumentacion;
                    //emailAdministracion
                    g_frm_P_Empresa.Exferia_TextBox_Email_Administracion.Exferia_TextBox_Email_Valor = g_mdl_INTERNO_GEN_Empresas_Modelo.emailAdministracion;
                    //emailGerencia
                    g_frm_P_Empresa.Exferia_TextBox_Email_Gerencia.Exferia_TextBox_Email_Valor = g_mdl_INTERNO_GEN_Empresas_Modelo.emailGerencia;

                    //noCargaMicro
                    g_frm_P_Empresa.Exferia_CheckBox_NoCargarMicros.Checked = g_mdl_INTERNO_GEN_Empresas_Modelo.noCargaMicro;

                    //permiteCobrarAlbaran
                    g_frm_P_Empresa.Exferia_CheckBox_PermiteCobrarAlbaran.Checked = g_mdl_INTERNO_GEN_Empresas_Modelo.permiteCobrarAlbaran!=null ? g_mdl_INTERNO_GEN_Empresas_Modelo.permiteCobrarAlbaran.Value : false;

                    //Administracion
                    if (g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Administraciones != null)
                    {
                        g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Id = g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Administraciones.id;
                        g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Codigo = g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Administraciones.codigo;
                        g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Descripcion = g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Administraciones.descripcion;
                        g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_FechaBorrado = g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Administraciones.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Id = -1;
                        g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_FechaBorrado = null;
                    }

                    //Logo
                    if (g_mdl_GEN_EmpresasLogos != null && g_mdl_GEN_EmpresasLogos.logo != null)
                    {
                        g_arr_Logo_Empresa= g_mdl_GEN_EmpresasLogos.logo;
                        g_img_Logo_Empresa = Funciones.Convertir_Arraybytes_Image(g_mdl_GEN_EmpresasLogos.logo);
                    }

                    //Ejercicios
                    g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo = g_mdl_INTERNO_GEN_Empresas_Modelo.Ejercicios;

                    //Cargar datos de direcciones
                    Cargar_Datos_Direcciones();

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

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

                            // codigo
                            if (str_campo.Equals(nameof(INTERNO_GEN_Empresas_Modelo.codigo)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_INTERNO_GEN_Empresas_Modelo.codigo;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Empresa.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.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

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

            return bol_ValorDevuelto;
        }

        private void Cargar_Datos_Direcciones()
        {
            //Cargamos las Direcciones si las tuviera
            if (g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Direcciones != null && g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Direcciones.Count > 0)
            {
                GEN_Direcciones mdl_GEN_Direcciones = null;

                //Direccion Envio
                mdl_GEN_Direcciones = g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Direcciones.Where(m => m.tipoDireccion != null && m.tipoDireccion.Equals(Variables.G_STR_TIPODIRECCION_ENVIO)).FirstOrDefault();
                if (mdl_GEN_Direcciones != null && mdl_GEN_Direcciones.nombreVia!=null && mdl_GEN_Direcciones.nombreVia.Trim().Length > 0)
                {
                    g_frm_P_Empresa.Exferia_Direccion_Envio.CargarDatos(mdl_GEN_Direcciones);
                }

                //Direccion Facturacion
                mdl_GEN_Direcciones = g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Direcciones.Where(m => m.tipoDireccion != null && m.tipoDireccion.Equals(Variables.G_STR_TIPODIRECCION_FACTURACION)).FirstOrDefault();
                if (mdl_GEN_Direcciones != null && mdl_GEN_Direcciones.nombreVia!=null && mdl_GEN_Direcciones.nombreVia.Trim().Length > 0)
                {
                    g_frm_P_Empresa.Exferia_Direccion_Facturacion.CargarDatos(mdl_GEN_Direcciones);
                }
            }
        }
        #endregion

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

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_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_Empresa_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_Empresa_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.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);

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

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    #region SINCRONIZACION
                    INTERNO_Sincronizacion_ActualizarRegistro_Modelo mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo = new INTERNO_Sincronizacion_ActualizarRegistro_Modelo();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.tabla = nameof(GEN_Empresas);
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.idClavePrimaria = mdl_ValorDevuelto_Modelo_Resultado.Id;

                    Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_RESTOTABLAS(mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo);
                    #endregion

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

                    g_frm_P_Empresa.P_Base_SeModificoDatosPantalla = false;

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

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

            try
            {
                //Si el codigo esta vacio y se intenta buscar el ultimo numerico y llego al limite de base de datos
                if (g_frm_P_Empresa.Exferia_TextBox_Codigo.Text.Trim().Length == 0)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = Buscar_CodigoSiguiente();

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo.Mensaje;
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_Codigo;
                    }
                }

                // El codigo no puede estar Repetido
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Codigo = g_frm_P_Empresa.Exferia_TextBox_Codigo.Text.Trim();
                    if (g_bol_CampoCodigo_Numerico)
                    {
                        int int_Codigo = int.Parse(str_Codigo);
                        str_Codigo = int_Codigo.ToString();
                    }

                    if (Datos_Generales.Buscar_CodigoRepetido(nameof(GEN_Empresas), nameof(GEN_Empresas.codigo), str_Codigo, nameof(GEN_Empresas.id), (g_mdl_INTERNO_GEN_Empresas_Modelo != null ? g_mdl_INTERNO_GEN_Empresas_Modelo.id : -1), "", -1, true))
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_Empresa.Exferia_Label_Codigo.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_Codigo;
                    }
                }

                // La descripcion no puede estar vacía
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Empresa.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.Exferia_Label_Descripcion.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_Descripcion;
                }

                // La razon social no puede estar vacía
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Empresa.Exferia_TextBox_RazonSocial.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empresa.Exferia_Label_RazonSocial.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_RazonSocial;
                }

                // El CIF no puede estar vacío
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF.Exferia_TextBox_CIFNIF_Valor.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF.Exferia_TextBox_CIFNIF_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF;
                }

                // El CIF tiene que ser correcto
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF.Validar_CIFNIF() == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_INCORRECTO(g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF.Exferia_TextBox_CIFNIF_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF;
                }

                // Si hay email que este Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Empresa.Exferia_TextBox_Email_Email.Validar_Email() == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_INCORRECTO(g_frm_P_Empresa.Exferia_TextBox_Email_Email.Exferia_TextBox_Email_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_Email_Email;
                }

                // Si hay emailDocumentacion que este Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Empresa.Exferia_TextBox_Email_Documentacion.Validar_Email() == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_INCORRECTO(g_frm_P_Empresa.Exferia_TextBox_Email_Documentacion.Exferia_TextBox_Email_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_Email_Documentacion;
                }

                // Si hay emailAdministracion que este Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Empresa.Exferia_TextBox_Email_Administracion.Validar_Email() == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_INCORRECTO(g_frm_P_Empresa.Exferia_TextBox_Email_Administracion.Exferia_TextBox_Email_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_Email_Administracion;
                }

                // Si hay emailGerencia que este Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Empresa.Exferia_TextBox_Email_Gerencia.Validar_Email() == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_USC_INCORRECTO(g_frm_P_Empresa.Exferia_TextBox_Email_Gerencia.Exferia_TextBox_Email_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Empresa.Exferia_TextBox_Email_Gerencia;
                }

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

                //DIRECCIONES ###################################################################
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo = g_frm_P_Empresa.Exferia_Direccion_Envio.ValidarDatos();
                }

                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo = g_frm_P_Empresa.Exferia_Direccion_Facturacion.ValidarDatos();
                }
                //################################################################################
            }
            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_Empresa_Controladora) + "/" + nameof(ValidarDatos));

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

            return mdl_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    long lng_idEmpresa = -1;
                    G_ENUM_TIPOACCION enum_TipoAccion = G_ENUM_TIPOACCION.INT_INSERTAR;
                    DateTime? dtt_fechaNula = null;

                    GEN_Empresas mdl_GEN_Empresas = new GEN_Empresas();

                    //id
                    mdl_GEN_Empresas.id = g_mdl_INTERNO_GEN_Empresas_Modelo != null ? g_mdl_INTERNO_GEN_Empresas_Modelo.id : -1;

                    //codigo
                    mdl_GEN_Empresas.codigo = g_frm_P_Empresa.Exferia_TextBox_Codigo.Text.Trim();
                    //descripcion
                    mdl_GEN_Empresas.descripcion = g_frm_P_Empresa.Exferia_TextBox_Descripcion.Text.Trim();
                    //razonSocial
                    mdl_GEN_Empresas.razonSocial = g_frm_P_Empresa.Exferia_TextBox_RazonSocial.Text.Trim();
                    //nif
                    mdl_GEN_Empresas.nif = g_frm_P_Empresa.Exferia_TextBox_CIFNIF_CIF.Exferia_TextBox_CIFNIF_Valor.Trim();
                    //telefonoOficina
                    mdl_GEN_Empresas.telefonoOficina = g_frm_P_Empresa.Exferia_TextBox_TelefonoPrincipal.Text.Trim();
                    //telefonoParticular
                    mdl_GEN_Empresas.telefonoParticular = g_frm_P_Empresa.Exferia_TextBox_TelefonoParticular.Text.Trim();
                    //telefonoMovil
                    mdl_GEN_Empresas.telefonoMovil = g_frm_P_Empresa.Exferia_TextBox_Movil.Text.Trim();
                    //telefonoFax
                    mdl_GEN_Empresas.telefonoFax = g_frm_P_Empresa.Exferia_TextBox_Fax.Text.Trim();
                    //registroMercantil
                    mdl_GEN_Empresas.registroMercantil = g_frm_P_Empresa.Exferia_TextBox_RegistroMercantil.Text.Trim();
                    //email
                    mdl_GEN_Empresas.email = g_frm_P_Empresa.Exferia_TextBox_Email_Email.Exferia_TextBox_Email_Valor.Trim();
                    //emailDocumentacion
                    mdl_GEN_Empresas.emailDocumentacion = g_frm_P_Empresa.Exferia_TextBox_Email_Documentacion.Exferia_TextBox_Email_Valor.Trim();
                    //emailAdministracion
                    mdl_GEN_Empresas.emailAdministracion = g_frm_P_Empresa.Exferia_TextBox_Email_Administracion.Exferia_TextBox_Email_Valor.Trim();
                    //emailGerencia
                    mdl_GEN_Empresas.emailGerencia = g_frm_P_Empresa.Exferia_TextBox_Email_Gerencia.Exferia_TextBox_Email_Valor.Trim();
                    //noCargaMicro
                    mdl_GEN_Empresas.noCargaMicro = g_frm_P_Empresa.Exferia_CheckBox_NoCargarMicros.Checked;
                    //permiteCobrarAlbaran
                    mdl_GEN_Empresas.permiteCobrarAlbaran = g_frm_P_Empresa.Exferia_CheckBox_PermiteCobrarAlbaran.Checked;

                    //promocionFechaInicio
                    mdl_GEN_Empresas.promocionFechaInicio = dtt_fechaNula;
                    //promocionFechaFin
                    mdl_GEN_Empresas.promocionFechaFin = dtt_fechaNula;
                    //representante_Nombre
                    mdl_GEN_Empresas.representante_Nombre= g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_Representante_Nombre.Text.Trim();
                    //representante_Cargo
                    mdl_GEN_Empresas.representante_Cargo= g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_Representante_Cargo.Text.Trim();
                    //representante_NIF
                    mdl_GEN_Empresas.representante_NIF = g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_Representante_NIF.Exferia_TextBox_CIFNIF_Valor.Trim();
                    //registroMercantil_Provincia
                    mdl_GEN_Empresas.registroMercantil_Provincia= g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Provincia.Text.Trim();
                    //registroMercantil_Tomo
                    mdl_GEN_Empresas.registroMercantil_Tomo= g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Tomo.Text.Trim();
                    //registroMercantil_Folio
                    mdl_GEN_Empresas.registroMercantil_Folio= g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Folio.Text.Trim();
                    //registroMercantil_Hoja
                    mdl_GEN_Empresas.registroMercantil_Hoja= g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_RegistroMercantil_Hoja.Text.Trim();
                    //CNAE
                    mdl_GEN_Empresas.CNAE= g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_CNAE.Text.Trim();
                    //IAE
                    mdl_GEN_Empresas.IAE= g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_IAE.Text.Trim();
                    //INE
                    mdl_GEN_Empresas.INE = g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_INE.Text.Trim();
                    //NRBE
                    mdl_GEN_Empresas.NRBE = g_frm_P_Empresa.Exferia_TextBox_DatosAEAT_CodigoAEAT_NRBE.Text.Trim();

                    //idAdministracion
                    if (g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Id != -1)
                    { mdl_GEN_Empresas.idAdministracion = g_frm_P_Empresa.Exferia_F3_Administracion.Exferia_F3_Id; }
                    else
                    { mdl_GEN_Empresas.idAdministracion = null; }


                    // Se graba el modelo ya relleno.
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_GEN_Empresas_Datos.Grabar(mdl_GEN_Empresas);

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Grabar Ejercicios .................................
                        lng_idEmpresa = mdl_INTERNO_ValorDevuelto_Modelo.Id;
                        enum_TipoAccion = mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion;

                        #region DIRECCION ENVIO 
                        GEN_Direcciones mdl_GEN_Direcciones_ENVIO = g_frm_P_Empresa.Exferia_Direccion_Envio.Obtener_Modelo_Para_Grabacion(Variables.G_STR_TIPODIRECCION_ENVIO, null, null, null,null,lng_idEmpresa);
                        //Insertar o Actualizar
                        if (mdl_GEN_Direcciones_ENVIO.nombreVia.Trim().Length > 0)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo = Datos_Generales.GEN_Direcciones_Actualizar(mdl_GEN_Direcciones_ENVIO);
                        }
                        //Borrar
                        else if (mdl_GEN_Direcciones_ENVIO.id > -1)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo = Datos_Generales.GEN_Direcciones_Borrar(mdl_GEN_Direcciones_ENVIO.id);
                            mdl_GEN_Direcciones_ENVIO = null;
                        }
                        #endregion

                        #region  DIRECCION FACTURACION 
                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            GEN_Direcciones mdl_GEN_Direcciones_FACTURACION = g_frm_P_Empresa.Exferia_Direccion_Facturacion.Obtener_Modelo_Para_Grabacion(Variables.G_STR_TIPODIRECCION_FACTURACION, null, null, null, null, lng_idEmpresa);
                            //Insertar o Actualizar
                            if (mdl_GEN_Direcciones_FACTURACION.nombreVia.Trim().Length > 0)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo = Datos_Generales.GEN_Direcciones_Actualizar(mdl_GEN_Direcciones_FACTURACION);
                            }
                            //Borrar
                            else if (mdl_GEN_Direcciones_FACTURACION.id > -1)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo = Datos_Generales.GEN_Direcciones_Borrar(mdl_GEN_Direcciones_FACTURACION.id);
                            }
                            //Grabar la misma Direccion que la de envio
                            else if (mdl_GEN_Direcciones_ENVIO != null && mdl_GEN_Direcciones_ENVIO.nombreVia.Trim().Length > 0)
                            {
                                mdl_GEN_Direcciones_ENVIO.id = -1;
                                mdl_GEN_Direcciones_ENVIO.tipoDireccion = Variables.G_STR_TIPODIRECCION_FACTURACION;
                                mdl_INTERNO_ValorDevuelto_Modelo = Datos_Generales.GEN_Direcciones_Actualizar(mdl_GEN_Direcciones_ENVIO);
                            }
                        }
                        #endregion

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            #region  REGISTROS SANITARIOS 
                            List<GEN_Empresas_RegistrosSanitarios> lst_GEN_Empresas_RegistrosSanitarios = Obtener_RegistrosSanitarios_Panel(lng_idEmpresa);

                            //Borrar los ejercicios que estan Fuera del listado
                            if (g_mdl_INTERNO_GEN_Empresas_Modelo != null && g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Empresas_RegistrosSanitarios != null && g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Empresas_RegistrosSanitarios.Count() > 0)
                            {
                                var arr_Lineasids = lst_GEN_Empresas_RegistrosSanitarios.Select(x => x.id).ToArray();
                                var var_LineasBorrar = g_mdl_INTERNO_GEN_Empresas_Modelo.GEN_Empresas_RegistrosSanitarios.Where(m => !arr_Lineasids.Contains(m.id) && m.idEmpresa.Equals(lng_idEmpresa));
                                if (var_LineasBorrar != null && var_LineasBorrar.Count() > 0)
                                {
                                    INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_LineasBorrar = null;
                                    foreach (GEN_Empresas_RegistrosSanitarios mdl_GEN_Empresas_RegistrosSanitarios in var_LineasBorrar.ToList())
                                    {
                                        mdl_ValorDevuelto_Modelo_LineasBorrar = g_obj_GEN_Empresas_RegistrosSanitarios_Datos.Borrar(mdl_GEN_Empresas_RegistrosSanitarios.id);
                                        if (mdl_ValorDevuelto_Modelo_LineasBorrar.TodoCorrecto == false)
                                        {
                                            transaccion_SQL.Dispose();
                                            return mdl_ValorDevuelto_Modelo_LineasBorrar;
                                        }
                                    }
                                }
                            }

                            //Actualizar Lineas
                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_Lineas_RS = null;
                            foreach (GEN_Empresas_RegistrosSanitarios mdl_GEN_Empresas_RegistrosSanitariosa in lst_GEN_Empresas_RegistrosSanitarios)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo_Lineas_RS = g_obj_GEN_Empresas_RegistrosSanitarios_Datos.Grabar(mdl_GEN_Empresas_RegistrosSanitariosa);
                                if (!mdl_INTERNO_ValorDevuelto_Modelo_Lineas_RS.TodoCorrecto)
                                {
                                    transaccion_SQL.Dispose();
                                    return mdl_INTERNO_ValorDevuelto_Modelo_Lineas_RS;
                                }
                            }
                            #endregion

                            #region EmpresaLogo
                            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_LOGO = new INTERNO_ValorDevuelto_Modelo();
                            mdl_INTERNO_ValorDevuelto_Modelo_LOGO.TodoCorrecto = true;

                            //Grabar la foto solo en caso de que haya foto
                            if (g_img_Logo_Empresa != null)
                            {
                                GEN_EmpresasLogos mdl_GEN_EmpresasLogos = new GEN_EmpresasLogos();
                                mdl_GEN_EmpresasLogos.id = g_mdl_GEN_EmpresasLogos != null ? g_mdl_GEN_EmpresasLogos.id : -1;
                                mdl_GEN_EmpresasLogos.logo = Funciones.Convertir_Image_Arraybytes(g_img_Logo_Empresa);
                                mdl_GEN_EmpresasLogos.idEmpresa = lng_idEmpresa;

                                //Grabamos el modelo ya relleno
                                mdl_INTERNO_ValorDevuelto_Modelo_LOGO = g_obj_GEN_EmpresasLogos_Datos.Grabar(mdl_GEN_EmpresasLogos);
                            }
                            //Sino hubiera foto seleccionada, y anteriormente tuviera foto, hay que borrar el registro
                            else if (g_mdl_GEN_EmpresasLogos != null)
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo_LOGO = g_obj_GEN_EmpresasLogos_Datos.Borrar(lng_idEmpresa);
                            }

                            if (mdl_INTERNO_ValorDevuelto_Modelo_LOGO.TodoCorrecto==false)
                            {
                                transaccion_SQL.Dispose();
                                return mdl_INTERNO_ValorDevuelto_Modelo_LOGO;
                            }
                            #endregion

                            //Termino Transaccion
                            transaccion_SQL.Complete();
                        }
                    }

                    transaccion_SQL.Dispose();


                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.Id = lng_idEmpresa;
                        mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = enum_TipoAccion;

                        //Empresa
                        g_mdl_INTERNO_GEN_Empresas_Modelo = g_obj_GEN_Empresas_Datos.Obtener(lng_idEmpresa);
                        //Logo
                        g_mdl_GEN_EmpresasLogos = g_obj_GEN_EmpresasLogos_Datos.Obtener(lng_idEmpresa);

                        g_frm_P_Empresa.P_Base_id = lng_idEmpresa;

                        //Si tienes Permisos para Borrar
                        g_frm_P_Empresa.Exferia_Button_Borrar.Enabled = true;
                    }
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar Datos
        public void BorrarDatos(bool _bol_VolverAlListado)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_bol_BorrarDatos_VolverListado = _bol_VolverAlListado;
                    g_frm_P_Empresa.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.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_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.Message, ex, nameof(P_Empresa_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_Empresa_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_Empresa.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
                {
                    #region SINCRONIZACION
                    INTERNO_Sincronizacion_ActualizarRegistro_Modelo mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo = new INTERNO_Sincronizacion_ActualizarRegistro_Modelo();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.tabla = nameof(GEN_Empresas);
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.idClavePrimaria = mdl_ValorDevuelto_Modelo_Resultado.Id;

                    Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_RESTOTABLAS(mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo);
                    #endregion

                    // Devolver al Listado el Row Borrar
                    if (g_frm_P_Empresa.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Empresa.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Empresa.P_Base_F3Origen != null)
                    {
                        g_frm_P_Empresa.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    if (g_bol_BorrarDatos_VolverListado)
                    {
                        g_frm_P_Empresa.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_Empresa.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_GEN_Empresas_Datos.Borrar(g_mdl_INTERNO_GEN_Empresas_Modelo != null ? g_mdl_INTERNO_GEN_Empresas_Modelo.id : -1);
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Empresa_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region RegistrosSanitarios
        public void Crear_RegistrosSanitarios_Linea(GEN_Empresas_RegistrosSanitarios _mdl_GEN_Empresas_RegistrosSanitarios)
        {
            //Añadir control creado en subproceso en el hilo principal ........................
            if (g_frm_P_Empresa.InvokeRequired)
            {
                g_frm_P_Empresa.Invoke((MethodInvoker)delegate
                {
                    Crear_RegistrosSanitarios_Linea(_mdl_GEN_Empresas_RegistrosSanitarios);
                });
                return;
            }

            g_int_NumeroLineas_RegistrosSanitarios += 1;

            //Calcular tamañoi del panel ##########################
            int int_AnchopanelPrincipal = (816 * g_frm_P_Empresa.Exferia_Panel_Degradado_RegistrosSanitarios.Width) / 835;
            if (g_frm_P_Empresa.Exferia_Panel_Degradado_RegistrosSanitarios.Controls != null && g_frm_P_Empresa.Exferia_Panel_Degradado_RegistrosSanitarios.Controls.Count > 0 && g_Array_ListadoLineas_RegistrosSanitarios.Count > 0)
            {
                int_AnchopanelPrincipal = g_frm_P_Empresa.Exferia_Panel_Degradado_RegistrosSanitarios.Controls.Find("controlusuario_CTU_P_Empresas_RegistrosSanitarios" + g_Array_ListadoLineas_RegistrosSanitarios[0], false).FirstOrDefault().Width;
            }

            //Objeto Personalizado .....................................................................
            int int_posicionRelativa = g_int_RegistrosSanitarios_PosicionY + (g_frm_P_Empresa.Exferia_Panel_Degradado_RegistrosSanitarios.DisplayRectangle.Y + 5);
            CTU_P_Empresas_RegistrosSanitarios controlusuario_CTU_P_Empresas_RegistrosSanitarios = new CTU_P_Empresas_RegistrosSanitarios(g_frm_P_Empresa, g_int_NumeroLineas_RegistrosSanitarios, _mdl_GEN_Empresas_RegistrosSanitarios);
            controlusuario_CTU_P_Empresas_RegistrosSanitarios.Name = "controlusuario_CTU_P_Empresas_RegistrosSanitarios" + g_int_NumeroLineas_RegistrosSanitarios;
            controlusuario_CTU_P_Empresas_RegistrosSanitarios.Size = new Size(int_AnchopanelPrincipal, 30);
            controlusuario_CTU_P_Empresas_RegistrosSanitarios.Location = new Point(5, int_posicionRelativa);
            controlusuario_CTU_P_Empresas_RegistrosSanitarios.Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Left);
            controlusuario_CTU_P_Empresas_RegistrosSanitarios.Boton_P_Empresa_RegistrosSanitarios_Delete_Click += new EventHandler<INTERNO_EventArgs>(Boton_P_Empresa_RegistrosSanitarios_DeleteClick);
            controlusuario_CTU_P_Empresas_RegistrosSanitarios.TextBox_P_Empresas_RegistrosSanitarios_KeyPress += new KeyPressEventHandler(TextBox_RegistrosSanitarios_KeyPress);
            controlusuario_CTU_P_Empresas_RegistrosSanitarios.TextBox_P_Empresas_RegistrosSanitarios_TextChanged += new EventHandler(RegistrosSanitarios_Changed);
            //...........................................................................................

            //Añadir al panel Principal
            g_int_RegistrosSanitarios_PosicionY += 30 + 5;
            g_frm_P_Empresa.Exferia_Panel_Degradado_RegistrosSanitarios.Controls.Add(controlusuario_CTU_P_Empresas_RegistrosSanitarios);
           
            g_Array_ListadoLineas_RegistrosSanitarios.Add(g_int_NumeroLineas_RegistrosSanitarios);
        }

        private void Boton_P_Empresa_RegistrosSanitarios_DeleteClick(object sender, INTERNO_EventArgs e)
        {
            CTU_P_Empresas_RegistrosSanitarios obj_CTU_P_Empresas_RegistrosSanitarios = (CTU_P_Empresas_RegistrosSanitarios)g_frm_P_Empresa.Exferia_Panel_Degradado_RegistrosSanitarios.Controls.Find("controlusuario_CTU_P_Empresas_RegistrosSanitarios" + e.NumeroObjeto, false).FirstOrDefault();
           
            g_frm_P_Empresa.P_Base_SeModificoDatosPantalla = true;

            obj_CTU_P_Empresas_RegistrosSanitarios.Dispose();

            g_Array_ListadoLineas_RegistrosSanitarios.Remove(e.NumeroObjeto);

            g_int_RegistrosSanitarios_PosicionY -= (30 + 5);

            CTU_P_Empresas_RegistrosSanitarios obj_aCambiar;
            foreach (int valoresModificarPosicion in g_Array_ListadoLineas_RegistrosSanitarios.Where(m => m > e.NumeroObjeto).ToList())
            {
                obj_aCambiar = (CTU_P_Empresas_RegistrosSanitarios)g_frm_P_Empresa.Exferia_Panel_Degradado_RegistrosSanitarios.Controls.Find("controlusuario_CTU_P_Empresas_RegistrosSanitarios" + valoresModificarPosicion, false).FirstOrDefault();
                obj_aCambiar.Location = new Point(obj_aCambiar.Location.X, obj_aCambiar.Location.Y - (30 + 5));
            }
        }
        private void TextBox_RegistrosSanitarios_KeyPress(object sende, KeyPressEventArgs e)
        {
            g_frm_P_Empresa.P_Base_SeModificoDatosPantalla = true;
        }

        private List<GEN_Empresas_RegistrosSanitarios> Obtener_RegistrosSanitarios_Panel(long _lng_idEmpresa)
        {
            List<GEN_Empresas_RegistrosSanitarios> lst_GEN_Empresas_RegistrosSanitarios = new List<GEN_Empresas_RegistrosSanitarios>();
            CTU_P_Empresas_RegistrosSanitarios obj_CTU_P_Empresas_RegistrosSanitarios = null;
            foreach (int int_ValorLinea in g_Array_ListadoLineas_RegistrosSanitarios)
            {
                GEN_Empresas_RegistrosSanitarios mdl_GEN_Empresas_RegistrosSanitarios = new GEN_Empresas_RegistrosSanitarios();

                obj_CTU_P_Empresas_RegistrosSanitarios = (CTU_P_Empresas_RegistrosSanitarios)g_frm_P_Empresa.Exferia_Panel_Degradado_RegistrosSanitarios.Controls.Find("controlusuario_CTU_P_Empresas_RegistrosSanitarios" + int_ValorLinea, true).FirstOrDefault();

                if (obj_CTU_P_Empresas_RegistrosSanitarios != null)
                {
                    // id
                    mdl_GEN_Empresas_RegistrosSanitarios.id = obj_CTU_P_Empresas_RegistrosSanitarios.CTU_P_Empresa_RegistrosSanitarios_id;

                    // idEmpresa
                    mdl_GEN_Empresas_RegistrosSanitarios.idEmpresa = _lng_idEmpresa;

                    // Descripcion
                    mdl_GEN_Empresas_RegistrosSanitarios.descripcion = obj_CTU_P_Empresas_RegistrosSanitarios.CTU_P_Empresas_RegistrosSanitarios_Control_Descripcion.Text;

                    //Añadir al Listado
                    lst_GEN_Empresas_RegistrosSanitarios.Add(mdl_GEN_Empresas_RegistrosSanitarios);
                }
            }

            return lst_GEN_Empresas_RegistrosSanitarios;
        }

        private void RegistrosSanitarios_Changed(object sender, EventArgs e)
        {

        }
        #endregion

        #region Ejercicios

        #region Rellenar DataGrid Ejercicios
        public void Rellenar_DataGrid_EjerciciosActivos_Empresa()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Empresa.Exferia_DataGridView_Ejercicios.Rows.Clear();
                g_int_TotalRegistrosInsertados_EjerciciosActivos_Empresa = 0;
                g_int_TotalRegistros_EjerciciosActivos_Empresa = 0;
                g_frm_P_Empresa.Exferia_BarraProgreso_Ejercicios.Exferia_BarraProgreso_Total = g_int_TotalRegistros_EjerciciosActivos_Empresa;
                g_frm_P_Empresa.Exferia_BarraProgreso_Ejercicios.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_EjerciciosActivos_Empresa;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(Rellenar_DataGrid_EjerciciosActivos_Empresa));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo> lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_Filtradas = Filtrar_Ejercicios();

                if (lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_Filtradas != null)
                {
                    //Total
                    g_int_TotalRegistros_EjerciciosActivos_Empresa = lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_Filtradas.Count;

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

                        //Progreso
                        g_int_TotalRegistrosInsertados_EjerciciosActivos_Empresa += 1;


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

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de EjerciciosActivos_Empresa
                g_frm_P_Empresa.Exferia_DataGridView_Ejercicios.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_Empresa.Exferia_BarraProgreso_Ejercicios.Exferia_BarraProgreso_Total = g_int_TotalRegistros_EjerciciosActivos_Empresa;
                g_frm_P_Empresa.Exferia_BarraProgreso_Ejercicios.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_EjerciciosActivos_Empresa;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_EjerciciosActivos_Empresa_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Empresa.Ordenar_DataGridView_Ejercicios();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Ejercicios(INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo _mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Empresa.Exferia_DataGridView_Ejercicios.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Empresa.Exferia_DataGridView_Ejercicios);
            }

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

                    long? lng_valor = long.Parse(str_Valor);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo> Filtrar_Ejercicios()
        {
            //Filtros Avanzados
            if (g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo != null)
            {
                if (g_dct_ListadoFiltros_GEN_EjerciciosActivos_Empresa != null && g_dct_ListadoFiltros_GEN_EjerciciosActivos_Empresa.Count > 0)
                {
                    return g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo>(g_dct_ListadoFiltros_GEN_EjerciciosActivos_Empresa, g_obj_ABS_Listado_GEN_EjerciciosActivos_Empresa)).ToList();
                }
                else
                {
                    return g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo.AsQueryable().ToList();
                }
            }
            else
            {
                return null;
            }
        }
        #endregion

        public void Actualizar_Registro_Ejercicios(long _lng_idEjercicio, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo = g_obj_GEN_EjerciciosActivos_Empresa_Datos.Obtener_Registro_ParaListado(_lng_idEjercicio);

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

                        g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo.Add(mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo);
                    }

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

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_Ejercicios(mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo, row);
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_Empresa.Exferia_DataGridView_Ejercicios.Rows.Add(Transformar_Modelo_A_Row_Ejercicios(mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo, null));

                        //Sumar Cantidad de Lineas Insertadas
                        g_frm_P_Empresa.Exferia_BarraProgreso_Ejercicios.Exferia_BarraProgreso_Total += 1;
                        g_frm_P_Empresa.Exferia_BarraProgreso_Ejercicios.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_EjerciciosActivos_Empresa + 1;

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

        }
        public void Borrar_Registro_Ejercicios(List<long> _lst_idEjercicio)
        {
            try
            {
                // 1 º LINEA PRINCIPAL ################################################################################
                //Borrar primero el List<> General 
                if (g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo != null && g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo> lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo.Where(m => _lst_idEjercicio.Contains(m.id)).ToList();
                    if (lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo in lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo.Remove(mdl_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo);
                        }



                        //Borrar del DataGridView
                        List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Empresa.Exferia_DataGridView_Ejercicios.Rows
                                        .Cast<DataGridViewRow>()
                                        .Where(r => _lst_idEjercicio.Contains(long.Parse(r.Cells[nameof(INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo.id)].Value.ToString()))).ToList();

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

                        //Restar Cantidad de Lineas Borradas
                        g_frm_P_Empresa.Exferia_BarraProgreso_Ejercicios.Exferia_BarraProgreso_Total -= lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_BUSQUEDA.Count();
                        g_frm_P_Empresa.Exferia_BarraProgreso_Ejercicios.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_EjerciciosActivos_Empresa - lst_INTERNO_GEN_EjerciciosActivos_Empresa_Listado_Modelo_BUSQUEDA.Count();
                    }

                }

                g_frm_P_Empresa.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(Borrar_Registro_Ejercicios));
            }
        }

        #region Borrar Datos en Base Datos Ejercicios
        public void Borrar_Registro_Ejercicios_EnBaseDatos(List<long> _lst_idEjercicios_ABorrar)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Empresa.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idEjercicios_ABorrar);
                
                    g_TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos = new BackgroundWorker();
                    g_TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos_DoWork);
                    g_TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos_Completed);
                    g_TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos.RunWorkerAsync(lst_Argumentos);

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

                g_frm_P_Empresa.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(Borrar_Registro_Ejercicios_EnBaseDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }

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

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    List<long> lst_idEjercicios_BORRADOS = new List<long>();

                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idEjercicios_ABorrar = (List<long>)lst_Argumentos[0];
                  

                    // ## BORRAR LAS LINEAS #################################################################################################
                    if (lst_idEjercicios_ABorrar != null)
                    {
                        INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_BORRAR = Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos_Final(lst_idEjercicios_ABorrar);
                        if (mdl_ValorDevuelto_Modelo_BORRAR.TodoCorrecto == false)
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                        }
                        else
                        {
                            lst_idEjercicios_BORRADOS.AddRange(lst_idEjercicios_ABorrar);
                        }
                    }

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

                    transaccion_SQL.Dispose();

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

                    Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos_DoWork));

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

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

                    Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos_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_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos_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.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(Variables.G_STR_OPCION_GEN_EJERCICIOACTIVO);

                    //Listado lineas
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);
                    
                    g_frm_P_Empresa.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_ELIMINAR);

                    g_frm_P_Empresa.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos_Final(List<long> _lst_idEjercicios_ABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_GEN_EjerciciosActivos_Empresa_Datos.Borrar(_lst_idEjercicios_ABorrar);
            }
            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, nameof(P_Empresa_Controladora) + "/" + nameof(Borrar_Registro_EjerciciosActivos_Empresa_EnBaseDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion
        #endregion

        #region Direcciones
        public void CopiarDirecciones(object sender, EventArgs e)
        {
            try
            {
                //Obtengo el componente desde donde se llamo
                if (sender != null && ((Exferia_Button)sender).Parent != null)
                {
                    //Obtengo el boton del componente
                    Exferia_Button obj_Exferia_Button = (Exferia_Button)sender;

                    //Obtengo el Componente dependiendo de si es "Exferia_Direccion" 0 "Exferia_DireccionFiscal"
                    dynamic obj_Exferia_Direccion_DeDondeSeLlamo = null;
                    if (obj_Exferia_Button.Parent.GetType() == typeof(Exferia_Direccion))
                    {
                        obj_Exferia_Direccion_DeDondeSeLlamo = (Exferia_Direccion)obj_Exferia_Button.Parent;
                    }
                    else if (obj_Exferia_Button.Parent.GetType() == typeof(Exferia_DireccionFiscal))
                    {
                        obj_Exferia_Direccion_DeDondeSeLlamo = (Exferia_DireccionFiscal)obj_Exferia_Button.Parent;
                    }

                    if (obj_Exferia_Direccion_DeDondeSeLlamo != null)
                    {
                        //Listados de Modelos y Para la Pantalla
                        List<GEN_Direcciones> lst_GEN_Direcciones = new List<GEN_Direcciones>();
                        List<INTERNO_CodigoDescripcion_Modelo> lst_INTERNO_CodigoDescripcion_Modelo_Direcciones = new List<INTERNO_CodigoDescripcion_Modelo>();

                        //Compruebo si el Listado que contiene los componentes de "Exferia_Direccion" no sea nulo
                        if (obj_Exferia_Direccion_DeDondeSeLlamo.Exferia_Direccion_RELACIONADOS_Objeto != null && obj_Exferia_Direccion_DeDondeSeLlamo.Exferia_Direccion_RELACIONADOS_Objeto.Count > 0)
                        {
                            //Recorro el Listado y obtengo el modelo "GEN_Direcciones" de cada componente
                            //y lo añado al listado de modelos, también añado al listado para la pantalla y para la busqueda
                            foreach (Exferia_Direccion obj_Exferia_Direccion in obj_Exferia_Direccion_DeDondeSeLlamo.Exferia_Direccion_RELACIONADOS_Objeto)
                            {
                                GEN_Direcciones mdl_GEN_Direcciones = obj_Exferia_Direccion.Obtener_Modelo_A_Copiar();
                                lst_GEN_Direcciones.Add(mdl_GEN_Direcciones);

                                lst_INTERNO_CodigoDescripcion_Modelo_Direcciones.Add(new INTERNO_CodigoDescripcion_Modelo(mdl_GEN_Direcciones.tipoDireccion, obj_Exferia_Direccion.Parent.Text));
                            }
                        }
                        //Compruebo si el Listado que contiene los componentes de "Exferia_DireccionFiscal" no sea nulo
                        if (obj_Exferia_Direccion_DeDondeSeLlamo.Exferia_DireccionFiscal_RELACIONADOS_Objeto != null && obj_Exferia_Direccion_DeDondeSeLlamo.Exferia_DireccionFiscal_RELACIONADOS_Objeto.Count > 0)
                        {
                            //Recorro el Listado y obtengo el modelo "GEN_Direcciones" de cada componente
                            //y lo añado al listado de modelos, también añado al listado para la pantalla y para la busqueda
                            foreach (Exferia_DireccionFiscal obj_Exferia_DireccionFiscal in obj_Exferia_Direccion_DeDondeSeLlamo.Exferia_DireccionFiscal_RELACIONADOS_Objeto)
                            {
                                GEN_Direcciones mdl_GEN_Direcciones = obj_Exferia_DireccionFiscal.Obtener_Modelo_A_Copiar();
                                lst_GEN_Direcciones.Add(mdl_GEN_Direcciones);

                                lst_INTERNO_CodigoDescripcion_Modelo_Direcciones.Add(new INTERNO_CodigoDescripcion_Modelo(mdl_GEN_Direcciones.tipoDireccion, obj_Exferia_DireccionFiscal.Parent.Text));
                            }
                        }

                        //Obtener el Listado ...................................
                        ListadosSeleccion.ABS_ListadoSeleccion_Direcciones mdl_ABS_ListadoSeleccion_Direcciones = new ListadosSeleccion.ABS_ListadoSeleccion_Direcciones();
                        mdl_ABS_ListadoSeleccion_Direcciones.Registros = lst_INTERNO_CodigoDescripcion_Modelo_Direcciones.Cast<dynamic>().ToList();

                        //Llamar al formulario de PE_Listados_SoloSeleccion
                        PE_Listados_SoloSeleccion frm_PE_Listados_SoloSeleccion = new PE_Listados_SoloSeleccion(mdl_ABS_ListadoSeleccion_Direcciones, g_frm_P_Empresa.P_Base_ValoresGenerales, g_frm_P_Empresa.P_Base_FechaTrabajo);
                        frm_PE_Listados_SoloSeleccion.ShowDialog();

                        //Comprueba si se ha seleccionado algo en el listado de PE_Listados_SoloSeleccion
                        if (frm_PE_Listados_SoloSeleccion.g_dnm_RegistroSeleccionado != null)
                        {
                            //Obtengo el modelo filtrado por tipoDireccion
                            GEN_Direcciones mdl_GEN_Direcciones_Resultado = lst_GEN_Direcciones.Where(m => m.tipoDireccion.Equals(((INTERNO_CodigoDescripcion_Modelo)frm_PE_Listados_SoloSeleccion.g_dnm_RegistroSeleccionado).Codigo)).FirstOrDefault();

                            if (mdl_GEN_Direcciones_Resultado != null)
                            {
                                //Envio el modelo al componente para que se encarge de Recargarse
                                obj_Exferia_Direccion_DeDondeSeLlamo.Copiar(mdl_GEN_Direcciones_Resultado);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Empresa_Controladora) + "/" + nameof(CopiarDirecciones));
            }
        }
        #endregion
    }
}
