using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Contabilidad._0_Modelos;
using Exferia_Contabilidad._1_Datos;
using Exferia_Contabilidad._3_Vistas.ControlesPersonalizados_DentroPaneles;
using Exferia_Contabilidad._3_Vistas.Listados;
using Exferia_Contabilidad.General;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_General._3_Vistas.ListadosSeleccion;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.IO;
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_Contabilidad._3_Vistas.Controladoras
{
    public class P_InformeContableAcumulado_Controladora
    {
        #region Variables Generales
        private P_InformeContableAcumulado g_frm_P_InformeContableAcumulado = null;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        //Clases de Datos Necesarias para la carga de datos
        private CTA_InformesContablesLineaAcumulados_Datos g_obj_CTA_InformesContablesLineaAcumulados_Datos = new CTA_InformesContablesLineaAcumulados_Datos();

        //Modelos
        public CTA_InformesContablesLineaAcumulados g_mdl_CTA_InformesContablesLineaAcumulados = null;

        //Combos
        private List<INTERNO_ComboBox_Modelo> g_lst_CalculoOperaciones_INTERNO_ComboBox_Modelo = null;
        private List<INTERNO_ComboBox_Modelo> g_lst_Operaciones_INTERNO_ComboBox_Modelo = null;

        public long g_lng_idInformeContableLinea = -1;
        public CTA_InformesContablesCabecera g_mdl_CTA_InformesContablesCabecera = null;
        private P_Base g_frm_P_InformeContableCabecera = null;

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

        #region Tareas Asincronas
        //Tareea Asincrona de carga de datos
        public bool g_bol_TareaAsincrona_CargarDatos_Termino = true;
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;

        //Tareea Asincrona de grabar de datos
        public bool g_bol_GrabarDatos_TerminoCorrectamente = true;
        public bool g_bol_GrabarDatos_VaciarDatos = false;
        public bool g_bol_GrabarDatos_Salir = false;
        private BackgroundWorker g_obj_TareaAsincrona_GrabarDatos;

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

        #endregion

        #region Constructor
        public P_InformeContableAcumulado_Controladora(P_InformeContableAcumulado _frm_P_InformeContableAcumulado, CTA_InformesContablesCabecera _mdl_CTA_InformesContablesCabecera, long _lng_idInformeContableLinea, P_Base _frm_P_InformeContableCabecera)
        {
            g_frm_P_InformeContableAcumulado = _frm_P_InformeContableAcumulado;
            g_lng_idInformeContableLinea = _lng_idInformeContableLinea;
            g_mdl_CTA_InformesContablesCabecera = _mdl_CTA_InformesContablesCabecera;
            g_frm_P_InformeContableCabecera = _frm_P_InformeContableCabecera;

            Cargar_DatosIniciales();

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        public void Cargar_DatosIniciales()
        {
            //CalculoOperacion
            g_lst_CalculoOperaciones_INTERNO_ComboBox_Modelo = ListadosEstaticos.Devolver_InformesContablesAcumulados_CalculosOperaciones();
            g_frm_P_InformeContableAcumulado.Exferia_ComboBox_CalculoOperacion.Items.Clear();
            g_frm_P_InformeContableAcumulado.Exferia_ComboBox_CalculoOperacion.DataSource = g_lst_CalculoOperaciones_INTERNO_ComboBox_Modelo;
            g_frm_P_InformeContableAcumulado.Exferia_ComboBox_CalculoOperacion.SelectedIndex = 0;

            //Operacion
            g_lst_Operaciones_INTERNO_ComboBox_Modelo = ListadosEstaticos.Devolver_InformesContablesAcumulados_Operaciones();
            g_frm_P_InformeContableAcumulado.Exferia_ComboBox_Operacion.Items.Clear();
            g_frm_P_InformeContableAcumulado.Exferia_ComboBox_Operacion.DataSource = g_lst_Operaciones_INTERNO_ComboBox_Modelo;
            g_frm_P_InformeContableAcumulado.Exferia_ComboBox_Operacion.SelectedIndex = 0;

        }
        #endregion

        #region Vaciar datos
        public void VaciarDatos()
        {
            //Modelo
            g_mdl_CTA_InformesContablesLineaAcumulados = null;

            //InformeContableLinea(F3)
            g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_FechaBorrado = null;

            //Linea
            g_frm_P_InformeContableAcumulado.Exferia_TextBox_Linea.Text = "";

            //CalculoOperacion
            g_frm_P_InformeContableAcumulado.Exferia_ComboBox_CalculoOperacion.SelectedIndex = 0;

            //CalculoValor
            g_frm_P_InformeContableAcumulado.Exferia_TextBox_CalculoValor.Text = "";

            //Especial
            g_frm_P_InformeContableAcumulado.Exferia_ComboBox_Operacion.SelectedIndex = 0;


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

            //Actualizar el Boton de Seleccion de pantalla ####################################################
            Variables.G_EMS_CONTROL_MENUSUPERIOR.Update_Texto_NombrePantalla(g_frm_P_InformeContableAcumulado.Tag.ToString());
            //#################################################################################################
        }
        #endregion

        #region Comprobacion de cambios, para  grabar o no antes de salir o cambiar de registro
        public bool ComprobarCambios()
        {
            if (g_frm_P_InformeContableAcumulado.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos(false, 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_InformeContableAcumulado.Enabled = false;

                //Mostrar la pantalla de espera
                g_frm_PE_Esperando = new PE_Esperando();

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos != null)
                {
                    while (g_obj_TareaAsincrona_CargarDatos.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_CargarDatos = new BackgroundWorker();
                    g_obj_TareaAsincrona_CargarDatos.DoWork += new DoWorkEventHandler(TareaAsincrona_CargarDatos_DoWork);
                    g_obj_TareaAsincrona_CargarDatos.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_CargarDatos_Completed);
                }

                g_bol_TareaAsincrona_CargarDatos_Termino = false;

                //Vaciar 
                VaciarDatos();

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_bol_TareaAsincrona_CargarDatos_Termino = true;
                g_frm_P_InformeContableAcumulado.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_InformeContableAcumulado_Controladora) + "/" + nameof(RecargarDatos), true);
            }
        }
        private void TareaAsincrona_CargarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Cargar Valores
                if (CargarDatos(g_frm_P_InformeContableAcumulado.P_Base_id) == false)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InformeContableAcumulado_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InformeContableAcumulado_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_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_InformeContableAcumulado.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_InformeContableAcumulado.Salir_P_Base();
                }
                else
                {
                    if (g_frm_P_InformeContableAcumulado.Exferia_TextBox_CalculoValor.Text.Trim().Length>0)
                    {
                        g_frm_P_InformeContableAcumulado.Panel_Valor.Visible = true;
                    }
                    else
                    {
                        g_frm_P_InformeContableAcumulado.Panel_Valor.Visible = false;
                    }
                }            
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InformeContableAcumulado_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_InformeContableAcumulado.Salir_P_Base();
            }
            finally
            {
                g_bol_TareaAsincrona_CargarDatos_Termino = true;

                Funciones.Poner_Foco_Objeto(g_frm_P_InformeContableAcumulado, g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo);
            }
        }

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

            try
            {
                //Obtener el modelo
                g_mdl_CTA_InformesContablesLineaAcumulados = g_obj_CTA_InformesContablesLineaAcumulados_Datos.Obtener(_lng_id);

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

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

                    //linea
                    g_frm_P_InformeContableAcumulado.Exferia_TextBox_Linea.Text = g_mdl_CTA_InformesContablesLineaAcumulados.linea.ToString();

                    //CTA_InformesContablesLinea
                    g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Id = g_mdl_CTA_InformesContablesLineaAcumulados.CTA_InformesContablesLinea1.id;
                    g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Codigo = g_mdl_CTA_InformesContablesLineaAcumulados.CTA_InformesContablesLinea1.linea.ToString();
                    g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_CTA_InformesContablesLineaAcumulados.CTA_InformesContablesLinea1.descripcion;
                    g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_CTA_InformesContablesLineaAcumulados.CTA_InformesContablesLinea1.fechaBorrado;
                   
                    //calculo_operacion
                    if (g_mdl_CTA_InformesContablesLineaAcumulados.calculo_operacion!=null)
                    {
                        //calculo_operacion
                        g_frm_P_InformeContableAcumulado.Exferia_ComboBox_CalculoOperacion.SelectedItem = g_lst_CalculoOperaciones_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_CTA_InformesContablesLineaAcumulados.calculo_operacion.Value.ToString())).FirstOrDefault();

                        //calculo_valor
                        g_frm_P_InformeContableAcumulado.Exferia_TextBox_CalculoValor.Text = string.Format("{0:0.00}", g_mdl_CTA_InformesContablesLineaAcumulados.calculo_valor.Value);
                    }

                    //operacion
                    g_frm_P_InformeContableAcumulado.Exferia_ComboBox_Operacion.SelectedItem = g_lst_Operaciones_INTERNO_ComboBox_Modelo.Where(m => m.Identificador.Equals(g_mdl_CTA_InformesContablesLineaAcumulados.operacion.ToString())).FirstOrDefault();


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

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

                        }
                    }
                }

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

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_GrabarDatos_VaciarDatos, bool _bol_GrabarDatos_Salir)
        {
            try
            {
                g_bol_GrabarDatos_VaciarDatos = _bol_GrabarDatos_VaciarDatos;
                g_bol_GrabarDatos_Salir = _bol_GrabarDatos_Salir;
                g_bol_GrabarDatos_TerminoCorrectamente = true;

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

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

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

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            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.Message, ex, nameof(P_InformeContableAcumulado_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_INTERNO_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_InformeContableAcumulado.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    g_bol_GrabarDatos_TerminoCorrectamente = false;

                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);

                        //Poner el Foco en el objeto que tuvoel problema en validar
                        if (mdl_ValorDevuelto_Modelo_Resultado.Objeto != null)
                        {
                            Funciones.Poner_Foco_Objeto(g_frm_P_InformeContableAcumulado, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }
                }
                else
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_InformeContableAcumulado.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    g_frm_P_InformeContableAcumulado.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //Actualiazr cabecera si se llamo desde la linea
                    if (g_frm_P_InformeContableCabecera!=null)
                    {
                        g_frm_P_InformeContableCabecera.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }


                    if (g_bol_GrabarDatos_Salir)
                    {
                        g_frm_P_InformeContableAcumulado.Close();
                    }
                    else
                    {
                        //Vaciar los datos para que se pueda meter otro linea
                        if (g_bol_GrabarDatos_VaciarDatos)
                        {
                            VaciarDatos();
                        }

                        Funciones.Poner_Foco_Objeto(g_frm_P_InformeContableAcumulado, g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo);

                        g_frm_P_InformeContableAcumulado.P_Base_SeModificoDatosPantalla = false;
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_InformeContableAcumulado_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
            {
                // la Linea no puede estar Vacio (Obligatorio)
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                    g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length == 0)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Linea validar que es Correcto
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }


                //Si tiene una operacion Auxiliar tiene que tener un valor introducido
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto &&
                    g_frm_P_InformeContableAcumulado.Exferia_ComboBox_CalculoOperacion.SelectedItem != null &&
                    !((INTERNO_ComboBox_Modelo)g_frm_P_InformeContableAcumulado.Exferia_ComboBox_CalculoOperacion.SelectedItem).Identificador.Equals("-1"))
                {
                    if (g_frm_P_InformeContableAcumulado.Exferia_TextBox_CalculoValor.Text.Trim().Length == 0)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_InformeContableAcumulado.Exferia_Label_CalculoValor.Text);
                        mdl_INTERNO_ValorDevuelto_Modelo.Objeto = g_frm_P_InformeContableAcumulado.Exferia_TextBox_CalculoValor;
                    }
                }

            }
            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.Message, ex, nameof(P_InformeContableAcumulado_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 = "";

            //Inicar transacción
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                //Se utiliza la trasaccion para buscar la ultima linea y bloquear la bd para que nadie grabe hasta que yo grabe
                try
                {
                    //Linea Inicial si la tuviera
                    int int_Linea_Inicial = g_mdl_CTA_InformesContablesLineaAcumulados != null ? g_mdl_CTA_InformesContablesLineaAcumulados.linea : -1;

                    CTA_InformesContablesLineaAcumulados mdl_CTA_InformesContablesLineaAcumulados = new CTA_InformesContablesLineaAcumulados();

                    //id
                    mdl_CTA_InformesContablesLineaAcumulados.id = g_mdl_CTA_InformesContablesLineaAcumulados!=null ? g_mdl_CTA_InformesContablesLineaAcumulados.id : -1;

                    //idInformeContableLinea
                    mdl_CTA_InformesContablesLineaAcumulados.idInformeContableLinea = g_lng_idInformeContableLinea;

                    //idInformeContableLinea_Operacion
                    mdl_CTA_InformesContablesLineaAcumulados.idInformeContableLinea_Operacion = g_frm_P_InformeContableAcumulado.Exferia_F3_SoloSeleccion_InformeContableLinea.Exferia_F3_SoloSeleccion_Id;

                    //linea
                    if (g_frm_P_InformeContableAcumulado.Exferia_TextBox_Linea.Text.Trim().Length>0)
                    {
                        mdl_CTA_InformesContablesLineaAcumulados.linea = int.Parse(g_frm_P_InformeContableAcumulado.Exferia_TextBox_Linea.Text);
                    }
                    else
                    {
                        int int_linea = g_obj_CTA_InformesContablesLineaAcumulados_Datos.Obtener_UltimoNumeroLinea(g_lng_idInformeContableLinea);
                        mdl_CTA_InformesContablesLineaAcumulados.linea = int_linea + 1;
                    }

                    //calculo_operacion
                    if (g_frm_P_InformeContableAcumulado.Panel_Valor.Visible)
                    {
                        mdl_CTA_InformesContablesLineaAcumulados.calculo_valor = decimal.Parse(g_frm_P_InformeContableAcumulado.Exferia_TextBox_CalculoValor.Text);
                        mdl_CTA_InformesContablesLineaAcumulados.calculo_operacion = int.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_InformeContableAcumulado.Exferia_ComboBox_CalculoOperacion.SelectedItem).Identificador);
                    }
                    else
                    {
                        mdl_CTA_InformesContablesLineaAcumulados.calculo_valor = null;
                        mdl_CTA_InformesContablesLineaAcumulados.calculo_operacion = null;
                    }

                    //operacion     
                    mdl_CTA_InformesContablesLineaAcumulados.operacion= int.Parse(((INTERNO_ComboBox_Modelo)g_frm_P_InformeContableAcumulado.Exferia_ComboBox_Operacion.SelectedItem).Identificador);

                    //GRABAR
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_CTA_InformesContablesLineaAcumulados_Datos.Grabar(mdl_CTA_InformesContablesLineaAcumulados);

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Si la Linea inicial era mayor que -1 y es diferente a la linea final, actualizo el resto de las lineas para que no se repitan y este bien ordenadas o si ya existe el numero de linea en base de datos
                        if ((int_Linea_Inicial > -1 && int_Linea_Inicial != mdl_CTA_InformesContablesLineaAcumulados.linea) || (g_obj_CTA_InformesContablesLineaAcumulados_Datos.Existe_NumeroLinea(g_lng_idInformeContableLinea, mdl_INTERNO_ValorDevuelto_Modelo.Id, mdl_CTA_InformesContablesLineaAcumulados.linea)))
                        {
                            g_obj_CTA_InformesContablesLineaAcumulados_Datos.Actualizar_Lineas(g_lng_idInformeContableLinea, mdl_INTERNO_ValorDevuelto_Modelo.Id, mdl_CTA_InformesContablesLineaAcumulados.linea);
                        }

                        //Termino Transaccion
                        transaccion_SQL.Complete();
                    }

                    transaccion_SQL.Dispose();

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        g_mdl_CTA_InformesContablesLineaAcumulados = g_obj_CTA_InformesContablesLineaAcumulados_Datos.Obtener(mdl_INTERNO_ValorDevuelto_Modelo.Id);
                    }
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InformeContableAcumulado_Controladora) + "/" + nameof(GrabarDatos_Final));
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

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

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

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

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

                    //Actualiazr cabecera si se llamo desde la linea
                    if (g_frm_P_InformeContableCabecera != null)
                    {
                        g_frm_P_InformeContableCabecera.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

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

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            try
            {
                //Lineas
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_CTA_InformesContablesLineaAcumulados_Datos.Borrar(g_mdl_CTA_InformesContablesLineaAcumulados != null ? g_mdl_CTA_InformesContablesLineaAcumulados.id : -1);
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_InformeContableAcumulado_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
    }
}
