using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_MantenimientoAgrupacionesCabecera;
using Exferia_Aplicacion.Sincronizacion;
using Exferia_General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
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_Formularios.Controladoras
{
    public class P_MantenimientoAgrupacionesCabecera_Controladora
    {
        #region Variables Generales
        private P_MantenimientoAgrupacionesCabecera g_frm_P_MantenimientoAgrupacionesCabecera = 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

        public INTERNO_MantenimientoAgrupacionesCabecera_Modelo g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo = null;//Modelo de los datos del cliente, cargados

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

        #region Tareas Asincronas
        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;

        //Tareea Asincrona de grabar de datos
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;
        public 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;
        #endregion

        public bool g_bol_CampoCodigo_Numerico = false;

        #region Lineas
        //Tarea Asincrona para la Rellenar DataGridView de Linea
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Linea;

        //Tarea Asincrona para la Borrar Linea
        private BackgroundWorker g_TareaAsincrona_Borrar_Linea;

        //Listado de Lineas
        public List<INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo> g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo = null;

        //Listado de Columnas
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Lineas_Columnas;
        //Filtrado del Listado de InventarioLinea
        public List<string> g_lst_ColumnasAMostrar_Lineas = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Linea = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_Lineas = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Linea = 0;
        private int g_int_TotalRegistros_Linea = 0;
        #endregion
        #endregion

        public P_MantenimientoAgrupacionesCabecera_Controladora(P_MantenimientoAgrupacionesCabecera _frm_P_MantenimientoAgrupacionesCabecera)
        {
            g_frm_P_MantenimientoAgrupacionesCabecera = _frm_P_MantenimientoAgrupacionesCabecera;


            //(Tarea Asincrona) Cargar Listado de Lineas ########################################
            g_TareaAsincrona_Rellenar_DataGrid_Linea = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Linea.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Linea_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Linea.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Linea_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Linea.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Linea_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Linea.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Linea.WorkerSupportsCancellation = true;
            //####################################################################################

            g_bol_Termino_CargaDatos_Inicial = true;
        }

        public void VaciarDatos()
        {
            g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Codigo.Text = "";
            g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Descripcion.Text = "";

            //Lineas ..................................................
            g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo = new List<INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo>();
            g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_DataGridView_Lineas.Rows.Clear();
            g_int_TotalRegistrosInsertados_Linea = 0;
            g_int_TotalRegistros_Linea = 0;
            g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Linea;
            g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Linea;
            //....................................................................

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

            g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo = null;
        }

        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(
                                                                                        g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_CABECERA(),
                                                                                        g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_CODIGO_CABECERA(),
                                                                                        g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_IDEMPRESA_CABECERA(),
                                                                                        g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.idEmpresa : Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_CABECERA()),
                                                                                        g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.TIENE_FECHABORRADO_CABECERA(),
                                                                                        g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_MantenimientoAgrupacionesCabecera.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_MantenimientoAgrupacionesCabecera.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_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public bool ComprobarCambios()
        {
            if (g_frm_P_MantenimientoAgrupacionesCabecera.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_SinPreguntar()
        {
            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;
        }

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

                if (!g_frm_PE_Esperando.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_MantenimientoAgrupacionesCabecera_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_MantenimientoAgrupacionesCabecera.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_MantenimientoAgrupacionesCabecera_Modelo != null)
                    {
                        //Cargar Listado Linea ...........................................................
                        if (g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.AgrupacionesLineas != null)
                        {
                            g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.AgrupacionesLineas;
                        }
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesCabecera_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_MantenimientoAgrupacionesCabecera_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
            {
            }
            catch (Exception ex)
            {

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesCabecera_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_MantenimientoAgrupacionesCabecera.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_MantenimientoAgrupacionesCabecera.Salir_P_Base();
                }
                else
                {
                    //Ordenar
                    g_frm_P_MantenimientoAgrupacionesCabecera.Linea_Ordenar_DataGridView();

                    //Rellenar Grids
                    Rellenar_DataGrid_Linea();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

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

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

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

                //Obtener valores
                object[] arr_Parametros = {
                    g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_CABECERA(),
                    _lng_id,
                    g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.lng_idEmpresa,
                    ((g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales!=null && g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.EjercicioActivo!=null ) ? g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.EjercicioActivo.id : -1)
                };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo = (INTERNO_MantenimientoAgrupacionesCabecera_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

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

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

                    // TextBox
                    g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Codigo.Text = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.codigo;
                    g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Descripcion.Text = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.descripcion;

                    //Cliente
                    if (g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.clienteProveedor==Variables.G_INT_TIPOCLIENTEPROVEEDOR_PROVEEDOR_CODIGO)
                    {
                        g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_CheckBox_Proveedor.Checked = true;
                    }
                    //Proveedor
                    else if (g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.clienteProveedor == Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO)
                    {
                        g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_CheckBox_Cliente.Checked = true;
                    }
                    //Los dos
                    else
                    {
                        g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_CheckBox_Proveedor.Checked = true;
                        g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_CheckBox_Cliente.Checked = true;
                    }

                    //Sin Repeticiones
                    g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_CheckBox_SinRepeticiones.Checked = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.sinRepeticiones!=null ? g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.sinRepeticiones.Value:false;

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

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

                        dynamic dnm_Objeto = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_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(g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.codigo)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.codigo;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_MantenimientoAgrupacionesCabecera.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_MantenimientoAgrupacionesCabecera.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

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

            return bol_ValorDevuelto;
        }

        #endregion

        #region Grabar Datos

        public void GrabarDatos()
        {
            try
            {
                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_MantenimientoAgrupacionesCabecera.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.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }
                g_frm_P_MantenimientoAgrupacionesCabecera.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesCabecera_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_MantenimientoAgrupacionesCabecera_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_MantenimientoAgrupacionesCabecera_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.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }
            g_frm_P_MantenimientoAgrupacionesCabecera.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_MantenimientoAgrupacionesCabecera, 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 = g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_CABECERA();
                    mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo.idClavePrimaria = mdl_ValorDevuelto_Modelo_Resultado.Id;

                    Sincronizacion_ActualizarRegistro.Sincronizacion_ActualizarRegistro_RESTOTABLAS(mdl_INTERNO_Sincronizacion_ActualizarRegistro_Modelo);
                    #endregion

                    //Ver si se modifico algun otro registro, por cambiar el campo por defecto
                    if (mdl_ValorDevuelto_Modelo_Resultado.Listado_Id != null && mdl_ValorDevuelto_Modelo_Resultado.Listado_Id.Count > 0)
                    {
                        // Devolver al Listado el Row Añadido/Modificado
                        if (g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_PantallaOrigen != null)
                        {
                            g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_PantallaOrigen.P_Base_RecargarListado();
                        }
                        else if (g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_F3Origen != null)
                        {
                            g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                        }
                    }
                    else
                    {

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

                    //Poner el Foco Inicial
                    Funciones.Poner_Foco_Objeto(g_frm_P_MantenimientoAgrupacionesCabecera, g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Codigo);
                    g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_SeModificoDatosPantalla = false;

                    //Activar el Boton 
                    g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_Button_Borrar.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_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_MantenimientoAgrupacionesCabecera.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_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Codigo;
                    }
                }

                // El codigo no puede estar Repetido
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Codigo = g_frm_P_MantenimientoAgrupacionesCabecera.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(g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_CABECERA(), g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_CODIGO_CABECERA(), str_Codigo, g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_ID_CABECERA(), (g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.id : -1), g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_CAMPO_IDEMPRESA_CABECERA(), g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.TIENE_FECHABORRADO_CABECERA()))
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_Label_Codigo.Text);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Codigo;
                    }
                }

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

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    INTERNO_MantenimientoAgrupacionesCabecera_Modelo mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo = new INTERNO_MantenimientoAgrupacionesCabecera_Modelo();
                    mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.id = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.id : -1;

                    //Asignar el idEmpresa...........................................................................................
                    if ((g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.idEmpresa : -1) != -1)
                    {
                        mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.idEmpresa = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.idEmpresa;
                    }
                    else
                    {
                        //Buscar el idEmpresa que Corresponda
                        mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.lng_idEmpresa, g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_CABECERA());
                    }

                    // TextBox .....................................................
                    mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.codigo = g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Codigo.Text.Trim();

                    mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.descripcion = g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Descripcion.Text.Trim();

                    if (g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.ES_DEARTICULO_CABECERA())
                    {
                        int int_ValorAGuardar = 0;
                        if (g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_CheckBox_Proveedor.Checked)
                        {
                            int_ValorAGuardar = Variables.G_INT_TIPOCLIENTEPROVEEDOR_PROVEEDOR_CODIGO;
                        }

                        if (g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_CheckBox_Cliente.Checked)
                        {
                            int_ValorAGuardar += Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO;
                        }

                        mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.clienteProveedor = int_ValorAGuardar;
                    }
                    else
                    {
                        mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.clienteProveedor = Variables.G_INT_TIPOCLIENTEPROVEEDOR_TODOS_CODIGO;
                    }

                    //Sin Repeticiones
                    mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.sinRepeticiones = g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_CheckBox_SinRepeticiones.Checked;


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

                    //Obtener valores
                    object[] arr_Parametros = { g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_CABECERA(), mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo };
                    
                    //Pasamos los parametros al metodo y lo ejecutamos
                    mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

                    // Grabamos las Agrupaciones del cliente
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Termino Transaccion
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Obtener el modelo que se acaba de grabar

                        //Cargamos el ensamblado
                        Assembly m_assembly_2 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type_2 = m_assembly_2.GetType("" + g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                        //creamos la instancia
                        var obj_Clase_2 = Activator.CreateInstance(m_type_2);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo_2 = obj_Clase_2.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_OBTENER_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros_2 = {
                                                        g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_CABECERA(),
                                                        mdl_INTERNO_ValorDevuelto_Modelo.Id,
                                                        g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.lng_idEmpresa,
                                                        ((g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales!=null && g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.EjercicioActivo!=null ) ? g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.EjercicioActivo.id : -1)
                                                    };
                        //Pasamos los parametros al metodo y lo ejecutamos
                        g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo = (INTERNO_MantenimientoAgrupacionesCabecera_Modelo)obj_MethodInfo_2.Invoke(obj_Clase, arr_Parametros_2);

                        g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_id = g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.id;

                        //Si tienes Permisos para Borrar
                        g_frm_P_MantenimientoAgrupacionesCabecera.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, nameof(P_MantenimientoAgrupacionesCabecera_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_MantenimientoAgrupacionesCabecera.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.IsDisposed)
                {
                    g_frm_PE_Esperando.Dispose();
                }

                g_frm_P_MantenimientoAgrupacionesCabecera.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_MantenimientoAgrupacionesCabecera_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_MantenimientoAgrupacionesCabecera_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_MantenimientoAgrupacionesCabecera_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.IsDisposed)
            {
                g_frm_PE_Esperando.Dispose();
            }
            g_frm_P_MantenimientoAgrupacionesCabecera.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 = g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_TABLA_CABECERA();
                    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_MantenimientoAgrupacionesCabecera.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_F3Origen != null)
                    {
                        g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    if (g_bol_BorrarDatos_VolverListado)
                    {
                        g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_MantenimientoAgrupacionesCabecera.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType("" + g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                //creamos la instancia
                var obj_Clase = Activator.CreateInstance(m_type);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_BORRAR_REGISTRO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_CABECERA(), (g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo != null ? g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.id : -1) };

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            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_MantenimientoAgrupacionesCabecera_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 Lineas 

        #region Rellenar DataGrid Linea
        public void Rellenar_DataGrid_Linea()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Linea.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Linea.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_DataGridView_Lineas.Rows.Clear();
                g_int_TotalRegistrosInsertados_Linea = 0;
                g_int_TotalRegistros_Linea = 0;
                g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Linea;
                g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Linea;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Linea.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(Rellenar_DataGrid_Linea));
            }
        }

        private void TareaAsincrona_Rellenar_DataGrid_Linea_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo> lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_Filtradas = Filtrar_Linea();

                if (lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_Filtradas != null)
                {
                    //Total
                    g_int_TotalRegistros_Linea = lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_Filtradas.Count;

                    //Recorrer campos Long_Text para saber si lo pongo tipo text o tipo long
                    foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Lineas_Columnas.Where(m => m.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT)).ToList())
                    {
                        int int_HayTextos = lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_Filtradas.Select(m => m.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(m)).ToList().Where(m => !Funciones.IsNumeric(m.ToString())).Count();

                        if (int_HayTextos > 0)
                        {
                            mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato = G_ENUM_TIPOSDATOS.TEXT;

                            g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.LISTADO_LINEAS().LISTADO_COLUMNAS().Where(m => m.Key.Equals(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna)).FirstOrDefault().Value.TipoDato = G_ENUM_TIPOSDATOS.TEXT;
                        }
                    }

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

                        //Progreso
                        g_int_TotalRegistrosInsertados_Linea += 1;

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

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Linea_DoWork));
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(TareaAsincrona_Rellenar_DataGrid_Linea_DoWork));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Linea_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Linea al DataGrid de InventarioLinea
                g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_DataGridView_Lineas.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Linea;
                g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Linea;

            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Linea_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_MantenimientoAgrupacionesCabecera.Linea_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Linea(INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo _mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_DataGridView_Lineas.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_DataGridView_Lineas);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Lineas_Columnas)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MantenimientoAgrupacionesLineas_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_MantenimientoAgrupacionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MantenimientoAgrupacionesLineas_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_MantenimientoAgrupacionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MantenimientoAgrupacionesLineas_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_MantenimientoAgrupacionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MantenimientoAgrupacionesLineas_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_MantenimientoAgrupacionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                    else
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = "";
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG_TEXT))
                {
                    string str_Valor = (string)_mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MantenimientoAgrupacionesLineas_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_MantenimientoAgrupacionesLineas_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo> Filtrar_Linea()
        {
            //Filtros Avanzados
            if (g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo != null)
            {
                if (g_dct_ListadoFiltros_Lineas != null && g_dct_ListadoFiltros_Lineas.Count > 0)
                {
                    return g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo>(g_dct_ListadoFiltros_Lineas, g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.LISTADO_LINEAS())).ToList();
                }
                else
                {
                    return g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.AsQueryable().ToList();
                }
            }
            else
            {
                return null;
            }
        }
        #endregion
        
        public void Linea_Actualizar_Registro(long _lng_idLinea, G_ENUM_TIPOACCION _enum_TipoAccion, bool _bol_RecargarTrazabilidad)
        {
            try
            {
                //Buscar el Registro en Base de datos
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType("" + g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                //creamos la instancia
                var obj_Clase = Activator.CreateInstance(m_type);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_OBTENER_REGISTROSLISTADO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = {
                    g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEA(),
                    g_mdl_INTERNO_MantenimientoAgrupacionesCabecera_Modelo.idEmpresa,
                   ((g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales!=null && g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.EjercicioActivo!=null ) ? g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ValoresGenerales.EjercicioActivo.id : -1),
                    g_lst_ColumnasAMostrar_Lineas,
                   null,
                   null,
                   _lng_idLinea,
                    null 
                };
                //Pasamos los parametros al metodo y lo ejecutamos
                List<object> lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo = (List<object>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

                if (lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo != null)
                {
                    INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo = (INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo)lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.ToList().FirstOrDefault();
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo != null && g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.Count > 0)
                    {
                        INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.Where(m => m.id.Equals(mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.id)).FirstOrDefault();
                        if (mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo[g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.FindIndex(m => m.id.Equals(mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.id))] = mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.Add(mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo == null)
                        {
                            g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo = new List<INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo>();
                        }

                        g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.Add(mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo);
                    }

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

                        if (row != null)//Modificada
                        {
                            //Actualizar el Grid
                            Transformar_Modelo_A_Row_Linea(mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo, row);
                        }
                    }
                    //Insertar
                    else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                    {
                        g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_DataGridView_Lineas.Rows.Add(Transformar_Modelo_A_Row_Linea(mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo, null));

                        //Sumar Cantidad de Lineas Insertadas
                        g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total += 1;
                        g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Linea + 1;
                    }
                }

                g_frm_P_MantenimientoAgrupacionesCabecera.Rellenar_Listado_ParaPaginado();
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(Linea_Actualizar_Registro));
            }

        }
        public void Linea_Borrar_Registro(List<long> _lst_idAgrupacionLinea)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo != null && g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo> lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.Where(m => _lst_idAgrupacionLinea.Contains(m.id)).ToList();
                    if (lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo in lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo.Remove(mdl_INTERNO_MantenimientoAgrupacionesLineas_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_DataGridView_Lineas.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idAgrupacionLinea.Contains(long.Parse(r.Cells[nameof(INTERNO_MantenimientoAgrupacionesLineas_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_MantenimientoAgrupacionesCabecera.Exferia_DataGridView_Lineas.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Lineas Borradas
                g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Total -= _lst_idAgrupacionLinea.Count();
                g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_BarraProgreso_Lineas.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Linea - _lst_idAgrupacionLinea.Count();

                g_frm_P_MantenimientoAgrupacionesCabecera.Rellenar_Listado_ParaPaginado();

                g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(Linea_Borrar_Registro));
            }
        }

        #region Borrar Datos en Base Datos Linea
        public void BorrarDatos_Linea(List<long> _lst_idLinea_ABorrar)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_MantenimientoAgrupacionesCabecera.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_idLinea_ABorrar);

                    g_TareaAsincrona_Borrar_Linea = new BackgroundWorker();
                    g_TareaAsincrona_Borrar_Linea.DoWork += new DoWorkEventHandler(TareaAsincrona_Borrar_Linea_DoWork);
                    g_TareaAsincrona_Borrar_Linea.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Borrar_Linea_Completed);
                    g_TareaAsincrona_Borrar_Linea.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_MantenimientoAgrupacionesCabecera.Enabled = true;

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

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

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

                // Borrar 
                mdl_ValorDevuelto_Modelo = BorrarDatos_Final_Linea(lst_idLinea_ABorrar);

                //Si esta todo Correcto cierro transaccion
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    mdl_ValorDevuelto_Modelo.Listado_Id = lst_idLinea_ABorrar;
                    mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Linea_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, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Linea_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_Linea_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_MantenimientoAgrupacionesCabecera.Enabled = true;

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

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

                    g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_MantenimientoAgrupacionesCabecera.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(TareaAsincrona_Borrar_Linea_Completed));
            }
            finally
            {
                //Poner el Foco Inicial
                Funciones.Poner_Foco_Objeto(g_frm_P_MantenimientoAgrupacionesCabecera, g_frm_P_MantenimientoAgrupacionesCabecera.Exferia_TextBox_Codigo);
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final_Linea(List<long> _lst_idLinea_ABorrar)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType("" + g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.NOMBRE_LIBRERIA() + "." + Variables.G_STR_LIBRERIA_OPCIONES);
                //creamos la instancia
                var obj_Clase = Activator.CreateInstance(m_type);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_OPCIONES_PROCEDIMIENTO_BORRAR_REGISTRO_POROBJETO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_frm_P_MantenimientoAgrupacionesCabecera.g_obj_ABS_MantenimientoAgrupacionesCabecera.OPCION_LINEA(), _lst_idLinea_ABorrar };

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_MantenimientoAgrupacionesCabecera_Controladora) + "/" + nameof(BorrarDatos_Final_Linea));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #endregion
        
    }
}
