using Exferia_Aplicacion.General;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_General._3_Vistas.ListadosSeleccion;
using Exferia_Maestros._0_Modelos;
using Exferia_Maestros._1_Datos;
using Exferia_Maestros.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;

namespace Exferia_Maestros._3_Vistas.Controladoras
{
    public class P_Ubicacion_Controladora
    {
        #region Variables Generales
        private P_Ubicacion g_frm_P_Ubicacion = null; //Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando; //Pantalla de espera, para cuando se ejecuten tareas pesadas como cargar, guardar, etc
        
        //Clases de Negocio Necesarias para la carga de datos
        private MAE_Ubicaciones_Datos g_obj_MAE_Ubicaciones_Datos = new MAE_Ubicaciones_Datos();
        private MAE_TiposProductos_Datos g_obj_MAE_TiposProductos_Datos = new MAE_TiposProductos_Datos();

        //Modelo
        public MAE_Ubicaciones g_mdl_MAE_Ubicaciones = null;//Modelo de los datos de las ubicaciones, cargados

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

        private List<INTERNO_ComboBox_Modelo> g_lst_INTERNO_ComboBox_Modelo_TIPOFUNCION = new List<INTERNO_ComboBox_Modelo>();

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

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

        //Tarea Asincrona de borrar de datos
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos;
        private bool g_bol_BorrarDatos_VolverListado = true;

        public bool g_bol_CampoCodigo_Numerico = false;
        #endregion

        #region Constructor
        public P_Ubicacion_Controladora(P_Ubicacion _frm_P_Ubicacion)
        {
            g_frm_P_Ubicacion = _frm_P_Ubicacion;

            Datos_Iniciales();

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        private void Datos_Iniciales()
        {

            //Exferia_ComboBox_TipoTrazabilidad ENTRADAS
            g_lst_INTERNO_ComboBox_Modelo_TIPOFUNCION = ListadosEstaticos.Devolver_TipoFuncion();

            if (g_lst_INTERNO_ComboBox_Modelo_TIPOFUNCION != null)
            {
                g_frm_P_Ubicacion.Exferia_ComboBox_TipoFuncion.Items.Clear();
                g_frm_P_Ubicacion.Exferia_ComboBox_TipoFuncion.DataSource = g_lst_INTERNO_ComboBox_Modelo_TIPOFUNCION;
                g_frm_P_Ubicacion.Exferia_ComboBox_TipoFuncion.SelectedIndex = 0;
            }
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //Codigo
            g_frm_P_Ubicacion.Exferia_TextBox_Codigo.Text = "";

            //Descripcion
            g_frm_P_Ubicacion.Exferia_TextBox_Descripcion.Text = "";

            //Almacen
            g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Id = -1;
            g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Codigo = "";
            g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Descripcion = "";
            g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_FechaBorrado = null;

            //UbicacionPerfil
            g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Id = -1;
            g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Codigo = "";
            g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Descripcion = "";
            g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_FechaBorrado = null;

            //TipoProducto
            g_frm_P_Ubicacion.Exferia_Label_SinColor_TipoProducto.Text = "";

            //TipoFuncion
            g_frm_P_Ubicacion.Exferia_ComboBox_TipoFuncion.SelectedIndex = 0;

            //Medida_Alto
            g_frm_P_Ubicacion.Exferia_TextBox_Medida_Alto.Text = "";

            //Medida_Ancho
            g_frm_P_Ubicacion.Exferia_TextBox_Medida_Ancho.Text = "";

            //Medida_Largo
            g_frm_P_Ubicacion.Exferia_TextBox_Medida_Largo.Text = "";

            //Huecos_Alto
            g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Alto.Text = "";

            //Huecos_Ancho
            g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Ancho.Text = "";

            //Huecos_Largo
            g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Largo.Text = "";

            //PesoMaximo
            g_frm_P_Ubicacion.Exferia_TextBox_PesoMaximo.Text = "";

            //Secuencia
            g_frm_P_Ubicacion.Exferia_TextBox_Secuencia.Text = "";
          

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

            //Actualizar el Boton de Seleccion de pantala #######################################################
            Variables.G_EMS_CONTROL_MENUSUPERIOR.Update_Texto_NombrePantalla(g_frm_P_Ubicacion.Tag.ToString());
            //###################################################################################################
            
            g_mdl_MAE_Ubicaciones = null;
        }
        #endregion

        #region Buscar Codigo Siguiente
        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(MAE_Ubicaciones),
                                                                                    nameof(MAE_Ubicaciones.codigo),
                                                                                    nameof(MAE_Ubicaciones.idEmpresa),
                                                                                    g_mdl_MAE_Ubicaciones != null ? g_mdl_MAE_Ubicaciones.idEmpresa : Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Ubicacion.P_Base_ValoresGenerales.lng_idEmpresa, nameof(MAE_Ubicaciones)),
                                                                                    true,
                                                                                    g_frm_P_Ubicacion.Exferia_TextBox_Codigo.Exferia_TextBox_MaxLength);

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_Ubicacion.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_Ubicacion.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, nameof(P_Ubicacion_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_Ubicacion.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(false);

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

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        #endregion

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Ubicacion.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.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = false;
                }

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

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

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

