using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_Controles;
using Exferia_ControlGastos._1_Datos;
using Exferia_EntityFramework;
using Exferia_Formularios;
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_ControlGastos._3_Vistas.Controladoras
{
    public class P_Pago_Controladora
    {
        #region Variables Generales
        private P_Pago g_frm_P_Pago = 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 Negocio Necesarias para la carga de datos
        private CTG_Pagos_Datos g_obj_CTG_Pagos_Datos = new CTG_Pagos_Datos();

        //Modelo necesarios
        public CTG_Pagos g_mdl_CTG_Pagos = 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
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;

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

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

        public CTG_Expedientes g_mdl_CTG_Expedientes = null;

        //Datos de de Cerrado y Volcado
        public List<CTA_VolcadoCabecera> g_lst_CTA_VolcadoCabecera = null;

        public string g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

        #endregion

        #region Constructor
        public P_Pago_Controladora(P_Pago _frm_P_Pago)
        {
            g_frm_P_Pago = _frm_P_Pago;

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        public void Datos_PorDefecto()
        {
            try
            {
                Rellenar_Expediente(g_frm_P_Pago.Exferia_Label_SinColor_Expediente, g_mdl_CTG_Expedientes);

                //ponemos la fecha de trabajo en la fecha
                g_frm_P_Pago.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Fecha = Variables.G_DTT_FECHA_INICIAL_PORDEFECTO.ToString("dd/MM/yyyy");

                //CTA_PredefinidosCabeceras_Pago
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAPREDEFINIDOCABECERA_OBTENERMODELO_POR_DEFECTO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { Variables.G_PREDEFINIDOFICHEROS_PAGOS.Id };

                //Pasamos los parametros al metodo y lo ejecutamos
                CTA_PredefinidosCabeceras mdl_CTA_PredefinidosCabeceras_Pago = (CTA_PredefinidosCabeceras)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                //##################################################################################################################################################################################################

                if (mdl_CTA_PredefinidosCabeceras_Pago != null &&
                    mdl_CTA_PredefinidosCabeceras_Pago.idPredefinidoFichero != null &&
                    mdl_CTA_PredefinidosCabeceras_Pago.idPredefinidoFichero.Value.Equals(Variables.G_PREDEFINIDOFICHEROS_PAGOS.Id))
                {
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Id = mdl_CTA_PredefinidosCabeceras_Pago.id;
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Codigo = mdl_CTA_PredefinidosCabeceras_Pago.codigo;
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Descripcion = mdl_CTA_PredefinidosCabeceras_Pago.descripcion;
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_FechaBorrado = mdl_CTA_PredefinidosCabeceras_Pago.fechaBorrado;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pago_Controladora) + "/" + nameof(Datos_PorDefecto));
            }
            finally
            {
                g_frm_P_Pago.P_Base_SeModificoDatosPantalla = false;
            }
        }
        #endregion

        #region Vaciar Datos
        public void VaciarDatos()
        {
            //modelo
            g_mdl_CTG_Pagos = null;
            g_lst_CTA_VolcadoCabecera = null;

            //Expediente
            g_frm_P_Pago.Exferia_Label_SinColor_Expediente.Text = "-";

            //estado
            g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

            //importe
            g_frm_P_Pago.Exferia_TextBox_Importe.Text = "";

            //fecha
            g_frm_P_Pago.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Fecha = "";

            //gastoLinea
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_FechaBorrado = null;

            //tipoPago
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_FechaBorrado = null;

            //predefinidoCabecera_Pago
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_FechaBorrado = null;

            //empleado_Propuesto
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_FechaBorrado = null;

            //empleado_Autorizado
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_FechaBorrado = null;

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

            g_frm_P_Pago.P_Base_SeModificoDatosPantalla = false;
        }
        #endregion

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

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

                return g_bol_GrabarDatos_TerminoCorrectamente;
            }
            return true;
        }
        #endregion

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

                //Vaciar
                VaciarDatos();

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_Pago.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_Pago_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_Pago.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_Pago_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_Pago_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_Pago.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_Pago.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Pago_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Pago.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Foco_Codigo();

                Mostrar_CerradoVolcado();
            }
        }

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

            try
            {
                g_mdl_CTG_Pagos = g_obj_CTG_Pagos_Datos.Obtener(_lng_id);

                if (g_mdl_CTG_Pagos != null)
                {

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

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

                    //Experiente
                    Rellenar_Expediente(g_frm_P_Pago.Exferia_Label_SinColor_Expediente, g_mdl_CTG_Pagos.CTG_Expedientes);

                    //fecha
                    g_frm_P_Pago.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Fecha = g_mdl_CTG_Pagos.fecha.ToString("dd/MM/yyyy");

                    //estado
                    g_str_Estado = g_mdl_CTG_Pagos.estado;

                    //importe
                    g_frm_P_Pago.Exferia_TextBox_Importe.Text = g_mdl_CTG_Pagos.importe.ToString();

                    //observaciones
                    g_frm_P_Pago.Exferia_RichTextBox_ConBotones_Observaciones.Exferia_RichTextBox_RTF = g_mdl_CTG_Pagos.observaciones != null ? g_mdl_CTG_Pagos.observaciones : "";

                    //gastoLinea
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Id = g_mdl_CTG_Pagos.CTG_GastosLineas.id;
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Codigo = g_mdl_CTG_Pagos.CTG_GastosLineas.codigo;
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_CTG_Pagos.CTG_GastosLineas.descripcion;
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_CTG_Pagos.CTG_GastosLineas.fechaBorrado;

                    //tipóPago
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Id = g_mdl_CTG_Pagos.MAE_TiposPagos.id;
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Codigo = g_mdl_CTG_Pagos.MAE_TiposPagos.codigo;
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_CTG_Pagos.MAE_TiposPagos.descripcion;
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_CTG_Pagos.MAE_TiposPagos.fechaBorrado;

                    //PredefinidoCabecera_Pago
                    if (g_mdl_CTG_Pagos.CTA_PredefinidosCabeceras != null)
                    {
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Id = g_mdl_CTG_Pagos.CTA_PredefinidosCabeceras.id;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Codigo = g_mdl_CTG_Pagos.CTA_PredefinidosCabeceras.codigo;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_CTG_Pagos.CTA_PredefinidosCabeceras.descripcion;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_CTG_Pagos.CTA_PredefinidosCabeceras.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Id = -1;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Codigo = string.Empty;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Descripcion = string.Empty;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_FechaBorrado = null;
                    }

                    //empleado_propuesto
                    if (g_mdl_CTG_Pagos.MAE_Empleados != null)
                    {
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Id = g_mdl_CTG_Pagos.MAE_Empleados.id;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Codigo = g_mdl_CTG_Pagos.MAE_Empleados.codigo;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_CTG_Pagos.MAE_Empleados.nombre;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_CTG_Pagos.MAE_Empleados.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Id = -1;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Codigo = string.Empty;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Descripcion = string.Empty;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_FechaBorrado = null;
                    }

                    //empleado_autorizado
                    if (g_mdl_CTG_Pagos.MAE_Empleados1 != null)
                    {
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Id = g_mdl_CTG_Pagos.MAE_Empleados1.id;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Codigo = g_mdl_CTG_Pagos.MAE_Empleados1.codigo;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_CTG_Pagos.MAE_Empleados1.nombre;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_CTG_Pagos.MAE_Empleados1.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Id = -1;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Codigo = string.Empty;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Descripcion = string.Empty;
                        g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_FechaBorrado = null;
                    }

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

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

                            // fecha
                            if (str_campo.Equals(nameof(g_mdl_CTG_Pagos.fecha)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_CTG_Pagos.fecha.ToString("dd/MM/yyyy");
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Pago.P_Base_TituloPantalla += " [" + str_ValorAMostrarFinal + "] -Modificar";
                        }
                    }

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

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_GrabarDatos_VaciarDatos)
        {
            try
            {
                g_bol_GrabarDatos_VaciarDatos = _bol_GrabarDatos_VaciarDatos;

                g_bol_GrabarDatos_TerminoCorrectamente = true;

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Pago_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_Pago_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_Pago_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_Pago.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_Pago, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    //Devolder al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);

                    g_frm_P_Pago.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    //Vaciar los datos para que se pueda meter otro linea
                    if (g_bol_GrabarDatos_VaciarDatos)
                    {
                        VaciarDatos();
                    }

                    //Poner el Foco Inicial
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Foco_Codigo();
                    g_frm_P_Pago.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pago_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
            {
                //el importe no puede estar vacío
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_Pago.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_Pago.Exferia_Label_Importe.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.Exferia_TextBox_Importe;
                }

                // el GastoLinea no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                     g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.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_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay GastoLinea validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // el TipoPago no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.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_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay TipoPago validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // 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_Pago.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_Pago.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.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_Pago.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.Exferia_FechaSeleccion_fecha;
                    }
                }

                // Si hay PredefinicoCabecera_Pago validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Empleado_Propuesto validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Empleado_Autorizado validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }
            }
            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_Pago_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();

            try
            {
                CTG_Pagos mdl_CTG_Pagos = new CTG_Pagos();
                mdl_CTG_Pagos.id = g_mdl_CTG_Pagos != null ? g_mdl_CTG_Pagos.id : -1;

                //fecha
                mdl_CTG_Pagos.fecha = DateTime.ParseExact(g_frm_P_Pago.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Fecha, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                //importe
                mdl_CTG_Pagos.importe = g_frm_P_Pago.Exferia_TextBox_Importe.Text.Trim().Length > 0 ? Convert.ToDecimal(g_frm_P_Pago.Exferia_TextBox_Importe.Text.Trim()) : 0;

                //gastoLinea
                mdl_CTG_Pagos.idGastoLinea = g_frm_P_Pago.Exferia_F3_SoloSeleccion_GastoLinea.Exferia_F3_SoloSeleccion_Id;

                //tipoPago
                mdl_CTG_Pagos.idTipoPago = g_frm_P_Pago.Exferia_F3_SoloSeleccion_TipoPago.Exferia_F3_SoloSeleccion_Id;

                //PredefinidoCabecera_Pago
                if (g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Id != -1)
                {
                    mdl_CTG_Pagos.idPredefinidoCabecera_Pago = g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Id;
                }
                else
                {
                    mdl_CTG_Pagos.idPredefinidoCabecera_Pago = null;
                }

                //empleado_propuesto
                if (g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Id != -1)
                {
                    mdl_CTG_Pagos.idEmpleado_Propuesto = g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Propuesto.Exferia_F3_SoloSeleccion_Id;
                }
                else
                {
                    mdl_CTG_Pagos.idEmpleado_Propuesto = null;
                }

                //empleado_autorizado
                if (g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Id != -1)
                {
                    mdl_CTG_Pagos.idEmpleado_Autorizado = g_frm_P_Pago.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Id;
                }
                else
                {
                    mdl_CTG_Pagos.idEmpleado_Autorizado = null;
                }

                //observaciones
                mdl_CTG_Pagos.observaciones = g_frm_P_Pago.Exferia_RichTextBox_ConBotones_Observaciones.Exferia_RichTextBox_RTF;

                //estado
                mdl_CTG_Pagos.estado = g_str_Estado;

                //El id Del expediente viene ya directo de la pantalla que lo llama
                //idExpediente
                mdl_CTG_Pagos.idExpediente = g_mdl_CTG_Expedientes.id;

                // Se graba el modelo ya relleno
                mdl_ValorDevuelto_Modelo = g_obj_CTG_Pagos_Datos.Grabar(mdl_CTG_Pagos);

                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    long lng_idPago = mdl_ValorDevuelto_Modelo.Id;

                    //Obtener el modelo que se acaba de grabar
                    g_mdl_CTG_Pagos = g_obj_CTG_Pagos_Datos.Obtener(lng_idPago);

                    g_frm_P_Pago.P_Base_id = lng_idPago;

                    //se desbloquea el boton de borrar
                    g_frm_P_Pago.Exferia_Button_Borrar.Enabled = true;
                }

            }
            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_Pago_Controladora) + "/" + nameof(GrabarDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            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_Pago.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_Pago.Enabled = true;

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Pago_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_Pago_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_Pago_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_Pago.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
                {
                    if (g_frm_P_Pago.P_Base_PantallaOrigen != null)
                    {
                        List<object> lst_obj = new List<object>();
                        mdl_ValorDevuelto_Modelo_Resultado.Listado_Id = new List<long>();
                        mdl_ValorDevuelto_Modelo_Resultado.Listado_Id.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                        lst_obj.Add(g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion);
                        lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                        g_frm_P_Pago.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    g_frm_P_Pago.Close();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pago_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_CTG_Pagos_Datos.Borrar(g_mdl_CTG_Pagos != null ? g_mdl_CTG_Pagos.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_Pago_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

        public void Rellenar_Expediente(Exferia_Label_SinColor _obj_Exferia_Label_SinColor, CTG_Expedientes _mdl_CTG_Expedientes)
        {
            if (_mdl_CTG_Expedientes != null)
            {
                _obj_Exferia_Label_SinColor.Text = "Expediente Nº:" + _mdl_CTG_Expedientes.numero + " (" + _mdl_CTG_Expedientes.descripcion + ")";
            }
        }

        #region Cerra/Abrir/Volcar/Desvolcar

        public void Mostrar_CerradoVolcado()
        {
            try
            {
                //Por Defecto
                g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;
                if (g_lst_CTA_VolcadoCabecera != null) { g_lst_CTA_VolcadoCabecera.Clear(); }

                //CERRADO O ABIERTO ##############################################################################################################
                //Buscar si esta Cerrado
                if (g_mdl_CTG_Pagos != null)
                {
                    List<long> lst_idPredefinidoFichero = new List<long>();
                    lst_idPredefinidoFichero.Add(Variables.G_PREDEFINIDOFICHEROS_PAGOS_CTG.Id);


                    //Cargamos el ensamblado #########################################################################################################################################################################
                    Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                    //creamos la instancia
                    var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAVOLCADOCABECERA_OBTENERMODELOLISTADO_POR_DOCUMENTOPREDEFINIDOFICHERO, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros_1 = { g_mdl_CTG_Pagos.id, lst_idPredefinidoFichero };

                    //Pasamos los parametros al metodo y lo ejecutamos
                    g_lst_CTA_VolcadoCabecera = (List<CTA_VolcadoCabecera>)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                    //##################################################################################################################################################################################################
                }

                //Buscar el Estado 
                if (g_mdl_CTG_Pagos != null)
                {
                    g_str_Estado = g_obj_CTG_Pagos_Datos.Obtener_Estado(g_mdl_CTG_Pagos.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 Desvolcar
                        g_frm_P_Pago.Exferia_Button_Volcado.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_VOLCAR;
                        Imagenes.Asignar_Imagen(g_frm_P_Pago.Exferia_Button_Volcado);
                        g_frm_P_Pago.Exferia_Button_Volcado.Tag = "0";

                        //Cambiar Imagen del Boton de Cerrar
                        g_frm_P_Pago.Exferia_Button_CerrarAbrir.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_CERRADO;
                        Imagenes.Asignar_Imagen(g_frm_P_Pago.Exferia_Button_CerrarAbrir);
                        g_frm_P_Pago.Exferia_Button_CerrarAbrir.Tag = "1";

                        //Bloqueo los Controles
                        SoloLectura.Empezar(g_frm_P_Pago, true);
                    }
                    //Si esta Volcado 
                    else if (g_str_Estado.Equals(Variables.G_STR_ESTADO_CONTABILIDAD_VOLCADO))
                    {
                        //Cambiar Imagen del Boton de Cerrar
                        g_frm_P_Pago.Exferia_Button_CerrarAbrir.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_CERRADO;
                        Imagenes.Asignar_Imagen(g_frm_P_Pago.Exferia_Button_CerrarAbrir);
                        g_frm_P_Pago.Exferia_Button_CerrarAbrir.Tag = "1";

                        //Cambiar Imagen del Boton de Volcar
                        g_frm_P_Pago.Exferia_Button_Volcado.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_DESVOLCAR;
                        Imagenes.Asignar_Imagen(g_frm_P_Pago.Exferia_Button_Volcado);
                        g_frm_P_Pago.Exferia_Button_Volcado.Tag = "1";

                        //Bloqueo los Controles
                        SoloLectura.Empezar(g_frm_P_Pago, true);
                    }
                    //Abierto
                    else
                    {
                        //Cambiar Imagen del Boton de Abrir
                        g_frm_P_Pago.Exferia_Button_CerrarAbrir.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_ABIERTO;
                        Imagenes.Asignar_Imagen(g_frm_P_Pago.Exferia_Button_CerrarAbrir);
                        g_frm_P_Pago.Exferia_Button_CerrarAbrir.Tag = "0";

                        //Cambiar Imagen del Boton de Desvolcar
                        g_frm_P_Pago.Exferia_Button_Volcado.Exferia_Button_Imagen = Imagenes.G_ENUM_IMAGENES.G_IMG_VOLCAR;
                        Imagenes.Asignar_Imagen(g_frm_P_Pago.Exferia_Button_Volcado);
                        g_frm_P_Pago.Exferia_Button_Volcado.Tag = "0";

                        //Desbloqueo los Controles
                        SoloLectura.Empezar(g_frm_P_Pago, false);
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Pago_Controladora) + "/" + nameof(Mostrar_CerradoVolcado));
            }
        }

        #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_Pago_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
                {
                    //Insertar el idPredefinidoCabecera
                    List<long> lst_idPredefinidoCabecera = new List<long>();
                    //Validar que tiene un idPredefinidoCabcera 
                    if (g_mdl_CTG_Pagos.idPredefinidoCabecera_Pago != null && g_mdl_CTG_Pagos.idPredefinidoCabecera_Pago.Value > 0)
                    {
                        lst_idPredefinidoCabecera.Add(g_mdl_CTG_Pagos.idPredefinidoCabecera_Pago.Value);
                    }
                    else
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Titulo);
                    }


                    //Si esta Todo Correcto
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Cargamos el ensamblado #########################################################################################################################################################################
                        Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                        //Obtenemos el tipo de la clase
                        Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                        //creamos la instancia
                        var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                        //Cargamos el metodo solicitado
                        MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_ACCIONDOCUMENTO_CERRAR, BindingFlags.Instance | BindingFlags.NonPublic);

                        //Obtener valores
                        object[] arr_Parametros_1 = {   lst_idPredefinidoCabecera,
                                                        g_mdl_CTG_Pagos.id,
                                                        g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion,
                                                        null};

                        //Pasamos los parametros al metodo y lo ejecutamos
                        mdl_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                        //########################################################################################################################################################################


                        if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            transaccion_SQL.Complete();
                        }
                    }

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Pago_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_Pago_Controladora) + "/" + nameof(TareaAsincrona_Cerrar_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_Cerrar_Documento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }

            //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_CerradoVolcado();

                //Actualizar registro en Listado principal
                if (g_frm_P_Pago.P_Base_PantallaOrigen != null)
                {
                    //Devolder al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(g_mdl_CTG_Pagos.id);

                    g_frm_P_Pago.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_MODIFICAR);
                }
            }
            //Ocurrio un Error
            else
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_CERRAR_TERMINO.Mensaje);
            }
        }
        #endregion

        #region Abrir Documento
        public void Abrir_Documento()
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_ABRIENNDO_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_Pago_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
                {
                    //Insertar el idPredefinidoCabecera
                    List<long> lst_idPredefinidoFicheros_VolcadoCabecera = new List<long>();
                    if (g_lst_CTA_VolcadoCabecera != null)
                    {
                        lst_idPredefinidoFicheros_VolcadoCabecera.AddRange(g_lst_CTA_VolcadoCabecera.Select(m => m.idPredefinidoFichero).ToList());
                    }

                    long lng_idVolcadoCabecera_APasarDiario = -1;
                    if (g_lst_CTA_VolcadoCabecera != null && g_lst_CTA_VolcadoCabecera.Count > 0)
                    {
                        lng_idVolcadoCabecera_APasarDiario = g_lst_CTA_VolcadoCabecera.FirstOrDefault().id;
                    }

                    //Cargamos el ensamblado #########################################################################################################################################################################
                    Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                    //creamos la instancia
                    var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_ACCIONDOCUMENTO_ABRIR, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros_1 = {   g_mdl_CTG_Pagos.id,
                                                    lst_idPredefinidoFicheros_VolcadoCabecera,
                                                    lng_idVolcadoCabecera_APasarDiario,
                                                    g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion,
                                                    null,
                                                    Variables.G_PREDEFINIDOFICHEROS_PAGOS_CTG.Id};

                    //Pasamos los parametros al metodo y lo ejecutamos
                    mdl_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                    //########################################################################################################################################################################

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        transaccion_SQL.Complete();
                    }

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

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

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

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

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

                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_ERROR_ABRIR_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;
            }

            //Termino 
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_ABRIR_TERMINO = (INTERNO_ValorDevuelto_Modelo)e.Result;

            //Termino todo Correctamente
            if (mdl_INTERNO_ValorDevuelto_Modelo_ABRIR_TERMINO.TodoCorrecto)
            {
                Mostrar_CerradoVolcado();

                //Actualizar registro en Listado principal
                if (g_frm_P_Pago.P_Base_PantallaOrigen != null)
                {
                    //Devolder al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(g_mdl_CTG_Pagos.id);

                    g_frm_P_Pago.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_MODIFICAR);
                }
            }
            //Ocurrio un Error
            else
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_ABRIR_TERMINO.Mensaje);
            }
        }

        #endregion

        #region Volcar datos del Diario
        public void Volcar_Documento()
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_VOLCANDO_DOCUMENTO());

                BackgroundWorker obj_TareaAsincrona_Volcar_Documento = new BackgroundWorker();

                obj_TareaAsincrona_Volcar_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_Volcar_Documento_DoWork);
                obj_TareaAsincrona_Volcar_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Volcar_Documento_Completed);
                obj_TareaAsincrona_Volcar_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_Pago_Controladora) + "/" + nameof(Volcar_Documento));
            }
        }

        private void TareaAsincrona_Volcar_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
                {
                    //Insertar el idPredefinidoCabecera
                    List<long> lst_idPredefinidoCabecera = new List<long>();

                    //Validar que tiene un idPredefinidoCabcera 
                    if (g_mdl_CTG_Pagos.idPredefinidoCabecera_Pago != null && g_mdl_CTG_Pagos.idPredefinidoCabecera_Pago.Value > 0)
                    {
                        lst_idPredefinidoCabecera.Add(g_mdl_CTG_Pagos.idPredefinidoCabecera_Pago.Value);
                    }
                    else
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Pago.Exferia_F3_SoloSeleccion_PredefinidoCabecera_Pago.Exferia_F3_SoloSeleccion_Titulo);
                    }

                    //Saber si ya estaba Cerrado
                    bool bol_CerrarPrimero = true;
                    long lng_idVolcadoCabecera_APasarDiario = -1;//Registro que hay que pasar al Diario
                    if (g_lst_CTA_VolcadoCabecera != null && g_lst_CTA_VolcadoCabecera.Count > 0)
                    {
                        bol_CerrarPrimero = false;
                        lng_idVolcadoCabecera_APasarDiario = g_lst_CTA_VolcadoCabecera.FirstOrDefault().id;
                    }

                    //Cargamos el ensamblado #########################################################################################################################################################################
                    Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                    //creamos la instancia
                    var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_ACCIONDOCUMENTO_VOLCAR, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros_1 = {   lng_idVolcadoCabecera_APasarDiario,
                                                    g_frm_P_Pago.P_Base_ValoresGenerales.lng_idEmpresa,
                                                    g_frm_P_Pago.P_Base_ValoresGenerales.EjercicioActivo.id,
                                                    g_mdl_CTG_Pagos.fecha,
                                                    g_frm_P_Pago.P_Base_ValoresGenerales.Ejercicios_Listado.ToList(),
                                                    Variables.G_PREDEFINIDOFICHEROS_PAGOS_CTG.Id,
                                                    bol_CerrarPrimero,
                                                    lst_idPredefinidoCabecera,
                                                    g_mdl_CTG_Pagos.id,
                                                    g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion,
                                                    null};

                    //Pasamos los parametros al metodo y lo ejecutamos
                    mdl_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                    //########################################################################################################################################################################

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Generar en ContaPlus si estuviera marcado
                        if (Variables.G_MDL_INTERNO_VALORESGENERALES_MODELO.Control != null &&
                            Variables.G_MDL_INTERNO_VALORESGENERALES_MODELO.Control.idVolcadoExportacion != null &&
                            Variables.G_MDL_INTERNO_VALORESGENERALES_MODELO.Control.idVolcadoExportacion.Equals(Variables.G_LNG_VOLCADOEXPORTACION_CONTAPLUS))
                        {
                            //idVolcadoCabecera, se coje de aquie porque si el documento no estaba cerrado, el idVolcadoCabecera se generar dentro
                            List<long> lst_idVolcadosCabecera = new List<long>();
                            if (mdl_ValorDevuelto_Modelo.Objeto_Auxiliar_3 != null &&
                                mdl_ValorDevuelto_Modelo.Objeto_Auxiliar_3.ToString().Trim().Length > 0)
                            {
                                lst_idVolcadosCabecera.Add(long.Parse(mdl_ValorDevuelto_Modelo.Objeto_Auxiliar_3.ToString()));
                            }

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

                            //Obtener valores
                            object[] arr_Parametros_2 = { lst_idVolcadosCabecera };

                            //Pasamos los parametros al metodo y lo ejecutamos
                            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo_Exportar = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_2.Invoke(obj_Clase_2, arr_Parametros_2);
                            //########################################################################################################################################################################

                            if (mdl_ValorDevuelto_Modelo_Exportar.TodoCorrecto)
                            {
                                transaccion_SQL.Complete();
                            }
                            else
                            {
                                mdl_ValorDevuelto_Modelo = mdl_ValorDevuelto_Modelo_Exportar;
                            }
                        }
                        else
                        {
                            transaccion_SQL.Complete();
                        }
                    }

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Pago_Controladora) + "/" + nameof(TareaAsincrona_Volcar_Documento_DoWork));

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

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Pago_Controladora) + "/" + nameof(TareaAsincrona_Volcar_Documento_DoWork));

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

            //Termino 
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_VOLCARVOLCAR_TERMINO = (INTERNO_ValorDevuelto_Modelo)e.Result;

            //Termino todo Correctamente
            if (mdl_INTERNO_ValorDevuelto_Modelo_VOLCARVOLCAR_TERMINO.TodoCorrecto)
            {
                Mostrar_CerradoVolcado();

                //Actualizar registro en Listado principal
                if (g_frm_P_Pago.P_Base_PantallaOrigen != null)
                {
                    //Devolder al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(g_mdl_CTG_Pagos.id);

                    g_frm_P_Pago.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_MODIFICAR);
                }
            }
            //Ocurrio un Error
            else
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_VOLCARVOLCAR_TERMINO.Mensaje);
            }
        }
        #endregion

        #region Desvolcar datos del Diario
        public void Desvolcar_Documento()
        {
            try
            {
                g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_DESVOLCANDO_DOCUMENTO());

                BackgroundWorker obj_TareaAsincrona_Desvolcar_Documento = new BackgroundWorker();

                obj_TareaAsincrona_Desvolcar_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_Desvolcar_Documento_DoWork);
                obj_TareaAsincrona_Desvolcar_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Desvolcar_Documento_Completed);
                obj_TareaAsincrona_Desvolcar_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_Pago_Controladora) + "/" + nameof(Desvolcar_Documento));
            }
        }

        private void TareaAsincrona_Desvolcar_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
                {
                    long lng_idVolcadoCabecera_ABorrar = -1;
                    DateTime? dtt_Fecha = null;
                    if (g_lst_CTA_VolcadoCabecera != null && g_lst_CTA_VolcadoCabecera.Count > 0)
                    {
                        CTA_VolcadoCabecera mdl_CTA_VolcadoCabecera = g_lst_CTA_VolcadoCabecera.FirstOrDefault();
                        lng_idVolcadoCabecera_ABorrar = mdl_CTA_VolcadoCabecera.id;
                        dtt_Fecha = mdl_CTA_VolcadoCabecera.fecha;
                    }

                    //Cargamos el ensamblado #########################################################################################################################################################################
                    Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                    //creamos la instancia
                    var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD_PROCEDIMIENTO_ACCIONDOCUMENTO_DESVOLCAR, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros_1 = {   lng_idVolcadoCabecera_ABorrar,
                                                    dtt_Fecha.Value,
                                                    g_frm_P_Pago.P_Base_ValoresGenerales.Ejercicios_Listado.ToList(),
                                                    Variables.G_PREDEFINIDOFICHEROS_PAGOS_CTG.Id,
                                                    null,
                                                    g_mdl_CTG_Pagos.id,
                                                    g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion,
                                                    null};

                    //Pasamos los parametros al metodo y lo ejecutamos
                    mdl_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                    //########################################################################################################################################################################

                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        transaccion_SQL.Complete();
                    }

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Pago_Controladora) + "/" + nameof(TareaAsincrona_Desvolcar_Documento_DoWork));

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

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Pago_Controladora) + "/" + nameof(TareaAsincrona_Desvolcar_Documento_DoWork));

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

            //Termino 
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_VOLCARDESVOLCAR_TERMINO = (INTERNO_ValorDevuelto_Modelo)e.Result;

            //Termino todo Correctamente
            if (mdl_INTERNO_ValorDevuelto_Modelo_VOLCARDESVOLCAR_TERMINO.TodoCorrecto)
            {
                Mostrar_CerradoVolcado();

                //Actualizar registro en Listado principal
                if (g_frm_P_Pago.P_Base_PantallaOrigen != null)
                {
                    //Devolder al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_Pago.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(g_mdl_CTG_Pagos.id);

                    g_frm_P_Pago.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, G_ENUM_TIPOACCION.INT_MODIFICAR);
                }
            }
            //Ocurrio un Error
            else
            {
                Mensajes.MostrarMensaje(mdl_INTERNO_ValorDevuelto_Modelo_VOLCARDESVOLCAR_TERMINO.Mensaje);
            }
        }
        #endregion


        #endregion

    }
}
