using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_Previsiones._1_Modelos;
using Exferia_Previsiones._2_Datos;
using Exferia_Previsiones.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_Previsiones._4_Vistas.Controladoras
{
    public class P_PrevisionAuxiliar_Controladora
    {
        #region Variables Generales
        private P_PrevisionAuxiliar g_frm_P_PrevisionAuxiliar;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        //Clases de Negocio Necesarias para la carga de datos
        private PRE_PrevisionesAuxiliares_Datos g_obj_PRE_PrevisionesAuxiliares_Datos = new PRE_PrevisionesAuxiliares_Datos();
        private PRE_Previsiones_Datos g_obj_PRE_Previsiones_Datos = new PRE_Previsiones_Datos();

        //Modelos Necesarios
        public PRE_PrevisionesAuxiliares g_mdl_PRE_PrevisionesAuxiliares = null;

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

        //Datos de Cerrado
        public string g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

        #region Tarea Asincrona
        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;
        private bool g_bol_Cancelar_TareaAsincrona_CargarDatos = false;

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

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

        //Listados para la carga de los combos
        private List<INTERNO_ComboBox_Modelo> g_lst_Tipo_INTERNO_ComboBox_Modelo = new List<INTERNO_ComboBox_Modelo>();

        #endregion

        //Constructor de la clase lógica
        public P_PrevisionAuxiliar_Controladora(P_PrevisionAuxiliar _frm_P_PrevisionAuxiliar)
        {
            g_frm_P_PrevisionAuxiliar = _frm_P_PrevisionAuxiliar;

            //Cargar de combos
            Cargar_CombosBox();

            g_bol_Termino_CargaDatos_Inicial = true;
        }

        private void Cargar_CombosBox()
        {
            try
            {
                //Exferia_ComboBox_Tipo
                g_lst_Tipo_INTERNO_ComboBox_Modelo = ListadosEstaticos_Previsiones.Devolver_Tipo();
                if(g_lst_Tipo_INTERNO_ComboBox_Modelo != null)
                {
                    g_frm_P_PrevisionAuxiliar.Exferia_ComboBox_Tipo.Items.Clear();
                    g_frm_P_PrevisionAuxiliar.Exferia_ComboBox_Tipo.DataSource = g_lst_Tipo_INTERNO_ComboBox_Modelo;
                    g_frm_P_PrevisionAuxiliar.Exferia_ComboBox_Tipo.SelectedIndex = 0;
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(Cargar_CombosBox));
            }
        }

        public void VaciarDatos()
        {
            //Vaciamos el modelo
            g_mdl_PRE_PrevisionesAuxiliares = null;
            g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

            //Exferia_F3_SoloSeleccion
            g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_FechaBorrado = null;

            //Exferia_TextBox
            g_frm_P_PrevisionAuxiliar.Exferia_TextBox_Importe.Text = "";

            //Exferia_ComboBox
            g_frm_P_PrevisionAuxiliar.Exferia_ComboBox_Tipo.SelectedIndex = 0;

            //Exferia_FechaSeleccion
            g_frm_P_PrevisionAuxiliar.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha = "";
        }

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

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

                    while (g_obj_TareaAsincrona_CargarDatos.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                    g_obj_TareaAsincrona_CargarDatos.WorkerReportsProgress = false;
                }

                //Vaciar
                VaciarDatos();

                g_bol_Cancelar_TareaAsincrona_CargarDatos = false;

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

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

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

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_PrevisionAuxiliar_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_PrevisionAuxiliar.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_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_PrevisionAuxiliar_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_PrevisionAuxiliar.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_PrevisionAuxiliar.Salir_P_Base();
                }
                else
                {
                    if (g_frm_P_PrevisionAuxiliar.Exferia_Button_CerrarAbrir.Enabled)
                    {
                        //Configurar Cerrar/Abrir Volcado/Desvolcado
                        Mostrar_Cerrado();
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_PrevisionAuxiliar.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Foco();
            }
        }

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

            try
            {
                g_mdl_PRE_PrevisionesAuxiliares = g_obj_PRE_PrevisionesAuxiliares_Datos.Obtener(_lng_id);

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

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

                    //Estado
                    g_str_Estado = g_mdl_PRE_PrevisionesAuxiliares.estado;

                    //TextBox
                    g_frm_P_PrevisionAuxiliar.Exferia_TextBox_Importe.Text = g_mdl_PRE_PrevisionesAuxiliares.importe.ToString();

                    //Se cancelo la carga .....................
                    if (g_bol_Cancelar_TareaAsincrona_CargarDatos)
                    {
                        return true;
                    }
                    //........................................

                    //Exferia_ComboBox_Tipo
                    INTERNO_ComboBox_Modelo mdl_Tipo_INTERNO_ComboBox_Modelo = g_lst_Tipo_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_PRE_PrevisionesAuxiliares.tipo.ToString())).FirstOrDefault();
                    if(mdl_Tipo_INTERNO_ComboBox_Modelo != null)
                    {
                        g_frm_P_PrevisionAuxiliar.Exferia_ComboBox_Tipo.SelectedItem = mdl_Tipo_INTERNO_ComboBox_Modelo;
                    }

                    // Exferia_F3_Tesoreria no podra ser nulo
                    g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Id = g_mdl_PRE_PrevisionesAuxiliares.MAE_Tesorerias.id;
                    g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Codigo = g_mdl_PRE_PrevisionesAuxiliares.MAE_Tesorerias.codigo;
                    g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_PRE_PrevisionesAuxiliares.MAE_Tesorerias.descripcion;
                    g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_PRE_PrevisionesAuxiliares.MAE_Tesorerias.fechaBorrado;

                    //MaskedTextBox_Personalizado
                    g_frm_P_PrevisionAuxiliar.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha = g_mdl_PRE_PrevisionesAuxiliares.fecha.ToString("dd/MM/yyyy");

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

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

                        g_frm_P_PrevisionAuxiliar.P_Base_TituloPantalla +=" -Modificar";
                    }

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

                    g_frm_P_PrevisionAuxiliar.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Control_Errores)
            {
                bol_ValorDevuelto = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_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_PrevisionAuxiliar.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_PrevisionAuxiliar.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_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_PrevisionAuxiliar_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_PrevisionAuxiliar_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_PrevisionAuxiliar.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_PrevisionAuxiliar, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    if (g_frm_P_PrevisionAuxiliar.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_PrevisionAuxiliar.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    g_frm_P_PrevisionAuxiliar.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PrevisionAuxiliar_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
            {
                // la Tesoreria no puede estar Vacia (Obligatoria)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                    g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // El Importe no puede estar vacío
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_PrevisionAuxiliar.Exferia_TextBox_Importe.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_PrevisionAuxiliar.Exferia_Label_Importe.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_PrevisionAuxiliar.Exferia_TextBox_Importe;
                }

                // La fecha no puede estar vacia y debe ser correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    int int_fechaAlta_Respuesta = Funciones.Fecha_Validacion(g_frm_P_PrevisionAuxiliar.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha.Trim(' ', '/'));

                    if (int_fechaAlta_Respuesta == 1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_PrevisionAuxiliar.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_PrevisionAuxiliar.Exferia_FechaSeleccion_Fecha;
                    }
                    else if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_PrevisionAuxiliar.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_PrevisionAuxiliar.Exferia_FechaSeleccion_Fecha;
                    }
                }
            }
            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_PrevisionAuxiliar_Controladora) + "/" + nameof(ValidarDatos));

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

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

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    PRE_PrevisionesAuxiliares mdl_PRE_PrevisionesAuxiliares = new PRE_PrevisionesAuxiliares();
                    mdl_PRE_PrevisionesAuxiliares.id = g_mdl_PRE_PrevisionesAuxiliares != null ? g_mdl_PRE_PrevisionesAuxiliares.id : -1;

                    //Estado
                    mdl_PRE_PrevisionesAuxiliares.estado = g_str_Estado;

                    //F3
                    mdl_PRE_PrevisionesAuxiliares.idTesoreria = g_frm_P_PrevisionAuxiliar.Exferia_F3_SoloSeleccion_Tesorerias.Exferia_F3_SoloSeleccion_Id;

                    //TextBox
                    mdl_PRE_PrevisionesAuxiliares.importe = Convert.ToDecimal(g_frm_P_PrevisionAuxiliar.Exferia_TextBox_Importe.Text);

                    //ComboBox
                    mdl_PRE_PrevisionesAuxiliares.tipo = Convert.ToInt32(((INTERNO_ComboBox_Modelo)g_frm_P_PrevisionAuxiliar.Exferia_ComboBox_Tipo.SelectedItem).Identificador);

                    //Fecha
                    mdl_PRE_PrevisionesAuxiliares.fecha = DateTime.ParseExact(g_frm_P_PrevisionAuxiliar.Exferia_FechaSeleccion_Fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                    //Se graba el modelo ya relleno
                    mdl_ValorDevuelto_Modelo = g_obj_PRE_PrevisionesAuxiliares_Datos.Grabar(mdl_PRE_PrevisionesAuxiliares);

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

                    transaccion_SQL.Dispose();

                    //Obtengo el modelo que se acaba de grabar
                    g_mdl_PRE_PrevisionesAuxiliares = g_obj_PRE_PrevisionesAuxiliares_Datos.Obtener(mdl_ValorDevuelto_Modelo.Id);

                    g_frm_P_PrevisionAuxiliar.P_Base_id = g_mdl_PRE_PrevisionesAuxiliares.id;

                    //Permisos para borrar
                    g_frm_P_PrevisionAuxiliar.Exferia_Button_Borrar.Enabled = true;
                }
                catch (Control_Errores)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_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_PrevisionAuxiliar_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_PrevisionAuxiliar_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_BorrarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_PrevisionAuxiliar.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_PrevisionAuxiliar.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_PrevisionAuxiliar.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    g_frm_P_PrevisionAuxiliar.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_PrevisionAuxiliar.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_PRE_PrevisionesAuxiliares_Datos.Borrar( g_mdl_PRE_PrevisionesAuxiliares != null ? g_mdl_PRE_PrevisionesAuxiliares.id : -1);

                return mdl_ValorDevuelto_Modelo;
            }
            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_PrevisionAuxiliar_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;

        }
        #endregion

        #region Cerrar Documento
        public void Cerrar_Documento()
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_CERRANDO_DOCUMENTO());

                BackgroundWorker obj_TareaAsincrona_Cerrar_Documento = new BackgroundWorker();

                obj_TareaAsincrona_Cerrar_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_Cerrar_Documento_DoWork);
                obj_TareaAsincrona_Cerrar_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Cerrar_Documento_Completed);
                obj_TareaAsincrona_Cerrar_Documento.RunWorkerAsync();

                //Mostrar Pantalla de Espera
                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(Cerrar_Documento));
            }
        }

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

            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    //Comprueba que el modelo no sea nulo
                    if(g_mdl_PRE_PrevisionesAuxiliares != null)
                    {
                        //Funcion que se encerga de hacer las funciones necesarias
                        Funciones_Previsiones obj_Funciones_Previsiones = new Funciones_Previsiones();
                        mdl_ValorDevuelto_Modelo = obj_Funciones_Previsiones.Cerrar_Prevision_Calcular(g_frm_P_PrevisionAuxiliar.g_mdl_PRV_OpcionesDetalle.opcion,
                                                                           "",
                                                                           -1,
                                                                           g_mdl_PRE_PrevisionesAuxiliares.id,
                                                                           -1,
                                                                           g_mdl_PRE_PrevisionesAuxiliares.idTesoreria,
                                                                           -1,
                                                                           g_mdl_PRE_PrevisionesAuxiliares.importe,
                                                                           g_mdl_PRE_PrevisionesAuxiliares.fecha,
                                                                           g_mdl_PRE_PrevisionesAuxiliares.tipo,
                                                                           g_frm_P_PrevisionAuxiliar.g_mdl_PRV_OpcionesDetalle.descripcion_TituloListado);

                        //Si todo sale bien 
                        if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            //Termino Transaccion
                            transaccion_SQL.Complete();
                        }
                    }
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(TareaAsincrona_Cerrar_Documento_DoWork));

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

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(TareaAsincrona_Cerrar_Documento_DoWork));

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
                }
                finally
                {
                    transaccion_SQL.Dispose();

                    e.Result = mdl_ValorDevuelto_Modelo;
                }
            }
        }
        private void TareaAsincrona_Cerrar_Documento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

            try
            {
                //Termino 
                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Termino todo Correctamente
                if (mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.TodoCorrecto)
                {
                    Mostrar_Cerrado();

                    //Actualizar registro en Listado principal
                    if (g_frm_P_PrevisionAuxiliar.P_Base_PantallaOrigen != null)
                    {
                        List<INTERNO_ActualizarCampoListadoGeneral_Modelo> lst_INTERNO_ActualizarCampoListadoGeneral_Modelo = new List<INTERNO_ActualizarCampoListadoGeneral_Modelo>();
                        lst_INTERNO_ActualizarCampoListadoGeneral_Modelo.Add(new INTERNO_ActualizarCampoListadoGeneral_Modelo(g_mdl_PRE_PrevisionesAuxiliares.id, nameof(INTERNO_PRE_PrevisionesAuxiliares_Listado_Modelo.estado), g_str_Estado));

                        g_frm_P_PrevisionAuxiliar.P_Base_PantallaOrigen.P_Base_ActualizarRegistros_Campo(lst_INTERNO_ActualizarCampoListadoGeneral_Modelo, G_ENUM_TIPOACCION.INT_MODIFICAR);
                    }
                }
                //Ocurrio un Error
                else
                {
                    Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.Mensaje);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(TareaAsincrona_Cerrar_Documento_Completed));
            }
        }
        #endregion

        #region Abrir Documento
        public void Abrir_Documento( )
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_CERRANDO_DOCUMENTO());

                BackgroundWorker obj_TareaAsincrona_Abrir_Documento = new BackgroundWorker();

                obj_TareaAsincrona_Abrir_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_Abrir_Documento_DoWork);
                obj_TareaAsincrona_Abrir_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Abrir_Documento_Completed);
                obj_TareaAsincrona_Abrir_Documento.RunWorkerAsync();

                //Mostrar Pantalla de Espera
                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                if (g_frm_PE_Esperando != null)
                {
                    g_frm_PE_Esperando.Close();
                    g_frm_PE_Esperando = null;
                }

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(Abrir_Documento));
            }
        }

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

            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    //Funcion que se encerga de hacer las funciones necesarias
                    Funciones_Previsiones obj_Funciones_Previsiones = new Funciones_Previsiones();
                    mdl_ValorDevuelto_Modelo = obj_Funciones_Previsiones.Abrir_Prevision_Calcular(g_frm_P_PrevisionAuxiliar.g_mdl_PRV_OpcionesDetalle.opcion,
                                                                       "",
                                                                       g_mdl_PRE_PrevisionesAuxiliares.id,
                                                                       -1,
                                                                       g_mdl_PRE_PrevisionesAuxiliares.importe,
                                                                       g_mdl_PRE_PrevisionesAuxiliares.tipo);

                    //Si todo sale bien 
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Termino Transaccion
                        transaccion_SQL.Complete();
                    }
                }
                catch (ThreadAbortException ex)
                {
                    transaccion_SQL.Dispose();

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(TareaAsincrona_Abrir_Documento_DoWork));

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

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(TareaAsincrona_Abrir_Documento_DoWork));

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_CERRAR_DOCUMENTO();
                }
                finally
                {
                    e.Result = mdl_ValorDevuelto_Modelo;
                }
            }
        }
        private void TareaAsincrona_Abrir_Documento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

            try
            {
                //Termino 
                INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO = (INTERNO_ValorDevuelto_Modelo)e.Result;

                //Termino todo Correctamente
                if (mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.TodoCorrecto)
                {
                    Mostrar_Cerrado();

                    //Actualizar registro en Listado principal
                    if (g_frm_P_PrevisionAuxiliar.P_Base_PantallaOrigen != null)
                    {
                        List<INTERNO_ActualizarCampoListadoGeneral_Modelo> lst_INTERNO_ActualizarCampoListadoGeneral_Modelo = new List<INTERNO_ActualizarCampoListadoGeneral_Modelo>();
                        lst_INTERNO_ActualizarCampoListadoGeneral_Modelo.Add(new INTERNO_ActualizarCampoListadoGeneral_Modelo(g_mdl_PRE_PrevisionesAuxiliares.id, nameof(INTERNO_PRE_PrevisionesAuxiliares_Listado_Modelo.estado), g_str_Estado));

                        g_frm_P_PrevisionAuxiliar.P_Base_PantallaOrigen.P_Base_ActualizarRegistros_Campo(lst_INTERNO_ActualizarCampoListadoGeneral_Modelo, G_ENUM_TIPOACCION.INT_MODIFICAR);
                    }
                }
                //Ocurrio un Error
                else
                {
                    Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.Mensaje);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_PrevisionAuxiliar_Controladora) + "/" + nameof(TareaAsincrona_Abrir_Documento_Completed));
            }
        }
        #endregion

        public void Mostrar_Cerrado()
        {
            //Por Defecto
            g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

            //CERRADO O ABIERTO ##############################################################################################################
            //Buscar si esta Cerrado
            if(g_mdl_PRE_PrevisionesAuxiliares != null)
            {
                g_str_Estado = g_obj_PRE_PrevisionesAuxiliares_Datos.Obtener_Estado(g_mdl_PRE_PrevisionesAuxiliares.id);

                //Si esta Cerrado Bloqueo para que no deje hacer nada
                if(g_str_Estado.Equals(Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO))
                {
                    //Cambiar Imagen del Boton de Cerrar
                    g_frm_P_PrevisionAuxiliar.Exferia_Button_CerrarAbrir.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_CERRADO;
                    Imagenes.Asignar_Imagen(g_frm_P_PrevisionAuxiliar.Exferia_Button_CerrarAbrir);
                    g_frm_P_PrevisionAuxiliar.Exferia_Button_CerrarAbrir.Tag = "1";

                    //Bloqueo los controles
                    SoloLectura.Empezar(g_frm_P_PrevisionAuxiliar, true);

                }
                //Abierto
                else
                {
                    //Cambiar Imagen del Boton de Abrir
                    g_frm_P_PrevisionAuxiliar.Exferia_Button_CerrarAbrir.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_ABIERTO;
                    Imagenes.Asignar_Imagen(g_frm_P_PrevisionAuxiliar.Exferia_Button_CerrarAbrir);
                    g_frm_P_PrevisionAuxiliar.Exferia_Button_CerrarAbrir.Tag = "0";

                    //Desbloqueo los controles
                    SoloLectura.Empezar(g_frm_P_PrevisionAuxiliar, false);

                }

            }
        }
    }
}