                throw new Control_Errores("", ex, nameof(P_Ubicacion_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_Ubicacion.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Dowork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Dowork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_CargarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            //Desbloquear el Formulario
            g_frm_P_Ubicacion.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_Ubicacion.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Ubicacion.Salir_P_Base();
            }
            finally
            {
               
                //Hacemos foco al primer control.
                g_frm_P_Ubicacion.Exferia_TextBox_Codigo.Exferia_TextBox_Foco();
            }
        }
        public bool CargarDatos (long _lng_id)
        {
            bool bol_ValorDevuelto = true;

            try
            {
                g_mdl_MAE_Ubicaciones = g_obj_MAE_Ubicaciones_Datos.Obtener(_lng_id);

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

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

                    //codigo
                    g_frm_P_Ubicacion.Exferia_TextBox_Codigo.Text = g_mdl_MAE_Ubicaciones.codigo;

                    //descripcion
                    g_frm_P_Ubicacion.Exferia_TextBox_Descripcion.Text = g_mdl_MAE_Ubicaciones.descripcion;

                    //Almacen
                    g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Id = g_mdl_MAE_Ubicaciones.GEN_Almacenes.id;
                    g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Codigo = g_mdl_MAE_Ubicaciones.GEN_Almacenes.codigo;
                    g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Descripcion = g_mdl_MAE_Ubicaciones.GEN_Almacenes.descripcion;
                    g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_FechaBorrado = g_mdl_MAE_Ubicaciones.GEN_Almacenes.fechaBorrado;

                    //UbicacionPerfil
                    if (g_mdl_MAE_Ubicaciones.MAE_UbicacionesPerfiles != null)
                    {
                        g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Id = g_mdl_MAE_Ubicaciones.MAE_UbicacionesPerfiles.id;
                        g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Codigo = g_mdl_MAE_Ubicaciones.MAE_UbicacionesPerfiles.codigo;
                        g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Descripcion = g_mdl_MAE_Ubicaciones.MAE_UbicacionesPerfiles.descripcion;
                        g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_FechaBorrado = g_mdl_MAE_Ubicaciones.MAE_UbicacionesPerfiles.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Id = -1;
                        g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Codigo = string.Empty;
                        g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Descripcion = string.Empty;
                        g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_FechaBorrado = null;
                    }
                   
                    //TipoProducto
                    if (g_mdl_MAE_Ubicaciones.MAE_UbicacionesPerfiles!=null && g_mdl_MAE_Ubicaciones.MAE_UbicacionesPerfiles.MAE_TiposProductos != null)
                    {
                        g_frm_P_Ubicacion.Exferia_Label_SinColor_TipoProducto.Text ="(" + g_mdl_MAE_Ubicaciones.MAE_UbicacionesPerfiles.MAE_TiposProductos.codigo + ") " + g_mdl_MAE_Ubicaciones.MAE_UbicacionesPerfiles.MAE_TiposProductos.descripcion;
                    }

                    //TipoFuncion
                    INTERNO_ComboBox_Modelo mdl_INTERNO_ComboBox_Modelo_TIPOFUNCION = null;
                    if (g_mdl_MAE_Ubicaciones.tipoFuncion!=null && g_mdl_MAE_Ubicaciones.tipoFuncion.Trim().Length > 0)
                    {
                        mdl_INTERNO_ComboBox_Modelo_TIPOFUNCION = g_lst_INTERNO_ComboBox_Modelo_TIPOFUNCION.Where(m => m.Identificador.Equals(g_mdl_MAE_Ubicaciones.tipoFuncion)).FirstOrDefault();
                        if (mdl_INTERNO_ComboBox_Modelo_TIPOFUNCION != null)
                        {
                            g_frm_P_Ubicacion.Exferia_ComboBox_TipoFuncion.SelectedItem = mdl_INTERNO_ComboBox_Modelo_TIPOFUNCION;
                        }
                    }

                    //medida_Alto
                    g_frm_P_Ubicacion.Exferia_TextBox_Medida_Alto.Text = g_mdl_MAE_Ubicaciones.medida_Alto!=null ? string.Format("{0:0.000}", g_mdl_MAE_Ubicaciones.medida_Alto.Value) : "";

                    //medida_Ancho
                    g_frm_P_Ubicacion.Exferia_TextBox_Medida_Ancho.Text = g_mdl_MAE_Ubicaciones.medida_Ancho != null ? string.Format("{0:0.000}", g_mdl_MAE_Ubicaciones.medida_Ancho.Value) : "";

                    //medida_Largo
                    g_frm_P_Ubicacion.Exferia_TextBox_Medida_Largo.Text = g_mdl_MAE_Ubicaciones.medida_Largo != null ? string.Format("{0:0.000}", g_mdl_MAE_Ubicaciones.medida_Largo.Value) : "";

                    //huecos_Alto
                    g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Alto.Text = g_mdl_MAE_Ubicaciones.huecos_Alto != null ? g_mdl_MAE_Ubicaciones.huecos_Alto.Value.ToString() : "";

                    //huecos_Ancho
                    g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Ancho.Text = g_mdl_MAE_Ubicaciones.huecos_Ancho != null ? g_mdl_MAE_Ubicaciones.huecos_Ancho.Value.ToString() : "";

                    //huecos_Largo
                    g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Largo.Text = g_mdl_MAE_Ubicaciones.huecos_Largo != null ? g_mdl_MAE_Ubicaciones.huecos_Largo.Value.ToString() : "";

                    //pesoMaximo
                    g_frm_P_Ubicacion.Exferia_TextBox_PesoMaximo.Text = g_mdl_MAE_Ubicaciones.pesoMaximo != null ? g_mdl_MAE_Ubicaciones.pesoMaximo.Value.ToString() : "";

                    //secuencia
                    g_frm_P_Ubicacion.Exferia_TextBox_Secuencia.Text = g_mdl_MAE_Ubicaciones.secuencia != null ? g_mdl_MAE_Ubicaciones.secuencia.Value.ToString() : "";

                    //Mostrar Campo en el Titulo de Mantenimiento
                    string str_MenuSuperior_Codigo = "";
                    if (g_frm_P_Ubicacion.g_mdl_PRV_OpcionesDetalle != null &&
                        g_frm_P_Ubicacion.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento != null &&
                        g_frm_P_Ubicacion.g_mdl_PRV_OpcionesDetalle.camposMostrar_TituloMantenimiento.Trim().Length > 0)
                    {
                        //Obtener el Array de Campos
                        string[] arr_Campos = g_frm_P_Ubicacion.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_Ubicacion.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
                        {
                            g_frm_P_Ubicacion.P_Base_TituloPantalla = (g_frm_P_Ubicacion.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None))[0];
                        }
                        dynamic dnm_Objeto = g_mdl_MAE_Ubicaciones;
                        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_MAE_Ubicaciones.codigo)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_MAE_Ubicaciones.codigo;
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Ubicacion.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_Ubicacion.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

                    g_frm_P_Ubicacion.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(CargarDatos));
                bol_ValorDevuelto = false;
            }
            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_VolverAlListado)
        {
            try
            {
                g_bol_GrabarDatos_VolverListado = _bol_VolverAlListado;

                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_Ubicacion.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_Ubicacion.Enabled = true;
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_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
                {
                    e.Result = mdl_ValorDevuelto_Modelo_VALIDACION;
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

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

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

                    if (g_bol_GrabarDatos_VolverListado)
                    {
                        g_frm_P_Ubicacion.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_Ubicacion.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_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_Ubicacion.Exferia_TextBox_Codigo.Text.Trim().Length == 0)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_AUX = Buscar_CodigoSiguiente();

                    if (mdl_INTERNO_ValorDevuelto_Modelo_AUX.TodoCorrecto == false)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo_AUX.Mensaje;
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Ubicacion.Exferia_TextBox_Codigo;
                    }
                }

                // El codigo no puede estar Repetido
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    string str_Codigo = g_frm_P_Ubicacion.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(MAE_Ubicaciones), nameof(MAE_Ubicaciones.codigo), str_Codigo, nameof(MAE_Ubicaciones.id), (g_mdl_MAE_Ubicaciones != null ? g_mdl_MAE_Ubicaciones.id : -1), nameof(MAE_Ubicaciones.idEmpresa), g_frm_P_Ubicacion.P_Base_ValoresGenerales.lng_idEmpresa, true))
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_Ubicacion.Exferia_Label_Codigo.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Ubicacion.Exferia_TextBox_Codigo;
                    }
                }

                //La descripcion no puede estar Repetida
                if((mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Ubicacion.Exferia_TextBox_Descripcion.Text.Trim().Length == 0))
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Ubicacion.Exferia_Label_Descripcion.Text);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Ubicacion.Exferia_TextBox_Descripcion;
                }

                //El Almacen no puede estar Vacio (Obligatorio)
                if(mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //Si hay Almacen Validar que es correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Id == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //El PerfilUbicacion no puede estar Vacio (Obligatorio)
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Codigo.Trim().Length == 0 &&
                    g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Descripcion.Trim().Length == 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                //Si hay PerfilUbicacion Validar que es correcta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Codigo.Trim().Length != 0 ||
                    g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Descripcion.Trim().Length != 0) && g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Id == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(ValidarDatos));

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

            return mdl_INTERNO_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;
            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = "";


            try
            {
                MAE_Ubicaciones mdl_MAE_Ubicaciones = new MAE_Ubicaciones();

                //id
                mdl_MAE_Ubicaciones.id = g_mdl_MAE_Ubicaciones != null ? g_mdl_MAE_Ubicaciones.id : -1;

                //Asignar el idEmpresa
                if ((g_mdl_MAE_Ubicaciones != null ? g_mdl_MAE_Ubicaciones.idEmpresa : -1) != -1)
                {
                    mdl_MAE_Ubicaciones.idEmpresa = g_mdl_MAE_Ubicaciones.idEmpresa;
                }
                else
                {
                    //Buscar el idEmpresa que Corresponda
                    mdl_MAE_Ubicaciones.idEmpresa = Datos_Generales.GEN_Empresas_Devolver_IdEmpresa_AGrabar(g_frm_P_Ubicacion.P_Base_ValoresGenerales.lng_idEmpresa, nameof(MAE_Ubicaciones));
                }

                //codigo
                mdl_MAE_Ubicaciones.codigo = g_frm_P_Ubicacion.Exferia_TextBox_Codigo.Text.Trim();

                //descripcion
                mdl_MAE_Ubicaciones.descripcion = g_frm_P_Ubicacion.Exferia_TextBox_Descripcion.Text.Trim();

                //idAlmacen
                mdl_MAE_Ubicaciones.idAlmacen = g_frm_P_Ubicacion.Exferia_F3_Almacen.Exferia_F3_Id;

                //idUbicacionPerfil
                mdl_MAE_Ubicaciones.idUbicacionPerfil = g_frm_P_Ubicacion.Exferia_F3_UbicacionPerfil.Exferia_F3_Id;

                //tipoFuncion
                mdl_MAE_Ubicaciones.tipoFuncion = ((INTERNO_ComboBox_Modelo)g_frm_P_Ubicacion.Exferia_ComboBox_TipoFuncion.SelectedItem).Identificador;

                //medida_Alto
                if (g_frm_P_Ubicacion.Exferia_TextBox_Medida_Alto.Text.Trim().Length > 0)
                {
                    mdl_MAE_Ubicaciones.medida_Alto =  Convert.ToDecimal(g_frm_P_Ubicacion.Exferia_TextBox_Medida_Alto.Text.Trim());
                }
                else
                {
                    mdl_MAE_Ubicaciones.medida_Alto = null;
                }

                //medida_Ancho
                if (g_frm_P_Ubicacion.Exferia_TextBox_Medida_Ancho.Text.Trim().Length > 0)
                {
                    mdl_MAE_Ubicaciones.medida_Ancho = Convert.ToDecimal(g_frm_P_Ubicacion.Exferia_TextBox_Medida_Ancho.Text.Trim());
                }
                else
                {
                    mdl_MAE_Ubicaciones.medida_Ancho = null;
                }

                //medida_Largo
                if (g_frm_P_Ubicacion.Exferia_TextBox_Medida_Largo.Text.Trim().Length > 0)
                {
                    mdl_MAE_Ubicaciones.medida_Largo = Convert.ToDecimal(g_frm_P_Ubicacion.Exferia_TextBox_Medida_Largo.Text.Trim());
                }
                else
                {
                    mdl_MAE_Ubicaciones.medida_Largo = null;
                }

                //huecos_Alto
                if (g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Alto.Text.Trim().Length > 0)
                {
                    mdl_MAE_Ubicaciones.huecos_Alto = Convert.ToInt32(g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Alto.Text.Trim());
                }
                else
                {
                    mdl_MAE_Ubicaciones.huecos_Alto = null;
                }

                //huecos_Ancho
                if (g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Ancho.Text.Trim().Length > 0)
                {
                    mdl_MAE_Ubicaciones.huecos_Ancho = Convert.ToInt32(g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Ancho.Text.Trim());
                }
                else
                {
                    mdl_MAE_Ubicaciones.huecos_Ancho = null;
                }

                //huecos_Largo
                if (g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Largo.Text.Trim().Length > 0)
                {
                    mdl_MAE_Ubicaciones.huecos_Largo = Convert.ToInt32(g_frm_P_Ubicacion.Exferia_TextBox_Huecos_Largo.Text.Trim());
                }
                else
                {
                    mdl_MAE_Ubicaciones.huecos_Largo = null;
                }

                //pesoMaximo
                if (g_frm_P_Ubicacion.Exferia_TextBox_PesoMaximo.Text.Trim().Length > 0)
                {
                    mdl_MAE_Ubicaciones.pesoMaximo = Convert.ToDecimal(g_frm_P_Ubicacion.Exferia_TextBox_PesoMaximo.Text.Trim());
                }

                //secuencia
                if (g_frm_P_Ubicacion.Exferia_TextBox_Secuencia.Text.Trim().Length > 0)
                {
                    mdl_MAE_Ubicaciones.secuencia = Convert.ToInt32(g_frm_P_Ubicacion.Exferia_TextBox_Secuencia.Text.Trim());
                }
                else
                {
                    mdl_MAE_Ubicaciones.secuencia = null;
                }

                //Se graba el modelo ya relleno.
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_MAE_Ubicaciones_Datos.Grabar(mdl_MAE_Ubicaciones);

            }
            catch (Control_Errores) 
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(GrabarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();

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

                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_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_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                //Borrar
                mdl_INTERNO_ValorDevuelto_Modelo = BorrarDatos_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

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

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_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_Ubicacion.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
                    if (g_frm_P_Ubicacion.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Ubicacion.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Ubicacion.P_Base_F3Origen != null)
                    {
                        g_frm_P_Ubicacion.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    if (g_bol_BorrarDatos_VolverListado)
                    {
                        g_frm_P_Ubicacion.P_Base_SeModificoDatosPantalla = false;
                        g_frm_P_Ubicacion.Salir_P_Base();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_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_MAE_Ubicaciones_Datos.Borrar(g_mdl_MAE_Ubicaciones!= null ? g_mdl_MAE_Ubicaciones.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, nameof(P_Ubicacion_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 rellenar el Tipo de Producto por Perfil de ubicacion
        public void Rellenar_TipoProducto_Por_PerfilUbicacion(long _lng_idUbicacionPerfil)
        {
            try
            {
                MAE_TiposProductos mdl_MAE_TiposProductos=g_obj_MAE_TiposProductos_Datos.Obtener_Modelo_Por_IdUbicacionPerfil(_lng_idUbicacionPerfil);
                if (mdl_MAE_TiposProductos!=null)
                {
                    g_frm_P_Ubicacion.Exferia_Label_SinColor_TipoProducto.Text ="(" + mdl_MAE_TiposProductos.codigo + ") " + mdl_MAE_TiposProductos.descripcion;
                }
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Ubicacion_Controladora) + "/" + nameof(Rellenar_TipoProducto_Por_PerfilUbicacion));
            }
        }
        #endregion

    }
}
