using Exferia_Aplicacion.General;
using Exferia_Compras._0_Modelos;
using Exferia_Compras._1_Datos;
using Exferia_Compras.General;
using Exferia_EntityFramework;
using Exferia_Formularios;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;

namespace Exferia_Compras._3_Vistas.Controladoras
{
    public class P_RemesaAcumulado_Controladora
    {

        #region Variables Generales
        private P_RemesaAcumulado g_frm_P_RemesaAcumulado = 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 COM_RemesasAcumulados_Datos g_obj_COM_RemesasAcumulados_Datos = new COM_RemesasAcumulados_Datos();
        private COM_RemesasLinea_Datos g_obj_COM_RemesasLinea_Datos = new COM_RemesasLinea_Datos();

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

        public COM_RemesasAcumulados g_mdl_COM_RemesasAcumulados = null;
        
        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;
        public bool g_bol_CargarDatos_Termino = true;

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

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

        public INTERNO_COM_RemesasCabecera_Modelo g_mdl_INTERNO_COM_RemesasCabecera_Modelo = null;

        public MAE_CuentasBancariasSEPA_Pagos g_mdl_MAE_CuentasBancariasSEPA_Pagos = null;

        #endregion

        //Constructor de la clase Logica
        public P_RemesaAcumulado_Controladora(P_RemesaAcumulado _frm_P_RemesaAcumulado)
        {
            g_frm_P_RemesaAcumulado = _frm_P_RemesaAcumulado;
        }

        #region Vaciar Datos
        public void Vaciar_Datos()
        {
            g_mdl_COM_RemesasAcumulados = null;
               
            //Proveedor
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_Proveedor.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_Proveedor.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_Proveedor.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_Proveedor.Exferia_F3_SoloSeleccion_FechaBorrado = null;

            //CuentaBancaria
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id = -1;
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Codigo = "";
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Descripcion = "";
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_FechaBorrado = null;
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_OPCION = "";
            g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_ID = -1;

            //concepto
            g_frm_P_RemesaAcumulado.Exferia_TextBox_Concepto.Text = "";

            string[] str_Separador = new string[] { " [" };
            //Si ya hay valores de objeto, los elimino para rellenarlos de nuevo
            if (g_frm_P_RemesaAcumulado.P_Base_TituloPantalla.Split(str_Separador, StringSplitOptions.None).Count() > 1)
            {
                g_frm_P_RemesaAcumulado.P_Base_TituloPantalla = (g_frm_P_RemesaAcumulado.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_RemesaAcumulado.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_RemesaAcumulado.P_Base_SeModificoDatosPantalla)
            {
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_GUARDARCAMBIOS()))
                {
                    GrabarDatos();

                    if (g_obj_TareaAsincrona_GrabarDatos != null)
                    {
                        //Te quedas espernado a que termine la tarea asincrona de grabar
                        while (g_obj_TareaAsincrona_GrabarDatos.IsBusy)
                            Application.DoEvents();
                    }

                    return g_bol_GrabarDatos_TerminoCorrectamente;
                }
            }
            return true;
        }
        public bool ComprobarCambios_SinPreguntar()
        {
            GrabarDatos();

            //Te quedas espernado a que termine la tarea asincrona de grabar
            if (g_obj_TareaAsincrona_GrabarDatos != null)
            {
                while (g_obj_TareaAsincrona_GrabarDatos.IsBusy)
                    Application.DoEvents();
            }

            return g_bol_GrabarDatos_TerminoCorrectamente;
        }
        #endregion

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

                g_bol_CargarDatos_Termino = false;

