using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Visualizacion;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using Exferia_Personal._1_Modelos;
using Exferia_Personal._2_Datos;
using Exferia_Personal.General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
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_Personal._4_Vistas.Controladora
{
    public class P_NominaRemesaLinea_Controladora
    {
        #region Variables Generales
        private P_NominaRemesaLinea g_frm_P_NominaRemesaLinea = 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
        private PER_NominasRemesasLinea_Datos g_obj_PER_NominasRemesasLinea_Datos = new PER_NominasRemesasLinea_Datos();
        private PER_NominasRemesasCabecera_Datos g_obj_PER_NominasRemesasCabecera_Datos = new PER_NominasRemesasCabecera_Datos();
        private PER_Nominas_Datos g_obj_PER_Nominas_Datos = new PER_Nominas_Datos();
        private PER_NominasVencimientos_Datos g_obj_PER_NominasVencimientos_Datos = new PER_NominasVencimientos_Datos();
        private PER_NominasPagos_Datos g_obj_PER_NominasPagos_Datos = new PER_NominasPagos_Datos();

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

        public GEN_EjerciciosActivos_Empresa g_mdl_GEN_EjerciciosActivos_Empresa = null;
        public PER_NominasRemesasLinea g_mdl_PER_NominasRemesasLinea = null;

        public PER_NominasPagos g_mdl_PER_NominasPagos = 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;
        private bool g_bol_GrabarDatos_VaciarDatos = true;

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

        //Tarea Asincrona de Relenar datos FacturaCabecera
        private BackgroundWorker g_obj_TareaAsincrona_RellenarDatos_Nomina;

        //Tarea Asincrona de Relenar datos Vencimiento
        private BackgroundWorker g_obj_TareaAsincrona_RellenarDatos_Vencimiento;

        public INTERNO_PER_NominasRemesasCabecera_Modelo g_mdl_INTERNO_PER_NominasRemesasCabecera_Modelo = null;

        public string g_str_Estado = "";
        public long g_lng_idEjercicio = -1;
        public long g_lng_idDelegacion = -1;
        public long g_lng_idEmpleado = -1;

        public INTERNO_PER_Nominas_Modelo g_mdl_INTERNO_PER_Nominas_Modelo = null;
        public INTERNO_PER_NominasVencimientos_Modelo g_mdl_INTERNO_PER_NominasVencimientos_Modelo = null;
        public MAE_CuentasBancariasSEPA_Pagos g_mdl_MAE_CuentasBancariasSEPA_Pagos = null;

        //Saber si el Ejercicio del Documento tiene CierreAdministrativo o CierreContable
        public G_ENUM_VALIDACIONFECHAS_TIPOCIERRE g_obj_ENUM_VALIDACIONFECHAS_TIPOCIERRE = G_ENUM_VALIDACIONFECHAS_TIPOCIERRE.Ninguno;

        #endregion

        #region Constructor
        public P_NominaRemesaLinea_Controladora(P_NominaRemesaLinea _frm_P_NominaRemesaLinea)
        {
            g_frm_P_NominaRemesaLinea = _frm_P_NominaRemesaLinea;
        }
        #endregion

        #region Enumerados
        public enum G_ENUM_NIVELES
        {
            Inicio = 0,
            Nomina = 1,
            Vencimento = 2,
            CuentaBancaria = 3
        }
        public enum G_ENUM_ACCIONES_BLOQUEO
        {
            Bloquear_NoActual = 0,
            Bloquear_SiActual = 1,
            Desbloquear_SiActual = 2
        }
        public enum G_ENUM_ACCIONES_VACIADO
        {
            Vaciar_NoActual = 0,
            Vaciar_SiActual = 1
        }
        #endregion

        #region Datos Iniciales
        public void Datos_PorDefecto()
        {
            try
            {
                //Ejercicio
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Id = g_mdl_GEN_EjerciciosActivos_Empresa.id;
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Codigo = g_mdl_GEN_EjerciciosActivos_Empresa.anioControl;
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_GEN_EjerciciosActivos_Empresa.descripcion;
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_GEN_EjerciciosActivos_Empresa.fechaBorrado;
                g_lng_idEjercicio = g_mdl_GEN_EjerciciosActivos_Empresa.id;

                //Delegacion
                if (g_frm_P_NominaRemesaLinea.P_Base_ValoresGenerales.Delegacion != null)
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id = g_frm_P_NominaRemesaLinea.P_Base_ValoresGenerales.Delegacion.id;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Codigo = g_frm_P_NominaRemesaLinea.P_Base_ValoresGenerales.Delegacion.codigo;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Descripcion = g_frm_P_NominaRemesaLinea.P_Base_ValoresGenerales.Delegacion.descripcion;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_FechaBorrado = g_frm_P_NominaRemesaLinea.P_Base_ValoresGenerales.Delegacion.fechaBorrado;
                }

                Bloquea_Desbloquea(G_ENUM_NIVELES.Nomina, G_ENUM_ACCIONES_BLOQUEO.Desbloquear_SiActual);
                Nomina_Actualizar_DatosFiltro();

                g_frm_P_NominaRemesaLinea.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(Datos_PorDefecto));
            }
        }
        #endregion

        #region Vaciar Datos
        public void Vaciar_Datos(G_ENUM_NIVELES _enum_Nivel, G_ENUM_ACCIONES_VACIADO _enum_Accion, bool _bol_VaciarHijos)
        {
            //Inicio
            if (G_ENUM_NIVELES.Inicio.Equals(_enum_Nivel))
            {
                g_lng_idEmpleado = -1;

                g_mdl_PER_NominasRemesasLinea = null;
                g_mdl_PER_NominasPagos = null;

                //Bloqueo los Controles
                SoloLectura.Empezar(g_frm_P_NominaRemesaLinea, false);

                //Empleado
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Id = -1;
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Codigo = "";
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Descripcion = "";
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_FechaBorrado = null;

                Nomina_Actualizar_DatosFiltro();

                //Vaciar Nomina
                if (_bol_VaciarHijos)
                {
                    Vaciar_Datos(G_ENUM_NIVELES.Nomina, G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual,  _bol_VaciarHijos);
                }
            }
            //Nomina
            else if (G_ENUM_NIVELES.Nomina.Equals(_enum_Nivel))
            {
                //Vencimiento
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_OPCION = "";
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_ID = -1;

                //Cuenta bancaria
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_OPCION = "";
                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_ID = -1;

                g_mdl_INTERNO_PER_Nominas_Modelo = null;

                //Vaciar_SiActual
                if (G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual.Equals(_enum_Accion))
                {
                    //Nomina
                    g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Id = -1;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Codigo = "";
                    g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Descripcion = "";
                    g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_FechaBorrado = null;

                    //Actualizar el control de Resumen de Nomina
                    g_frm_P_NominaRemesaLinea.CTU_Cartera_CarteraPersonal.Rellenar_DataGrid(G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO.Nomina, -1, true);

                    //CuentaBancaria
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id = -1;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Codigo = "";
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Descripcion = "";
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_FechaBorrado = null;

                    //Concepto
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Concepto.Text = "";

                    //FechaDocumento
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_FechaDocumento.Text = "";

                    //Bruto
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Bruto.Text = "0,00";

                    //Anticipos
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Anticipos.Text = "0,00";

                    //Embargos
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Embargos.Text = "0,00";

                    //RetencionSS
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_RetencionSS.Text = "0,00";

                    //RetencionIRPF
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_RetencionIRPF.Text = "0,00";

                    //OtrasRetenciones
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_OtrasRetenciones.Text = "0,00";

                    //EnEspecie
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_EnEspecie.Text = "0,00";

                    //Indemnizacion
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Indemnizacion.Text = "0,00";

                    //DietasExentasIRPF
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_DietasExentasIRPF.Text = "0,00";

                    //Importe
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Importe.Text = "0,00";

                }

                //Vaciar Vencimientos
                if (_bol_VaciarHijos)
                {
                    Vaciar_Datos(G_ENUM_NIVELES.Vencimento, G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual,  _bol_VaciarHijos);
                }
            }
            //Vencimiento
            else if (G_ENUM_NIVELES.Vencimento.Equals(_enum_Nivel))
            {
                g_mdl_INTERNO_PER_NominasVencimientos_Modelo = null;

                if (G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual.Equals(_enum_Accion))
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Id = -1;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Codigo = "";
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Descripcion = "";
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_FechaBorrado = null;

                    //Fecha
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosVencimiento_Fecha.Text ="";

                    //Importe
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosVencimiento_Importe.Text = "0,00";

                    Calcular_Pendiente(false);
                }
            }

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

                    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(false);

            //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 Bloquear/Desbloquear
        public void Bloquea_Desbloquea(G_ENUM_NIVELES _enum_Nivel, G_ENUM_ACCIONES_BLOQUEO _enum_Accion)
        {
            //Nomina
            if (G_ENUM_NIVELES.Nomina.Equals(_enum_Nivel))
            {
                //Bloquear_NoActual 
                if (G_ENUM_ACCIONES_BLOQUEO.Bloquear_NoActual.Equals(_enum_Accion))
                {
                    Bloquea_Desbloquea(G_ENUM_NIVELES.Vencimento, G_ENUM_ACCIONES_BLOQUEO.Bloquear_SiActual);

                }
                //Bloquear_SiActual 
                else if (G_ENUM_ACCIONES_BLOQUEO.Bloquear_SiActual.Equals(_enum_Accion))
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Enabled = false;
                    Bloquea_Desbloquea(G_ENUM_NIVELES.Vencimento, G_ENUM_ACCIONES_BLOQUEO.Bloquear_SiActual);

                    Vaciar_Datos(G_ENUM_NIVELES.Nomina, G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual, false);
                }
                //Desbloquear_SiActual
                else if (G_ENUM_ACCIONES_BLOQUEO.Desbloquear_SiActual.Equals(_enum_Accion))
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Enabled = true;
                    Bloquea_Desbloquea(G_ENUM_NIVELES.Vencimento, G_ENUM_ACCIONES_BLOQUEO.Bloquear_SiActual);

                    Vaciar_Datos(G_ENUM_NIVELES.Nomina, G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual, false);
                }
            }
            //Vancimiento
            else if (G_ENUM_NIVELES.Vencimento.Equals(_enum_Nivel))
            {
                //Bloquear_NoActual 
                if (G_ENUM_ACCIONES_BLOQUEO.Bloquear_NoActual.Equals(_enum_Accion))
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Enabled = false;
                }
                //Bloquear_SiActual 
                else if (G_ENUM_ACCIONES_BLOQUEO.Bloquear_SiActual.Equals(_enum_Accion))
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Enabled = false;
                    Bloquea_Desbloquea(G_ENUM_NIVELES.CuentaBancaria, G_ENUM_ACCIONES_BLOQUEO.Bloquear_SiActual);

                    Vaciar_Datos(G_ENUM_NIVELES.Vencimento, G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual, false);
                }
                //Desbloquear_SiActual
                else if (G_ENUM_ACCIONES_BLOQUEO.Desbloquear_SiActual.Equals(_enum_Accion))
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Enabled = true;
                    Bloquea_Desbloquea(G_ENUM_NIVELES.CuentaBancaria, G_ENUM_ACCIONES_BLOQUEO.Desbloquear_SiActual);

                    Vaciar_Datos(G_ENUM_NIVELES.Vencimento, G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual, false);
                }
            }
            //Cuentabancaria
            else if (G_ENUM_NIVELES.CuentaBancaria.Equals(_enum_Nivel))
            {
                //Bloquear_NoActual 
                if (G_ENUM_ACCIONES_BLOQUEO.Bloquear_NoActual.Equals(_enum_Accion))
                { }
                //Bloquear_SiActual 
                else if (G_ENUM_ACCIONES_BLOQUEO.Bloquear_SiActual.Equals(_enum_Accion))
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Enabled = false;
                }
                //Desbloquear_SiActual
                else if (G_ENUM_ACCIONES_BLOQUEO.Desbloquear_SiActual.Equals(_enum_Accion))
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Enabled = true;

                    Vaciar_Datos(G_ENUM_NIVELES.Vencimento, G_ENUM_ACCIONES_VACIADO.Vaciar_NoActual, 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_NominaRemesaLinea.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(G_ENUM_NIVELES.Inicio, G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual, true);

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

                g_frm_PE_Esperando.ShowDialog();
            }
            catch (Exception ex)
            {
                g_frm_P_NominaRemesaLinea.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_NominaRemesaLinea_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_NominaRemesaLinea.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_NominaRemesaLinea_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_NominaRemesaLinea_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_NominaRemesaLinea.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_NominaRemesaLinea.Salir_P_Base();
                }
                else
                {
                    //SEPA/No SEPA
                    if (g_frm_P_NominaRemesaLinea.Exferia_RadioButton_TransferenciaSEPA.Checked ||
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_TransferenciaNoSEPA.Checked)
                    {
                        g_frm_P_NominaRemesaLinea.Panel_Transferencias.Enabled = true;
                        g_frm_P_NominaRemesaLinea.Panel_Cheque.Enabled = false;
                    }
                    //Cheque
                    else
                    {
                        g_frm_P_NominaRemesaLinea.Panel_Cheque.Enabled = true;
                        g_frm_P_NominaRemesaLinea.Panel_Transferencias.Enabled = false;
                    }

                    //Actualizar el control de Resumen de Nomina
                    g_frm_P_NominaRemesaLinea.CTU_Cartera_CarteraPersonal.Rellenar_DataGrid(G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO.Nomina, g_mdl_INTERNO_PER_Nominas_Modelo.id, true);

                    //Si el Ejericicio Tuviera CierreAdministrativo o CierreContable tiene que bloquear todo el Formulario
                    g_obj_ENUM_VALIDACIONFECHAS_TIPOCIERRE = Datos_Generales.ComprobarBloquear_EjercicioCierre(g_frm_P_NominaRemesaLinea,
                                                                                                      g_frm_P_NominaRemesaLinea.P_Base_ValoresGenerales.EjercicioActivo,
                                                                                                      g_frm_P_NominaRemesaLinea.P_Base_ValoresGenerales.Ejercicios_Listado.ToList(),
                                                                                                      g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_Advertencia_Ejercicio,
                                                                                                      g_mdl_INTERNO_PER_NominasRemesasCabecera_Modelo.fecha,
                                                                                                      0);
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

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

                //Si no tiene Cierre
                if (g_obj_ENUM_VALIDACIONFECHAS_TIPOCIERRE.Equals(G_ENUM_VALIDACIONFECHAS_TIPOCIERRE.Ninguno))
                {
                    if (!g_str_Estado.Equals(Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO))
                    {
                        //Bloqueo los Controles
                        SoloLectura.Empezar(g_frm_P_NominaRemesaLinea, true);
                    }
                }
            }
        }

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

            try
            {
                g_mdl_PER_NominasRemesasLinea = g_obj_PER_NominasRemesasLinea_Datos.Obtener(_lng_id);

                if(g_mdl_PER_NominasRemesasLinea != null)
                {
                    //Pago Relacionado
                    if (g_mdl_PER_NominasRemesasLinea.PER_NominasPagos != null)
                    {
                        g_mdl_PER_NominasPagos = g_mdl_PER_NominasRemesasLinea.PER_NominasPagos.FirstOrDefault();
                    }

                    //Datos de la nomina
                    RellenarDatos_Nomina_Final(g_mdl_PER_NominasRemesasLinea.PER_NominasVencimientos.idNomina,true);
                    if(g_mdl_INTERNO_PER_Nominas_Modelo != null)
                    {
                        //Ejercicio
                        if(g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio != null)
                        {
                            g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Id = g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio.id;
                            g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Codigo = g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio.anioControl;
                            g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio.descripcion;
                            g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio.fechaBorrado;
                        }

                        //Nomina
                        g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Id = g_mdl_INTERNO_PER_Nominas_Modelo.id;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Codigo = g_mdl_INTERNO_PER_Nominas_Modelo.codigo.ToString();
                        g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_FechaBorrado = g_mdl_INTERNO_PER_Nominas_Modelo.fechaBorrado;
                    }
                   
                    //Datos de NominaVencimiento
                    RellenarDatos_NominaVencimiento_Final(g_mdl_PER_NominasRemesasLinea.idNominaVencimiento,true);
                    if (g_mdl_INTERNO_PER_NominasVencimientos_Modelo != null)
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Id = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.id;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Codigo = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.codigo.ToString();
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.observaciones;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.fechaBorrado;
                    }
                    
                    //CuentaBancaria
                    if(g_mdl_PER_NominasRemesasLinea.MAE_CuentasBancariasSEPA_Pagos != null)
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id = g_mdl_PER_NominasRemesasLinea.MAE_CuentasBancariasSEPA_Pagos.id;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Codigo = g_mdl_PER_NominasRemesasLinea.MAE_CuentasBancariasSEPA_Pagos.iban;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_PER_NominasRemesasLinea.MAE_CuentasBancariasSEPA_Pagos.descripcion;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_PER_NominasRemesasLinea.MAE_CuentasBancariasSEPA_Pagos.fechaBorrado;
                    }
                    else
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id = -1;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Codigo = string.Empty;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Descripcion = string.Empty;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_FechaBorrado = null;
                    }

                    g_frm_P_NominaRemesaLinea.Exferia_TextBox_TotalAPagar.Text = string.Format("{0:0.00}", g_mdl_PER_NominasRemesasLinea.importe);

                    #region tipoPago
                    //EmisionCheque
                    if (g_mdl_PER_NominasRemesasLinea.tipoPago == int.Parse(Variables_Personal.G_MDL_TIPOPAGO_EMISIONCHEQUE.Codigo))
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_EmisionCheque.Checked = true;
                    }
                    //Transferencia No SEPA
                    else if (g_mdl_PER_NominasRemesasLinea.tipoPago == int.Parse(Variables_Personal.G_MDL_TIPOPAGO_TRANSAFERENCIA_NOSEPA.Codigo))
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_TransferenciaNoSEPA.Checked=true ;
                    }
                    //Transferencia SEPA
                    else
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_TransferenciaSEPA.Checked = true;
                    }
                    #endregion

                    #region prioridad
                    //Alta
                    if (g_mdl_PER_NominasRemesasLinea.prioridad == int.Parse(Variables_Personal.G_MDL_PRIORIDAD_ALTA.Codigo))
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Prioridad_Alta.Checked = true;
                    }
                    //Normal
                    else
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Prioridad_Normal.Checked = true;
                    }
                    #endregion

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

                    //transferencia_MismoDia
                    g_frm_P_NominaRemesaLinea.Exferia_CheckBox_TransferenciaMismoDia.Checked=g_mdl_PER_NominasRemesasLinea.transferencia_MismoDia;

                    #region tipoCheque
                    //Cheque bancario
                    if (g_mdl_PER_NominasRemesasLinea.tipoCheque == int.Parse(Variables_Personal.G_MDL_TIPOCHEQUE_BANCARIO.Codigo))
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_TipoCheque_ChequeBancario.Checked = true;
                    }
                    //Cheque nomina
                    else
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_TipoCheque_ChequeNomina.Checked = true;
                    }
                    #endregion

                    #region cruzado
                    //Nivel de servicio acordado
                    if (g_mdl_PER_NominasRemesasLinea.cruzado == int.Parse(Variables_Personal.G_MDL_CRUZADO_NIVELDESERVICIOACRODADO.Codigo))
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Cruzado_NivelServicioAcordado.Checked = true;
                    }
                    //Cruzado/Para abonar en cuenta
                    else if (g_mdl_PER_NominasRemesasLinea.cruzado == int.Parse(Variables_Personal.G_MDL_CRUZADO_CRUZADO.Codigo))
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Cruzado_ParaAbonarEnCuenta.Checked = true;
                    }
                    //No cruzado
                    else
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Cruzado_NoCruzado.Checked = true;
                    }
                    #endregion

                    #region carta
                    //Nivel de servicio acordado
                    if (g_mdl_PER_NominasRemesasLinea.carta == int.Parse(Variables_Personal.G_MDL_CARTA_NIVELDESERVICIOACRODADO.Codigo))
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Carta_NivelServicioAcordado.Checked = true;
                    }
                    //Con carta
                    else if (g_mdl_PER_NominasRemesasLinea.carta == int.Parse(Variables_Personal.G_MDL_CARTA_CONCARTA.Codigo))
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Carta_ConCarta.Checked = true;
                    }
                    //Sin carta
                    else
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Carta_SinCarta.Checked = true;
                    }
                    #endregion

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

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

                        dynamic dnm_Objeto = g_mdl_PER_NominasRemesasLinea;
                        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_NominaRemesaLinea.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_NominaRemesaLinea.Tag.ToString(), str_MenuSuperior_Codigo);

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

            return bol_ValorDevuelto;
        }
        #endregion

        #region Grabar Datos
        public void GrabarDatos(bool _bol_GrabarDatos_VaciarDatos)
        {
            try
            {
                //Validacion para Aviso ..................................................
                INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = Validar_ParaAvisos();
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo.Mensaje.Trim().Length > 0)
                    {
                        if (Mensajes.MostrarMensaje_Pregunta(mdl_ValorDevuelto_Modelo.Mensaje) == false)
                        {
                            g_bol_GrabarDatos_TerminoCorrectamente = false;
                            //Poner el Foco en el objeto que tuvoel problema en validar
                            if (mdl_ValorDevuelto_Modelo.Objeto != null)
                            {
                                Funciones.Poner_Foco_Objeto(g_frm_P_NominaRemesaLinea, mdl_ValorDevuelto_Modelo.Objeto);
                            }

                            return;
                        }
                    }
                }
                //.........................................................................................

                g_bol_GrabarDatos_VaciarDatos = _bol_GrabarDatos_VaciarDatos;

                g_bol_GrabarDatos_TerminoCorrectamente = true;

                g_frm_P_NominaRemesaLinea.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_NominaRemesaLinea.Enabled = true;

                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_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_NominaRemesaLinea_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_NominaRemesaLinea_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_NominaRemesaLinea.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_NominaRemesaLinea, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    List<object> lst_obj = new List<object>();
                    lst_obj.Add(g_frm_P_NominaRemesaLinea.g_mdl_PRV_OpcionesDetalle.opcion);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    g_frm_P_NominaRemesaLinea.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)
                    {
                        Vaciar_Datos(G_ENUM_NIVELES.Inicio, G_ENUM_ACCIONES_VACIADO.Vaciar_SiActual, true);
                        Bloquea_Desbloquea(G_ENUM_NIVELES.Vencimento, G_ENUM_ACCIONES_BLOQUEO.Bloquear_SiActual);
                    }
                    else
                    {
                        g_frm_P_NominaRemesaLinea.CTU_Cartera_CarteraPersonal.Rellenar_DataGrid(G_ENUM_CTU_CARTERA_PERSONAL_TIPODOCUMENTOFILTRO.Nomina, g_mdl_INTERNO_PER_Nominas_Modelo.id, true);

                    }

                    //Poner el Foco Inicial
                    Funciones.Poner_Foco_Objeto(g_frm_P_NominaRemesaLinea, g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo);
                    //Se pone para que no pregunte si se modifico algo
                    g_frm_P_NominaRemesaLinea.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_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
            {
                //Nomina no puede estar vacía (Obligatorio)
                if(mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Codigo.Trim().Length == 0)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // Si hay Nomina validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Codigo.Trim().Length != 0) && g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_PRINCIPAL_TextBox_Codigo;
                }

                // La Vencimiento no puede estar Vacio (Obligatorio)
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Codigo.Trim().Length == 0 &&
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.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_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }

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

                // Si hay CuentaBancaria validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_NominaRemesaLinea.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_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_NominaRemesaLinea.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_NominaRemesaLinea.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_NominaRemesaLinea.Exferia_Label_SinColor_TotalAPagar.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_NominaRemesaLinea.Exferia_TextBox_TotalAPagar;
                }

                // El importe debe ser diferente 0
                if ((mdl_ValorDevuelto_Modelo.TodoCorrecto) && (Convert.ToDecimal(g_frm_P_NominaRemesaLinea.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_NominaRemesaLinea.Exferia_Label_SinColor_TotalAPagar.Text);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_NominaRemesaLinea.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_NominaRemesaLinea_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();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    long lng_idNominaRemesaLinea = -1;

                    PER_NominasRemesasLinea mdl_PER_NominasRemesasLinea = new PER_NominasRemesasLinea();

                    //id
                    mdl_PER_NominasRemesasLinea.id = g_mdl_PER_NominasRemesasLinea != null ? g_mdl_PER_NominasRemesasLinea.id : -1;

                    //idNominaRemesaCabecera
                    mdl_PER_NominasRemesasLinea.idNominaRemesaCabecera = g_mdl_INTERNO_PER_NominasRemesasCabecera_Modelo.id;

                    //idNominaVencimiento
                    mdl_PER_NominasRemesasLinea.idNominaVencimiento = g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Id;

                    //idCuentaBancariaSEPA_Pago
                    if (g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id != -1)
                    {
                        mdl_PER_NominasRemesasLinea.idCuentaBancariaSEPA_Pago = g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id;
                    }
                    else
                    {
                        mdl_PER_NominasRemesasLinea.MAE_CuentasBancariasSEPA_Pagos = null;
                    }

                    //importe
                    mdl_PER_NominasRemesasLinea.importe = Convert.ToDecimal(g_frm_P_NominaRemesaLinea.Exferia_TextBox_TotalAPagar.Text.Trim());

                    //bloqueado
                    mdl_PER_NominasRemesasLinea.bloqueado = false;

                    #region tipoPago
                    //EmisionCheque
                    if (g_frm_P_NominaRemesaLinea.Exferia_RadioButton_EmisionCheque.Checked)
                    {
                        mdl_PER_NominasRemesasLinea.tipoPago = int.Parse(Variables_Personal.G_MDL_TIPOPAGO_EMISIONCHEQUE.Codigo);
                    }
                    //Transferencia No SEPA
                    else if (g_frm_P_NominaRemesaLinea.Exferia_RadioButton_TransferenciaNoSEPA.Checked)
                    {
                        mdl_PER_NominasRemesasLinea.tipoPago = int.Parse(Variables_Personal.G_MDL_TIPOPAGO_TRANSAFERENCIA_NOSEPA.Codigo);
                    }
                    //Transferencia SEPA
                    else
                    {
                        mdl_PER_NominasRemesasLinea.tipoPago = int.Parse(Variables_Personal.G_MDL_TIPOPAGO_TRANFERENCIA_SEPA.Codigo);
                    }
                    #endregion

                    #region prioridad
                    //Alta
                    if (g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Prioridad_Alta.Checked)
                    {
                        mdl_PER_NominasRemesasLinea.prioridad = int.Parse(Variables_Personal.G_MDL_PRIORIDAD_ALTA.Codigo);
                    }
                    //Normal
                    else
                    {
                        mdl_PER_NominasRemesasLinea.prioridad = int.Parse(Variables_Personal.G_MDL_PRIORIDAD_NORMAL.Codigo);
                    }
                    #endregion

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

                    //transferencia_MismoDia
                    mdl_PER_NominasRemesasLinea.transferencia_MismoDia = g_frm_P_NominaRemesaLinea.Exferia_CheckBox_TransferenciaMismoDia.Checked;

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

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

                    #region carta
                    //Nivel de servicio acordado
                    if (g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Carta_NivelServicioAcordado.Checked)
                    {
                        mdl_PER_NominasRemesasLinea.carta = int.Parse(Variables_Personal.G_MDL_CARTA_NIVELDESERVICIOACRODADO.Codigo);
                    }
                    //Con carta
                    else if (g_frm_P_NominaRemesaLinea.Exferia_RadioButton_Carta_ConCarta.Checked)
                    {
                        mdl_PER_NominasRemesasLinea.carta = int.Parse(Variables_Personal.G_MDL_CARTA_CONCARTA.Codigo);
                    }
                    //Sin carta
                    else
                    {
                        mdl_PER_NominasRemesasLinea.carta = int.Parse(Variables_Personal.G_MDL_CARTA_SINCARTA.Codigo);
                    }
                    #endregion

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

                    #endregion
                   
                    //Se graba el modelo ya relleno
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_PER_NominasRemesasLinea_Datos.Grabar(mdl_PER_NominasRemesasLinea);

                    if(mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        lng_idNominaRemesaLinea = mdl_INTERNO_ValorDevuelto_Modelo.Id;

                        //Actualizar el importe de la remesa
                        g_obj_PER_NominasRemesasCabecera_Datos.Actualizar_Importe(g_mdl_INTERNO_PER_NominasRemesasCabecera_Modelo.id);

                        #region PAGO
                        PER_NominasPagos mdl_PER_NominasPagos = new PER_NominasPagos();
                        if(g_mdl_PER_NominasPagos != null)
                        {
                            Funciones.CopiarPropiedadesObjetos(g_mdl_PER_NominasPagos, mdl_PER_NominasPagos, false, false);
                        }
                        else
                        {
                            //id
                            mdl_PER_NominasPagos.id = -1;
                        }

                        //codigo
                        if (g_mdl_PER_NominasPagos == null)
                        {
                            long lng_CodigoInterno = 1;
                            if (g_mdl_INTERNO_PER_NominasVencimientos_Modelo != null &&
                               g_mdl_INTERNO_PER_NominasVencimientos_Modelo.PER_NominasPagos != null &&
                               g_mdl_INTERNO_PER_NominasVencimientos_Modelo.PER_NominasPagos.Count > 0)
                            {
                                long? lng_UltimoPago = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.PER_NominasPagos.Select(m => m.codigo).OrderByDescending(m => m).FirstOrDefault();
                                if (lng_UltimoPago != null)
                                {
                                    lng_CodigoInterno = lng_UltimoPago.Value + 1;
                                }
                            }
                            mdl_PER_NominasPagos.codigo = lng_CodigoInterno;
                        }

                        //idNominaVencimiento
                        mdl_PER_NominasPagos.idNominaVencimiento = mdl_PER_NominasRemesasLinea.idNominaVencimiento;

                        //fecha
                        mdl_PER_NominasPagos.fecha = g_mdl_INTERNO_PER_NominasRemesasCabecera_Modelo.fechaPagos.Value;

                        //idTesoreria
                        mdl_PER_NominasPagos.idTesoreria = g_mdl_INTERNO_PER_NominasRemesasCabecera_Modelo.idTesoreria;

                        //observaciones
                        mdl_PER_NominasPagos.observaciones = "Nomina Remesa Nº " + g_mdl_INTERNO_PER_NominasRemesasCabecera_Modelo.codigo;

                        //idClaveAnalitica
                        mdl_PER_NominasPagos.idClaveAnalitica = null;

                        //idPredefinidoCabecera_Pago
                        mdl_PER_NominasPagos.idPredefinidoCabecera_Pago = null;

                        //importe
                        mdl_PER_NominasPagos.importe = mdl_PER_NominasRemesasLinea.importe;

                        //idNominaRemesaLinea
                        mdl_PER_NominasPagos.idNominaRemesaLinea = lng_idNominaRemesaLinea;

                        //estado
                        mdl_PER_NominasPagos.estado = Variables.G_STR_ESTADO_CONTABILIDAD_CERRADO;

                        //confirmado
                        mdl_PER_NominasPagos.confirmado = null;

                        //Grabar el Pago
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo_PAGO = g_obj_PER_NominasPagos_Datos.Grabar(mdl_PER_NominasPagos);
                        if (mdl_INTERNO_ValorDevuelto_Modelo_PAGO.TodoCorrecto==false)
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo= mdl_INTERNO_ValorDevuelto_Modelo_PAGO;
                        }
                        else
                        {
                            //Temino Transaccion
                            transaccion_SQL.Complete();
                            transaccion_SQL.Dispose();
                        }
                        #endregion
                    }

                    //Solo cuando estas modificando
                    if (g_frm_P_NominaRemesaLinea.P_Base_id > 0)
                    {
                        g_mdl_PER_NominasRemesasLinea = g_obj_PER_NominasRemesasLinea_Datos.Obtener(lng_idNominaRemesaLinea);

                        if (g_mdl_PER_NominasRemesasLinea != null)
                        {
                            //Pago Relacionado
                            if (g_mdl_PER_NominasRemesasLinea.PER_NominasPagos != null)
                            {
                                g_mdl_PER_NominasPagos = g_mdl_PER_NominasRemesasLinea.PER_NominasPagos.FirstOrDefault();
                            }

                            //Si tienes Permisos para Borrar
                            g_frm_P_NominaRemesaLinea.Exferia_Button_Borrar.Enabled = true;
                        }
                    }

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        public INTERNO_ValorDevuelto_Modelo Validar_ParaAvisos()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                decimal dcm_Importe_Pendiente = 0m;
                decimal dcm_Importe_APagar = 0m;

                if (g_mdl_INTERNO_PER_NominasVencimientos_Modelo != null &&
                    g_frm_P_NominaRemesaLinea.Exferia_TextBox_TotalAPagar.Text.Trim().Length>0 &&
                    Convert.ToDecimal(g_frm_P_NominaRemesaLinea.Exferia_TextBox_TotalAPagar.Text.Trim())>0m)
                {
                    decimal dcm_Total_Vencimiento = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.importe;
                    decimal dcm_Importe_PagosRealizados = 0m;
                    if (g_mdl_INTERNO_PER_NominasVencimientos_Modelo.Importe_Pagos != null)
                    {
                        dcm_Importe_PagosRealizados = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.Importe_Pagos.Value;
                    }

                    //Si la remesa ya tiene un pago realizado, y es del mismo vencimiento, se resta del total de pagos
                    if (g_mdl_PER_NominasPagos != null &&
                        g_mdl_INTERNO_PER_NominasVencimientos_Modelo.id == g_mdl_PER_NominasPagos.idNominaVencimiento)
                    {
                        dcm_Importe_PagosRealizados -= g_mdl_PER_NominasPagos.importe;
                    }

                    //Importe pendiente
                    dcm_Importe_Pendiente = dcm_Total_Vencimiento - dcm_Importe_PagosRealizados;

                    //Importe a pagar
                    dcm_Importe_APagar = Convert.ToDecimal(g_frm_P_NominaRemesaLinea.Exferia_TextBox_TotalAPagar.Text.Trim());
                }

                if (dcm_Importe_Pendiente < dcm_Importe_APagar)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    //Buscar el vencimiento por si diera error, poder poner los datos del mensaje
                    INTERNO_OpcionesDetalle_Modelo mld_INTERNO_OpcionesDetalle_Modelo = Datos_Generales.PRV_Opciones_Buscar_Detalles(Variables.G_STR_OPCION_PER_NOMINAVENCIMIENTO);

                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_PPAGO_VALIDACION_PENDIENTE_INFERIOR_INPORTE(mld_INTERNO_OpcionesDetalle_Modelo.descripcion_Singular);
                }

                //Poner la Pregunta
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje += Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_DESEASCONTINUAR();
                }

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

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

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

                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_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_NominaRemesaLinea_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_NominaRemesaLinea_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_NominaRemesaLinea.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_NominaRemesaLinea.g_mdl_PRV_OpcionesDetalle.opcion);
                    List<long> lst_Valores = new List<long>();
                    lst_Valores.Add(mdl_ValorDevuelto_Modelo_Resultado.Id);
                    lst_obj.Add(lst_Valores);

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

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

        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    mdl_INTERNO_ValorDevuelto_Modelo = g_obj_PER_NominasRemesasLinea_Datos.Borrar(g_mdl_PER_NominasRemesasLinea != null ? g_mdl_PER_NominasRemesasLinea.id : -1);

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Actualizar el importe de la RemesaCabecera
                        g_obj_PER_NominasRemesasCabecera_Datos.Actualizar_Importe(g_mdl_INTERNO_PER_NominasRemesasCabecera_Modelo.id);

                        //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_NominaRemesaLinea_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

        #region Datos Nomina
        public void Rellenar_Datos_Nomina(long _lng_id_FacturaCabecera)
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_NominaRemesaLinea.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_RellenarDatos_Nomina != null)
                {
                    while (g_obj_TareaAsincrona_RellenarDatos_Nomina.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_RellenarDatos_Nomina = new BackgroundWorker();
                    g_obj_TareaAsincrona_RellenarDatos_Nomina.DoWork += new DoWorkEventHandler(TareaAsincrona_RellenarDatos_Nomina_DoWork);
                    g_obj_TareaAsincrona_RellenarDatos_Nomina.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_RellenarDatos_Nomina_Completed);
                    g_obj_TareaAsincrona_RellenarDatos_Nomina.WorkerReportsProgress = false;
                }

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_RellenarDatos_Nomina.RunWorkerAsync(_lng_id_FacturaCabecera);
                //#################################################################################################

                g_frm_PE_Esperando.Show();
            }
            catch (Exception ex)
            {
                g_frm_P_NominaRemesaLinea.Enabled = true;

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

                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(Rellenar_Datos_Nomina));
            }
        }
        private void TareaAsincrona_RellenarDatos_Nomina_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                long lng_id = (long)e.Argument;

                // Cargar Valores
                e.Result = RellenarDatos_Nomina_Final(lng_id,false);
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(TareaAsincrona_RellenarDatos_Nomina_DoWork));
                e.Result = false;
            }
            catch (Control_Errores)
            {
                e.Result = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(TareaAsincrona_RellenarDatos_Nomina_DoWork));
                e.Result = false;
            }
        }
        private void TareaAsincrona_RellenarDatos_Nomina_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            bool bol_ValorDevuelto = false;

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

            try
            {
                bol_ValorDevuelto = (bool)e.Result;

                //Mostrar si tuviera algun mensaje
                if (bol_ValorDevuelto == false)
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
            }
            finally
            {
                //Desbloquear el Formulario
                g_frm_P_NominaRemesaLinea.Enabled = true;

                if (bol_ValorDevuelto)
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Foco();
                }
                else
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_Foco();
                }
            }
        }

        private bool RellenarDatos_Nomina_Final(long _lng_id,bool _bol_PrimeraCarga)
        {
            bool bol_ValorDevuelto = false;

            try
            {
                //Buscar la nomina
                g_mdl_INTERNO_PER_Nominas_Modelo = g_obj_PER_Nominas_Datos.Obtener_Auxiliar(_lng_id);

                if (g_mdl_INTERNO_PER_Nominas_Modelo != null)
                {
                    //Ejercicio
                    if (g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio != null)
                    {
                        g_lng_idEjercicio = g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio.id;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Id = g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio.id;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Codigo = g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio.anioControl;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio.descripcion;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_INTERNO_PER_Nominas_Modelo.Ejercicio.fechaBorrado;
                    }

                    //EMPLEADO
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Id = g_mdl_INTERNO_PER_Nominas_Modelo.idEmpleado.Value;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Codigo = g_mdl_INTERNO_PER_Nominas_Modelo.MAE_Empleados.codigo;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_INTERNO_PER_Nominas_Modelo.MAE_Empleados.nombre;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_INTERNO_PER_Nominas_Modelo.MAE_Empleados.fechaBorrado;

                    //Delegacion
                    if (g_mdl_INTERNO_PER_Nominas_Modelo.GEN_Delegaciones != null)
                    {
                        g_lng_idDelegacion = g_mdl_INTERNO_PER_Nominas_Modelo.GEN_Delegaciones.id;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id = g_mdl_INTERNO_PER_Nominas_Modelo.GEN_Delegaciones.id;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Codigo = g_mdl_INTERNO_PER_Nominas_Modelo.GEN_Delegaciones.codigo;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_INTERNO_PER_Nominas_Modelo.GEN_Delegaciones.descripcion;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_INTERNO_PER_Nominas_Modelo.GEN_Delegaciones.fechaBorrado;
                    }

                    //Cuenta Bancaria
                    g_mdl_MAE_CuentasBancariasSEPA_Pagos = g_mdl_INTERNO_PER_Nominas_Modelo.CuentaBancaria_PorDefecto;
                    if (g_mdl_INTERNO_PER_Nominas_Modelo.CuentaBancaria_PorDefecto != null)
                    {
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Id = g_mdl_INTERNO_PER_Nominas_Modelo.CuentaBancaria_PorDefecto.id;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Codigo = g_mdl_INTERNO_PER_Nominas_Modelo.CuentaBancaria_PorDefecto.iban;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_INTERNO_PER_Nominas_Modelo.CuentaBancaria_PorDefecto.descripcion;
                        g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_INTERNO_PER_Nominas_Modelo.CuentaBancaria_PorDefecto.fechaBorrado;
                    }

                    //Concepto
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Concepto.Text = g_mdl_INTERNO_PER_Nominas_Modelo.concepto;

                    //FechaDocumento
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_FechaDocumento.Text = g_mdl_INTERNO_PER_Nominas_Modelo.fecha.ToString("dd/MM/yyyy");

                    //Bruto
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Bruto.Text = g_mdl_INTERNO_PER_Nominas_Modelo.bruto != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.bruto.Value) : "0,00";

                    //Anticipos
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Anticipos.Text = g_mdl_INTERNO_PER_Nominas_Modelo.anticipos != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.anticipos.Value) : "0,00";

                    //Embargos
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Embargos.Text = g_mdl_INTERNO_PER_Nominas_Modelo.embargos != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.embargos.Value) : "0,00";

                    //RetencionSS
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_RetencionSS.Text = g_mdl_INTERNO_PER_Nominas_Modelo.retencionSeguridadSocial != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.retencionSeguridadSocial.Value) : "0,00";

                    //RetencionIRPF
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_RetencionIRPF.Text = g_mdl_INTERNO_PER_Nominas_Modelo.retencionIRPF != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.retencionIRPF.Value) : "0,00";

                    //OtrasRetenciones
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_OtrasRetenciones.Text = g_mdl_INTERNO_PER_Nominas_Modelo.otrasRetenciones != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.otrasRetenciones.Value) : "0,00";

                    //EnEspecie
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_EnEspecie.Text = g_mdl_INTERNO_PER_Nominas_Modelo.enEspecie != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.enEspecie.Value) : "0,00";

                    //Indemnizacion
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Indemnizacion.Text = g_mdl_INTERNO_PER_Nominas_Modelo.indemnizacion != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.indemnizacion.Value) : "0,00";

                    //DietasExentasIRPF
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_DietasExentasIRPF.Text = g_mdl_INTERNO_PER_Nominas_Modelo.dietasExentasIRPF != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.dietasExentasIRPF.Value) : "0,00";

                    //Importe
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosNomina_Importe.Text = g_mdl_INTERNO_PER_Nominas_Modelo.liquido != null ? string.Format("{0:0.00}", g_mdl_INTERNO_PER_Nominas_Modelo.liquido.Value) : "0,00";

                    #region Filtros para Vencimientos
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_OPCION = Variables.G_STR_OPCION_PER_NOMINA;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_ID = g_mdl_INTERNO_PER_Nominas_Modelo.id;

                    //Filtrado de Opciones del Padre
                    List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo_Vencimiento = new List<INTERNO_Filtro_OpcionPadre_Modelo>();
                    //Para que busque con el Filtro del estado, que no este abierto
                    lst_INTERNO_Filtro_OpcionPadre_Modelo_Vencimiento.Add(new INTERNO_Filtro_OpcionPadre_Modelo(nameof(INTERNO_PER_NominasVencimientos_Listado_Modelo.estado), -1, Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO));

                    //Para que busque con el Filtro solo los pendientes
                    lst_INTERNO_Filtro_OpcionPadre_Modelo_Vencimiento.Add(new INTERNO_Filtro_OpcionPadre_Modelo(nameof(INTERNO_PER_NominasVencimientos_Listado_Modelo.Importe_Pendiente), -1, true));


                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo_Vencimiento;
                    #endregion

                    #region Filtros para Cuenta Bancaria
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_OPCION = Variables.G_STR_OPCION_MAE_EMPLEADO;
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_RELACIONADOS_Padre_ID = g_mdl_INTERNO_PER_Nominas_Modelo.idEmpleado.Value;
                    #endregion

                    #region Si tiene un solo vencimiento se pone
                    if (_bol_PrimeraCarga == false && 
                        g_mdl_INTERNO_PER_Nominas_Modelo.Vencimientos != null &&
                        g_mdl_INTERNO_PER_Nominas_Modelo.Vencimientos.Count >0)
                    {
                        AUX_Vencimientos_Importes_Modelo mdl_AUX_Vencimientos_Importes_Modelo = g_mdl_INTERNO_PER_Nominas_Modelo.Vencimientos.Where(m => m.Importe_Pendiente > 0).FirstOrDefault();

                        if (mdl_AUX_Vencimientos_Importes_Modelo != null)
                        {
                            RellenarDatos_NominaVencimiento_Final(mdl_AUX_Vencimientos_Importes_Modelo.IdVencimento, false);

                            if (g_mdl_INTERNO_PER_NominasVencimientos_Modelo != null)
                            {
                                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Id = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.id;
                                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Codigo = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.codigo.ToString();
                                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Descripcion = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.observaciones;
                                g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_FechaBorrado = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.fechaBorrado;
                            }
                        }
                    }
                    #endregion

                    Nomina_Actualizar_DatosFiltro();

                    bol_ValorDevuelto = true;
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(RellenarDatos_Nomina_Final));
            }

            return bol_ValorDevuelto;
        }

        public void Nomina_Actualizar_DatosFiltro()
        {
            //Filtrado de Opciones del Padre
            List<INTERNO_Filtro_OpcionPadre_Modelo> lst_INTERNO_Filtro_OpcionPadre_Modelo = new List<INTERNO_Filtro_OpcionPadre_Modelo>();

            //Para que busque con el Filtro del Ejercicio
            lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo(nameof(INTERNO_PER_Nominas_Listado_Modelo.idEjercicio), g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Ejercicio.Exferia_F3_SoloSeleccion_Id));

            //Para que busque con el Filtro del estado, que no este abierto
            lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo(nameof(INTERNO_PER_Nominas_Listado_Modelo.estado), -1, Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO));

            //Para que busque con el Filtro del Delegacion
            lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo(nameof(INTERNO_PER_Nominas_Listado_Modelo.idDelegacion), g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Delegacion.Exferia_F3_SoloSeleccion_Id));

            //Para que busque con el Filtro de la Empleado
            lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo(nameof(INTERNO_PER_Nominas_Listado_Modelo.idEmpleado), g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_Empleado.Exferia_F3_SoloSeleccion_Id));

            //Para que busque con el Filtro solo los pendientes
            lst_INTERNO_Filtro_OpcionPadre_Modelo.Add(new INTERNO_Filtro_OpcionPadre_Modelo(nameof(INTERNO_PER_Nominas_Listado_Modelo.Importe_Pendiente), -1, true));


            //Filtros para facturas
            g_frm_P_NominaRemesaLinea.Exferia_F3_Nomina.Exferia_F3_RELACIONADOS = lst_INTERNO_Filtro_OpcionPadre_Modelo;
        }
        #endregion

        #region Datos NominaVencimiento
        public void Rellenar_Datos_NominaVencimiento(long _lng_id_Vencimiento)
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_NominaRemesaLinea.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_RellenarDatos_Vencimiento != null)
                {
                    while (g_obj_TareaAsincrona_RellenarDatos_Vencimiento.IsBusy)
                        Application.DoEvents();
                }
                else
                {
                    g_obj_TareaAsincrona_RellenarDatos_Vencimiento = new BackgroundWorker();
                    g_obj_TareaAsincrona_RellenarDatos_Vencimiento.DoWork += new DoWorkEventHandler(TareaAsincrona_RellenarDatos_NominaVencimiento_DoWork);
                    g_obj_TareaAsincrona_RellenarDatos_Vencimiento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_RellenarDatos_NominaVencimiento_Completed);
                    g_obj_TareaAsincrona_RellenarDatos_Vencimiento.WorkerReportsProgress = false;
                }

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_obj_TareaAsincrona_RellenarDatos_Vencimiento.RunWorkerAsync(_lng_id_Vencimiento);
                //#################################################################################################

                g_frm_PE_Esperando.Show();
            }
            catch (Exception ex)
            {
                g_frm_P_NominaRemesaLinea.Enabled = true;

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

                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(Rellenar_Datos_NominaVencimiento));
            }
        }
        private void TareaAsincrona_RellenarDatos_NominaVencimiento_DoWork(object sender, DoWorkEventArgs e)
        {

            try
            {
                long lng_id = (long)e.Argument;

                // Cargar Valores
                e.Result = RellenarDatos_NominaVencimiento_Final(lng_id,false);

            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(TareaAsincrona_RellenarDatos_NominaVencimiento_DoWork));
                e.Result = false;
            }
            catch (Control_Errores)
            {
                e.Result = false;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(TareaAsincrona_RellenarDatos_NominaVencimiento_DoWork));
                e.Result = false;
            }
        }
        private void TareaAsincrona_RellenarDatos_NominaVencimiento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            bool bol_ValorDevuelto = false;

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

            try
            {
                bol_ValorDevuelto = (bool)e.Result;

                //Mostrar si tuviera algun mensaje
                if (bol_ValorDevuelto == false)
                {
                    Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(TareaAsincrona_RellenarDatos_NominaVencimiento_Completed));
            }
            finally
            {
                //Desbloquear el Formulario
                g_frm_P_NominaRemesaLinea.Enabled = true;

                if (bol_ValorDevuelto)
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_CuentaBancaria.Exferia_F3_SoloSeleccion_Foco();
                }
                else
                {
                    g_frm_P_NominaRemesaLinea.Exferia_F3_SoloSeleccion_NominaVencimiento.Exferia_F3_SoloSeleccion_Foco();
                }
            }
        }

        private bool RellenarDatos_NominaVencimiento_Final(long _lng_id, bool _bol_PrimeraCarga)
        {
            bool bol_ValorDevuelto = false;

            try
            {
                //Buscar la nominavencimiento
                g_mdl_INTERNO_PER_NominasVencimientos_Modelo = g_obj_PER_NominasVencimientos_Datos.Obtener_Auxiliar(_lng_id);

                if (g_mdl_INTERNO_PER_NominasVencimientos_Modelo != null)
                {
                    //Fecha
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosVencimiento_Fecha.Text = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.fechaVencimiento.ToString("dd/MM/yyyy");

                    //Importe
                    g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_DatosVencimiento_Importe.Text = string.Format("{0:0.00}", g_mdl_INTERNO_PER_NominasVencimientos_Modelo.importe);

                    Calcular_Pendiente(_bol_PrimeraCarga);

                    bol_ValorDevuelto = true;
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(RellenarDatos_NominaVencimiento_Final));
            }

            return bol_ValorDevuelto;
        }
        #endregion

        #region Calcular Pendiente
        public void Calcular_Pendiente(bool _bol_PrimeraCarga)
        {
            try
            {
                decimal dcm_Total_Vencimiento = 0m;
                decimal dcm_Total_PagosRealizados = 0m;
                decimal dcm_Total_Pendiente = 0m;

                if (g_mdl_INTERNO_PER_NominasVencimientos_Modelo!=null)
                {
                    dcm_Total_Vencimiento = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.importe;

                    if (g_mdl_INTERNO_PER_NominasVencimientos_Modelo.Importe_Pagos!=null)
                    {
                        dcm_Total_PagosRealizados = g_mdl_INTERNO_PER_NominasVencimientos_Modelo.Importe_Pagos.Value;
                    }

                    //Si la remesa ya tiene un pago realizado, y es del mismo vencimiento, se resta del total de pagos
                    if (g_mdl_PER_NominasPagos!=null && 
                        g_mdl_INTERNO_PER_NominasVencimientos_Modelo.id== g_mdl_PER_NominasPagos.idNominaVencimiento)
                    {
                        dcm_Total_PagosRealizados -= g_mdl_PER_NominasPagos.importe;
                    }

                    if (_bol_PrimeraCarga)
                    {
                        dcm_Total_Pendiente = g_mdl_PER_NominasPagos != null ? g_mdl_PER_NominasPagos.importe  : (dcm_Total_Vencimiento - dcm_Total_PagosRealizados); 
                    }
                    else
                    {
                        dcm_Total_Pendiente = dcm_Total_Vencimiento - dcm_Total_PagosRealizados;
                    }

                    
                }

                //Rellenar Etiquetas y TextBox
                g_frm_P_NominaRemesaLinea.Exferia_Label_SinColor_PagosRealizados.Text = string.Format("{0:0.00}", dcm_Total_PagosRealizados);
                g_frm_P_NominaRemesaLinea.Exferia_TextBox_TotalAPagar.Text = string.Format("{0:0.00}", dcm_Total_Pendiente);
            }
            catch(Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_NominaRemesaLinea_Controladora) + "/" + nameof(Calcular_Pendiente));
            }
        }
        #endregion
    }
}