                //Vaciar
                Vaciar_Datos();

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_RemesaAcumulado.Enabled = true;
                g_bol_CargarDatos_Termino = 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_RemesaAcumulado_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_RemesaAcumulado.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_RemesaAcumulado_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_RemesaAcumulado_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_RemesaAcumulado.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_RemesaAcumulado.Salir_P_Base();
                }
                else
                {
                    //SEPA/No SEPA
                    if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_TransferenciaSEPA.Checked ||
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_TransferenciaNoSEPA.Checked)
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_EmisionCheque.Enabled = false;

                        g_frm_P_RemesaAcumulado.Panel_Transferencias.Enabled = true;
                        g_frm_P_RemesaAcumulado.Panel_Cheque.Enabled = false;
                    }
                    //Chequebancario
                    else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_EmisionChequeBancario.Checked)
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_EmisionCheque.Enabled = false;

                        g_frm_P_RemesaAcumulado.Panel_Cheque.Enabled = true;
                        g_frm_P_RemesaAcumulado.Panel_Transferencias.Enabled = false;
                    }
                    //Cheque
                    else
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_TransferenciaSEPA.Enabled = false;
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_TransferenciaNoSEPA.Enabled = false;
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_EmisionChequeBancario.Enabled = false;

                        g_frm_P_RemesaAcumulado.Panel_Cheque.Enabled = false;
                        g_frm_P_RemesaAcumulado.Panel_Transferencias.Enabled = false;
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_RemesaAcumulado_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_RemesaAcumulado.Salir_P_Base();
            }
            finally
            {
                g_bol_CargarDatos_Termino = true;
            }
        }

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

            try
            {
                g_mdl_COM_RemesasAcumulados = g_obj_COM_RemesasAcumulados_Datos.Obtener(_lng_id);

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

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

                    //Proveedor
                    g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_Proveedor.Exferia_F3_SoloSeleccion_Id = g_mdl_COM_RemesasAcumulados.MAE_Proveedores.id;
                    g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_Proveedor.Exferia_F3_SoloSeleccion_Codigo = g_mdl_COM_RemesasAcumulados.MAE_Proveedores.codigo;
                    g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_Proveedor.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_COM_RemesasAcumulados.MAE_Proveedores.razonSocial;
                    g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_Proveedor.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_COM_RemesasAcumulados.MAE_Proveedores.fechaBorrado;
                    
                    //CuentaBancaria
                    if (g_mdl_COM_RemesasAcumulados.MAE_CuentasBancariasSEPA_Pagos != null)
                    {
                        g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id = g_mdl_COM_RemesasAcumulados.MAE_CuentasBancariasSEPA_Pagos.id;
                        g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Codigo = g_mdl_COM_RemesasAcumulados.MAE_CuentasBancariasSEPA_Pagos.iban;
                        g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_COM_RemesasAcumulados.MAE_CuentasBancariasSEPA_Pagos.descripcion;
                        g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_COM_RemesasAcumulados.MAE_CuentasBancariasSEPA_Pagos.fechaBorrado;
                    }

                    //concepto
                    g_frm_P_RemesaAcumulado.Exferia_TextBox_Concepto.Text = g_mdl_COM_RemesasAcumulados.concepto;

                    //importe
                    g_frm_P_RemesaAcumulado.Exferia_TextBox_TotalAPagar.Text = string.Format("{0:0.00}", g_mdl_COM_RemesasAcumulados.importe);

                    #region tipoPago
                    //EmisionChequeBancario
                    if (g_mdl_COM_RemesasAcumulados.tipoPago == int.Parse(Variables_Compras.G_MDL_TIPOPAGO_EMISIONCHEQUEBANCARIO.Codigo))
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_EmisionChequeBancario.Checked = true;
                    }
                    //EmisionCheque
                    else if (g_mdl_COM_RemesasAcumulados.tipoPago == int.Parse(Variables_Compras.G_MDL_TIPOPAGO_EMISIONCHEQUE.Codigo))
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_EmisionCheque.Checked = true;
                    }
                    //Transferencia No SEPA
                    else if (g_mdl_COM_RemesasAcumulados.tipoPago == int.Parse(Variables_Compras.G_MDL_TIPOPAGO_TRANSFERENCIA_NOSEPA.Codigo))
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_TransferenciaNoSEPA.Checked = true;
                    }
                    //Transferencia SEPA
                    else
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_TransferenciaSEPA.Checked = true;
                    }
                    #endregion

                    #region prioridad
                    if (g_mdl_COM_RemesasAcumulados.prioridad!=null)
                    { 
                        //Alta
                        if (g_mdl_COM_RemesasAcumulados.prioridad == int.Parse(Variables_Compras.G_MDL_PRIORIDAD_ALTA.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Prioridad_Alta.Checked = true;
                        }
                        //Normal
                        else
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Prioridad_Normal.Checked = true;
                        }
                    }
                    //Normal
                    else
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_Prioridad_Normal.Checked = true;
                    }
                    #endregion

                    #region gastos
                    if (g_mdl_COM_RemesasAcumulados.gastos!=null)
                    {
                        //Por cuenta del Beneficiario
                        if (g_mdl_COM_RemesasAcumulados.gastos == int.Parse(Variables_Compras.G_MDL_GASTOS_CUENTABENEFICIARIO.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Gastos_PorCuentaBeneficiario.Checked = true;
                        }
                        //Por cuenta del Ordenante
                        else if (g_mdl_COM_RemesasAcumulados.gastos == int.Parse(Variables_Compras.G_MDL_GASTOS_CUENTAORDENANTE.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Gastos_PorCuentaOrdenante.Checked = true;
                        }
                        //Gastos compartidos
                        else if (g_mdl_COM_RemesasAcumulados.gastos == int.Parse(Variables_Compras.G_MDL_GASTOS_GASTOSCOMPARTIDOS.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Gastos_GastosCompartidos.Checked = true;
                        }
                        //Nivel de servicio acordado
                        else
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Gastos_NivelServicioAcordado.Checked = true;
                        }
                    }
                    //Nivel de servicio acordado
                    else
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_Gastos_NivelServicioAcordado.Checked = true;
                    }
                    #endregion

                    //transferencia_MismoDia
                    g_frm_P_RemesaAcumulado.Exferia_CheckBox_TransferenciaMismoDia.Checked = g_mdl_COM_RemesasAcumulados.transferencia_MismoDia;

                    #region tipoCheque
                    if (g_mdl_COM_RemesasAcumulados.tipoCheque!=null)
                    {
                        //Cheque bancario
                        if (g_mdl_COM_RemesasAcumulados.tipoCheque == int.Parse(Variables_Compras.G_MDL_TIPOCHEQUE_BANCARIO.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoCheque_ChequeBancario.Checked = true;
                        }
                        //Cheque nomina
                        else
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoCheque_ChequeNomina.Checked = true;
                        }
                    }
                    //Cheque bancario
                    else
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoCheque_ChequeBancario.Checked = true;
                    }
                    #endregion

                    #region cruzado
                    if (g_mdl_COM_RemesasAcumulados.cruzado!=null)
                    {
                        //Nivel de servicio acordado
                        if (g_mdl_COM_RemesasAcumulados.cruzado == int.Parse(Variables_Compras.G_MDL_CRUZADO_NIVELDESERVICIOACORDADO.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Cruzado_NivelServicioAcordado.Checked = true;
                        }
                        //Cruzado/Para abonar en cuenta
                        else if (g_mdl_COM_RemesasAcumulados.cruzado == int.Parse(Variables_Compras.G_MDL_CRUZADO_CRUZADO.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Cruzado_ParaAbonarEnCuenta.Checked = true;
                        }
                        //No cruzado
                        else
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Cruzado_NoCruzado.Checked = true;
                        }
                    }
                    //Nivel de servicio acordado
                    else
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_Cruzado_NivelServicioAcordado.Checked = true;
                    }
                    #endregion

                    #region carta
                    if (g_mdl_COM_RemesasAcumulados.carta!=null)
                    {
                        //Nivel de servicio acordado
                        if (g_mdl_COM_RemesasAcumulados.carta == int.Parse(Variables_Compras.G_MDL_CARTA_NIVELDESERVICIOACORDADO.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Carta_NivelServicioAcordado.Checked = true;
                        }
                        //Con carta
                        else if (g_mdl_COM_RemesasAcumulados.carta == int.Parse(Variables_Compras.G_MDL_CARTA_CONCARTA.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Carta_ConCarta.Checked = true;
                        }
                        //Sin carta
                        else
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_Carta_SinCarta.Checked = true;
                        }
                    }
                    //Nivel de servicio acordado
                    else
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_Carta_NivelServicioAcordado.Checked = true;
                    }
                    #endregion

                    #region tipoEntrega
                    if (g_mdl_COM_RemesasAcumulados.tipoEntrega!=null)
                    {
                        //Courier al Beneficiario
                        if (g_mdl_COM_RemesasAcumulados.tipoEntrega == int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_COURIERBENEFICIARIO.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CourierBeneficiario.Checked = true;
                        }
                        //Courier al Ordenante
                        else if (g_mdl_COM_RemesasAcumulados.tipoEntrega == int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_COURIERORDENANTE.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CourierOrdenante.Checked = true;
                        }
                        //Correo postal al Beneficiario
                        else if (g_mdl_COM_RemesasAcumulados.tipoEntrega == int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_CORREOPOSTALBENEFICIARIO.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CorreoPostalBeneficiario.Checked = true;
                        }
                        //Correo postal al Ordenante
                        else if (g_mdl_COM_RemesasAcumulados.tipoEntrega == int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_CORREOPOSTALORDENANTE.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CorreoPostalOrdenante.Checked = true;
                        }
                        //Recoger en oficina (Ordenante)
                        else if (g_mdl_COM_RemesasAcumulados.tipoEntrega == int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_RECOGERENOFICINA.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_RecogerEnOficina.Checked = true;
                        }
                        //Correo certificado al Beneficiario
                        else if (g_mdl_COM_RemesasAcumulados.tipoEntrega == int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_CORREOCERTIFICADOBENEFICIARIO.Codigo))
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CorreoCertificadoBeneficiario.Checked = true;
                        }
                        //Correo certificado al Ordenante
                        else
                        {
                            g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CorreoCertificadoOrdenante.Checked = true;
                        }
                    }
                    //Recoger en oficina (Ordenante)
                    else
                    {
                        g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_RecogerEnOficina.Checked = true;
                    }
                    #endregion

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

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

                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_RemesaAcumulado.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_RemesaAcumulado.Tag.ToString(), str_MenuSuperior_Codigo);

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos()
        {
            try
            {
                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_RemesaAcumulado.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_RemesaAcumulado.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_RemesaAcumulado_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, nameof(P_RemesaAcumulado_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, nameof(P_RemesaAcumulado_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_RemesaAcumulado.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_RemesaAcumulado, 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_RemesaAcumulado.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    g_frm_P_RemesaAcumulado.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    
                    g_frm_P_RemesaAcumulado.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_RemesaAcumulado_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_Completed));
            }
        }

        public INTERNO_ValorDevuelto_Modelo ValidarDatos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

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

                // La Importe no puede estar vacía
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (g_frm_P_RemesaAcumulado.Exferia_TextBox_TotalAPagar.Text.Trim().Length == 0))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_RemesaAcumulado.Exferia_Label_TotalAPagar.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_RemesaAcumulado.Exferia_TextBox_TotalAPagar;
                }

                // El importe debe ser diferente 0
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (Convert.ToDecimal(g_frm_P_RemesaAcumulado.Exferia_TextBox_TotalAPagar.Text.Trim()).Equals(0m)))
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CERO(g_frm_P_RemesaAcumulado.Exferia_Label_TotalAPagar.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_RemesaAcumulado.Exferia_TextBox_TotalAPagar;
                }
            }
            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, nameof(P_RemesaAcumulado_Controladora) + "/" + nameof(ValidarDatos));

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

            return mdl_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo GrabarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();

            try
            {
                COM_RemesasAcumulados mdl_COM_RemesasAcumulados = new COM_RemesasAcumulados();

                //id
                mdl_COM_RemesasAcumulados.id = g_mdl_COM_RemesasAcumulados.id;

                //idCuentaBancariaSEPA_Pago
                if (g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id != -1)
                {
                    mdl_COM_RemesasAcumulados.idCuentaBancariaSEPA_Pago = g_frm_P_RemesaAcumulado.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id;
                }
                else
                {
                    mdl_COM_RemesasAcumulados.idCuentaBancariaSEPA_Pago = null;
                }

                //idProveedor
                mdl_COM_RemesasAcumulados.idProveedor = g_mdl_COM_RemesasAcumulados.idProveedor.Value;

                //importe
                if (g_frm_P_RemesaAcumulado.Exferia_TextBox_TotalAPagar.Text.Trim().Length > 0)
                {
                    mdl_COM_RemesasAcumulados.importe = Convert.ToDecimal(g_frm_P_RemesaAcumulado.Exferia_TextBox_TotalAPagar.Text.Trim());
                }
                else
                {
                    mdl_COM_RemesasAcumulados.importe = 0;
                }
               
                //concepto
                mdl_COM_RemesasAcumulados.concepto = g_frm_P_RemesaAcumulado.Exferia_TextBox_Concepto.Text;

                #region tipoPago
                //EmisionChequeBancario
                if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_EmisionChequeBancario.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoPago = int.Parse(Variables_Compras.G_MDL_TIPOPAGO_EMISIONCHEQUEBANCARIO.Codigo);
                }
                //EmisionCheque
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_EmisionCheque.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoPago = int.Parse(Variables_Compras.G_MDL_TIPOPAGO_EMISIONCHEQUE.Codigo);
                }
                //Transferencia No SEPA
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_TransferenciaNoSEPA.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoPago = int.Parse(Variables_Compras.G_MDL_TIPOPAGO_TRANSFERENCIA_NOSEPA.Codigo);
                }
                //Transferencia SEPA
                else
                {
                    mdl_COM_RemesasAcumulados.tipoPago = int.Parse(Variables_Compras.G_MDL_TIPOPAGO_TRANSFERENCIA_SEPA.Codigo);
                }
                #endregion

                #region prioridad
                //Alta
                if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_Prioridad_Alta.Checked)
                {
                    mdl_COM_RemesasAcumulados.prioridad = int.Parse(Variables_Compras.G_MDL_PRIORIDAD_ALTA.Codigo);
                }
                //Normal
                else
                {
                    mdl_COM_RemesasAcumulados.prioridad = int.Parse(Variables_Compras.G_MDL_PRIORIDAD_NORMAL.Codigo);
                }
                #endregion

                #region gastos
                //Por cuenta del Beneficiario
                if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_Gastos_PorCuentaBeneficiario.Checked)
                {
                    mdl_COM_RemesasAcumulados.gastos = int.Parse(Variables_Compras.G_MDL_GASTOS_CUENTABENEFICIARIO.Codigo);
                }
                //Por cuenta del Ordenante
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_Gastos_PorCuentaOrdenante.Checked)
                {
                    mdl_COM_RemesasAcumulados.gastos = int.Parse(Variables_Compras.G_MDL_GASTOS_CUENTAORDENANTE.Codigo);
                }
                //Gastos compartidos
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_Gastos_GastosCompartidos.Checked)
                {
                    mdl_COM_RemesasAcumulados.gastos = int.Parse(Variables_Compras.G_MDL_GASTOS_GASTOSCOMPARTIDOS.Codigo);
                }
                //Nivel de servicio acordado
                else
                {
                    mdl_COM_RemesasAcumulados.gastos = int.Parse(Variables_Compras.G_MDL_GASTOS_NIVELDESERVICIOACORDADO.Codigo);
                }
                #endregion

                //transferencia_MismoDia
                mdl_COM_RemesasAcumulados.transferencia_MismoDia = g_frm_P_RemesaAcumulado.Exferia_CheckBox_TransferenciaMismoDia.Checked;

                #region tipoCheque
                //Cheque bancario
                if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoCheque_ChequeBancario.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoCheque = int.Parse(Variables_Compras.G_MDL_TIPOCHEQUE_BANCARIO.Codigo);
                }
                //Cheque nomina
                else
                {
                    mdl_COM_RemesasAcumulados.tipoCheque = int.Parse(Variables_Compras.G_MDL_TIPOCHEQUE_NOMINA.Codigo);
                }
                #endregion

                #region cruzado
                //Nivel de servicio acordado
                if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_Cruzado_NivelServicioAcordado.Checked)
                {
                    mdl_COM_RemesasAcumulados.cruzado = int.Parse(Variables_Compras.G_MDL_CRUZADO_NIVELDESERVICIOACORDADO.Codigo);
                }
                //Cruzado/Para abonar en cuenta
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_Cruzado_ParaAbonarEnCuenta.Checked)
                {
                    mdl_COM_RemesasAcumulados.cruzado = int.Parse(Variables_Compras.G_MDL_CRUZADO_CRUZADO.Codigo);
                }
                //No cruzado
                else
                {
                    mdl_COM_RemesasAcumulados.cruzado = int.Parse(Variables_Compras.G_MDL_CRUZADO_NOCRUZADO.Codigo);
                }
                #endregion

                #region carta
                //Nivel de servicio acordado
                if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_Carta_NivelServicioAcordado.Checked)
                {
                    mdl_COM_RemesasAcumulados.carta = int.Parse(Variables_Compras.G_MDL_CARTA_NIVELDESERVICIOACORDADO.Codigo);
                }
                //Con carta
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_Carta_ConCarta.Checked)
                {
                    mdl_COM_RemesasAcumulados.carta = int.Parse(Variables_Compras.G_MDL_CARTA_CONCARTA.Codigo);
                }
                //Sin carta
                else
                {
                    mdl_COM_RemesasAcumulados.carta = int.Parse(Variables_Compras.G_MDL_CARTA_SINCARTA.Codigo);
                }
                #endregion

                #region tipoEntrega
                //Courier al Beneficiario
                if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CourierBeneficiario.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoEntrega = int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_COURIERBENEFICIARIO.Codigo);
                }
                //Courier al Ordenante
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CourierOrdenante.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoEntrega = int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_COURIERORDENANTE.Codigo);
                }
                //Correo postal al Beneficiario
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CorreoPostalBeneficiario.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoEntrega = int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_CORREOPOSTALBENEFICIARIO.Codigo);
                }
                //Correo postal al Ordenante
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CorreoPostalOrdenante.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoEntrega = int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_CORREOPOSTALORDENANTE.Codigo);
                }
                //Recoger en oficina (Ordenante)
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_RecogerEnOficina.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoEntrega = int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_RECOGERENOFICINA.Codigo);
                }
                //Correo certificado al Beneficiario
                else if (g_frm_P_RemesaAcumulado.Exferia_RadioButton_TipoEntrega_CorreoCertificadoBeneficiario.Checked)
                {
                    mdl_COM_RemesasAcumulados.tipoEntrega = int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_CORREOCERTIFICADOBENEFICIARIO.Codigo);
                }
                //Correo certificado al Ordenante
                else
                {
                    mdl_COM_RemesasAcumulados.tipoEntrega = int.Parse(Variables_Compras.G_MDL_TIPOENTREGA_CORREOCERTIFICADOORDENANTE.Codigo);
                }

                #endregion

                // Se graba el modelo ya relleno.
                mdl_INTERNO_ValorDevuelto_Modelo = g_obj_COM_RemesasAcumulados_Datos.Grabar(mdl_COM_RemesasAcumulados);

                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    g_mdl_COM_RemesasAcumulados = g_obj_COM_RemesasAcumulados_Datos.Obtener(mdl_COM_RemesasAcumulados.id);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_RemesaAcumulado_Controladora) + "/" + nameof(GrabarDatos_Final));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
        
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

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

                Control_Errores.Errores_Log("", ex, nameof(P_RemesaAcumulado_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, nameof(P_RemesaAcumulado_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, nameof(P_RemesaAcumulado_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_RemesaAcumulado.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_RemesaAcumulado.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add((List<long>)mdl_ValorDevuelto_Modelo_Resultado.Objeto);

                    g_frm_P_RemesaAcumulado.P_Base_PantallaOrigen.P_Base_ActualizarRegistro_ConObjeto(lst_obj, Enumerados.G_ENUM_TIPOACCION.INT_ELIMINAR);

                    g_frm_P_RemesaAcumulado.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_RemesaAcumulado.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_RemesaAcumulado_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            List<long> lst_idRemesaAcumulado = new List<long>();

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    lst_idRemesaAcumulado.Add(g_mdl_COM_RemesasAcumulados.id);

                    //Primero borro el idRemesaAcumulado de RemesaLinea
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_COM_RemesasLinea_Datos.Borrar_idRemesaAcumulado(lst_idRemesaAcumulado);

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Borro el Acumulado
                        mdl_INTERNO_ValorDevuelto_Modelo = g_obj_COM_RemesasAcumulados_Datos.Borrar(lst_idRemesaAcumulado);

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo.Objeto = lst_idRemesaAcumulado;

                            //Termino Transaccion
                            transaccion_SQL.Complete();
                        }
                    }

                    transaccion_SQL.Dispose();
                }
                catch (Control_Errores)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(P_RemesaAcumulado_Controladora) + "/" + nameof(BorrarDatos_Final));
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                    transaccion_SQL.Dispose();
                }
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion
    }
}
