using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Compras;
using Exferia_ControlGastos._0_Modelos;
using Exferia_ControlGastos._1_Datos;
using Exferia_ControlGastos._3_Vistas.Listados;
using Exferia_EntityFramework;
using Exferia_Formularios;
using Exferia_General;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Transactions;
using System.Windows.Forms;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_ControlGastos._3_Vistas.Controladoras
{
    public class P_Expediente_Controladora
    {
        #region Variables Generales
        private P_Expediente g_frm_P_Expediente = null;//Variable que enlaza con la pantalla asociada
        private PE_Esperando g_frm_PE_Esperando;//Pantalla de Espera, para cuando se ejecutan tareas pesadas como cargar, guardar, etc

        //Clases de Negocio Necesarias para la carga de datos
        private CTG_Expedientes_Datos g_obj_CTG_Expedientes_Datos = new CTG_Expedientes_Datos();
        private CTG_Anticipos_Datos g_obj_CTG_Anticipos_Datos = new CTG_Anticipos_Datos();
        private CTG_Pagos_Datos g_obj_CTG_Pagos_Datos = new CTG_Pagos_Datos();
        private CTG_GastosCabecera_Datos g_obj_CTG_GastosCabecera_Datos = new CTG_GastosCabecera_Datos();
        private CTG_GastosLineas_Datos g_obj_CTG_GastosLineas_Datos = new CTG_GastosLineas_Datos();
        private CTG_OrdenComisionServiciosCabecera_Datos g_obj_CTG_OrdenComisionServiciosCabecera_Datos = new CTG_OrdenComisionServiciosCabecera_Datos();
        private CTG_Expedientes_Documentos_Datos g_obj_CTG_Expedientes_Documentos_Datos = new CTG_Expedientes_Documentos_Datos();
        private CTG_OrdenComisionServiciosItinerarios_Datos g_obj_CTG_OrdenComisionServiciosItinerarios_Datos = new CTG_OrdenComisionServiciosItinerarios_Datos();
        //Modelo necesarios
        public INTERNO_CTG_Expediente_Modelo g_mdl_INTERNO_CTG_Expediente_Modelo = null;

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

        #region Tareas Asincronas
        //Tareea Asincrona de carga de datos
        private BackgroundWorker g_obj_TareaAsincrona_CargarDatos;

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

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

        public string g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

        #region Anticipo
        public List<INTERNO_CTG_Anticipos_Listado_Modelo> g_lst_INTERNO_CTG_Anticipos_Listado_Modelo = null;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Anticipo;

        //Filtrado del listado anticipo 
        public List<string> g_lst_ColumnasAMostrar_Anticipo = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Anticipo = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_Anticipo = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Anticipo = 0;
        private int g_int_TotalRegistros_Anticipo = 0;

        //Tareea Asincrona de borrar de datos Anticipo
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_Anticipo;

        //Tarea Asincrona para la Rellenar DataGridView Anticipo
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Anticipo;
        #endregion

        #region Pago
        public List<INTERNO_CTG_Pagos_Listado_Modelo> g_lst_INTERNO_CTG_Pagos_Listado_Modelo = null;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Pago;

        //Filtrado del listado Pago 
        public List<string> g_lst_ColumnasAMostrar_Pago = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Pago = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_Pago = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Pago = 0;
        private int g_int_TotalRegistros_Pago = 0;

        //Tareea Asincrona de borrar de datos Pago
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_Pago;

        //Tarea Asincrona para la Rellenar DataGridView Pago
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Pago;
        #endregion

        #region GastoCabecera
        public List<INTERNO_CTG_GastosCabecera_Listado_Modelo> g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo = null;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_GastoCabecera;

        //Filtrado del listado GastoCAbecera 
        public List<string> g_lst_ColumnasAMostrar_GastoCabecera = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_GastoCabecera = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_GastoCabecera = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_GastoCabecera = 0;
        private int g_int_TotalRegistros_GastoCabecera = 0;

        //Tareea Asincrona de borrar de datos GastoCabecera
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_GastoCabecera;

        //Tarea Asincrona para la Rellenar DataGridView GastoCabecera
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera;
        #endregion

        #region OrdenComisionServicio
        public List<INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo> g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo = null;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_OCS;

        //Filtrado del listado OCS 
        public List<string> g_lst_ColumnasAMostrar_OCS = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_OCS = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_OCS = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_OCS = 0;
        private int g_int_TotalRegistros_OCS = 0;

        //Tareea Asincrona de borrar de datos OCS
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_OCS;

        //Tarea Asincrona para la Rellenar DataGridView OCS
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_OCS;
        #endregion

        #region Documento
        public List<INTERNO_CTG_Expedientes_Documentos_Listado_Modelo> g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo = null;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Documento;

        //Filtrado del listado Documento 
        public List<string> g_lst_ColumnasAMostrar_Documento = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Documento = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_Documento = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Documento = 0;
        private int g_int_TotalRegistros_Documento = 0;

        //Tareea Asincrona de borrar de datos Documento
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_Documento;

        //Tarea Asincrona para la Rellenar DataGridView Documento
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Documento;
        #endregion

        #region Facturas
        public List<INTERNO_COM_FacturasCabecera_Listado_Modelo> g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo = null;
        public List<INTERNO_ABS_Listado_ColumnasDatos_Modelo> g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Factura;

        //Filtrado del listado Factura 
        public List<string> g_lst_ColumnasAMostrar_Factura = new List<string>();
        public ABS_Listado g_obj_ABS_Listado_Factura = null;
        public Dictionary<string, object> g_dct_ListadoFiltros_Factura = new Dictionary<string, object>();
        private int g_int_TotalRegistrosInsertados_Factura = 0;
        private int g_int_TotalRegistros_Factura = 0;

        //Tareea Asincrona de borrar de datos Factura
        private BackgroundWorker g_obj_TareaAsincrona_BorrarDatos_Factura;

        //Tarea Asincrona para la Rellenar DataGridView Factura
        private BackgroundWorker g_TareaAsincrona_Rellenar_DataGrid_Factura;
        #endregion

        #region Liquidacion
        #region Columnas
        public int g_int_ColumnaPosicion_Liquidacion_Tipo = 0;
        public int g_int_ColumnaPosicion_Liquidacion_Descripcion = 1;
        public int g_int_ColumnaPosicion_Liquidacion_Resultado = 2;
        #endregion

        #region Tipos de columnas
        public int g_int_TipoColumna_Agrupado = 0;
        public int g_int_TipoColumna_TotalAgrupado = 1;
        public int g_int_TipoColumna_Linea = 2;
        #endregion
        #endregion

        #region Itinerario
        #region Columnas
        public int g_int_ColumnaPosicion_Itinerario_Desde = 0;
        public int g_int_ColumnaPosicion_Itinerario_Hasta = 1;
        public int g_int_ColumnaPosicion_Itinerario_Fecha = 2;
        public int g_int_ColumnaPosicion_Itinerario_HoraSalida = 3;
        public int g_int_ColumnaPosicion_Itinerario_HoraLlegada = 4;
        #endregion

        #endregion

        #endregion

        #region Constructor
        public P_Expediente_Controladora(P_Expediente _frm_P_Expediente)
        {
            g_frm_P_Expediente = _frm_P_Expediente;

            //(Tarea Asincrona) Cargar Listado de Anticipo ########################################
            g_TareaAsincrona_Rellenar_DataGrid_Anticipo = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Anticipo.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Anticipo_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Anticipo.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Anticipo_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Anticipo.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Anticipo_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Anticipo.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Anticipo.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Pago ########################################
            g_TareaAsincrona_Rellenar_DataGrid_Pago = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Pago.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Pago_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Pago.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Pago_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Pago.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Pago_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Pago.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Pago.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de GastoCabecera ########################################
            g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_GastoCabecera_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_GastoCabecera_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_GastoCabecera_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de OCS ########################################
            g_TareaAsincrona_Rellenar_DataGrid_OCS = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_OCS.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_OCS_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_OCS.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_OCS_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_OCS.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_OCS_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_OCS.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_OCS.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Documento ########################################
            g_TareaAsincrona_Rellenar_DataGrid_Documento = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Documento_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Documento.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Documento_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Documento_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Documento.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Documento.WorkerSupportsCancellation = true;
            //#####################################################################################################

            //(Tarea Asincrona) Cargar Listado de Factura ########################################
            g_TareaAsincrona_Rellenar_DataGrid_Factura = new BackgroundWorker();
            g_TareaAsincrona_Rellenar_DataGrid_Factura.DoWork += new DoWorkEventHandler(TareaAsincrona_Rellenar_DataGrid_Factura_DoWork);
            g_TareaAsincrona_Rellenar_DataGrid_Factura.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Rellenar_DataGrid_Factura_ProgressChanged);
            g_TareaAsincrona_Rellenar_DataGrid_Factura.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Rellenar_DataGrid_Factura_Completed);
            g_TareaAsincrona_Rellenar_DataGrid_Factura.WorkerReportsProgress = true;
            g_TareaAsincrona_Rellenar_DataGrid_Factura.WorkerSupportsCancellation = true;
            //#####################################################################################################

            g_obj_ABS_Listado_Anticipo = new ABS_Listado_CTG_Anticipos();
            g_obj_ABS_Listado_Pago = new ABS_Listado_CTG_Pagos();
            g_obj_ABS_Listado_GastoCabecera = new ABS_Listado_CTG_GastosCabecera();
            g_obj_ABS_Listado_OCS = new ABS_Listado_CTG_OrdenComisionServiciosCabecera(g_frm_P_Expediente.P_Base_ValoresGenerales);
            g_obj_ABS_Listado_Documento = new ABS_Listado_CTG_Expedientes_Documentos();
            g_obj_ABS_Listado_Factura = new ABS_Listado_COM_FacturasCabecera_AUX_2(g_frm_P_Expediente.P_Base_ValoresGenerales, null);

            g_bol_Termino_CargaDatos_Inicial = true;
        }
        #endregion

        #region Datos Iniciales
        public void Datos_PorDefecto()
        {
            try
            {
                //ponemos la fecha de trabajo en la fecha
                g_frm_P_Expediente.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Fecha = Variables.G_DTT_FECHA_INICIAL_PORDEFECTO.ToString("dd/MM/yyyy");

                //Aqui se llamaria a contabilidad para obtener el predefinido de Expediente cuando exista
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Expediente_Controladora) + "/" + nameof(Datos_PorDefecto));
            }
            finally
            {
                g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
            }
        }
        #endregion

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

            //estado
            g_str_Estado = Variables.G_STR_ESTADO_CONTABILIDAD_ABIERTO;

            //numero
            g_frm_P_Expediente.Exferia_TextBox_Numero.Text = "";

            //descripcion
            g_frm_P_Expediente.Exferia_TextBox_Descripcion.Text = "";

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

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

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

            //observaciones
            g_frm_P_Expediente.Exferia_RichTextBox_ConBotones_Observaciones.Exferia_RichTextBox_RTF = "";

            //Anticipo ................................................................................................................................................
            g_lst_INTERNO_CTG_Anticipos_Listado_Modelo = new List<INTERNO_CTG_Anticipos_Listado_Modelo>();
            g_frm_P_Expediente.Exferia_DataGridView_Anticipo.Rows.Clear();
            g_int_TotalRegistrosInsertados_Anticipo = 0;
            g_int_TotalRegistros_Anticipo = 0;
            g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Anticipo;
            g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Anticipo;

            //Pago ................................................................................................................................................
            g_lst_INTERNO_CTG_Pagos_Listado_Modelo = new List<INTERNO_CTG_Pagos_Listado_Modelo>();
            g_frm_P_Expediente.Exferia_DataGridView_Pago.Rows.Clear();
            g_int_TotalRegistrosInsertados_Pago = 0;
            g_int_TotalRegistros_Pago = 0;
            g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Pago;
            g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Pago;

            //GastoCabecera ................................................................................................................................................
            g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo = new List<INTERNO_CTG_GastosCabecera_Listado_Modelo>();
            g_frm_P_Expediente.Exferia_DataGridView_GastoCabecera.Rows.Clear();
            g_int_TotalRegistrosInsertados_GastoCabecera = 0;
            g_int_TotalRegistros_GastoCabecera = 0;
            g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Total = g_int_TotalRegistros_GastoCabecera;
            g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_GastoCabecera;

            //OCS ................................................................................................................................................
            g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo = new List<INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo>();
            g_frm_P_Expediente.Exferia_DataGridView_OCS.Rows.Clear();
            g_int_TotalRegistrosInsertados_OCS = 0;
            g_int_TotalRegistros_OCS = 0;
            g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Total = g_int_TotalRegistros_OCS;
            g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_OCS;

            //Documento ................................................................................................................................................
            g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo = new List<INTERNO_CTG_Expedientes_Documentos_Listado_Modelo>();
            g_frm_P_Expediente.Exferia_DataGridView_Documento.Rows.Clear();
            g_int_TotalRegistrosInsertados_Documento = 0;
            g_int_TotalRegistros_Documento = 0;
            g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Documento;
            g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Documento;

            //Factura ................................................................................................................................................
            g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo = new List<INTERNO_COM_FacturasCabecera_Listado_Modelo>();
            g_frm_P_Expediente.Exferia_DataGridView_Factura.Rows.Clear();
            g_int_TotalRegistrosInsertados_Factura = 0;
            g_int_TotalRegistros_Factura = 0;
            g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Factura;
            g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Factura;


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

            g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
        }
        #endregion

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

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

                return g_bol_GrabarDatos_TerminoCorrectamente;
            }
            return true;
        }
        #endregion

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

            try
            {

                string str_CodigoSiguiente = Datos_Generales.Buscar_CodigoSiguiente_Numerico(nameof(CTG_Expedientes),
                                                                                             nameof(CTG_Expedientes.numero),
                                                                                             "",
                                                                                             g_frm_P_Expediente.P_Base_ValoresGenerales.lng_idEmpresa,
                                                                                             true,
                                                                                             g_frm_P_Expediente.Exferia_TextBox_Numero.Exferia_TextBox_MaxLength);

                if (!str_CodigoSiguiente.Equals("-1"))
                {
                    g_frm_P_Expediente.Exferia_TextBox_Numero.Text = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO(g_frm_P_Expediente.Exferia_Label_Numero.Text);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Buscar_CodigoSiguiente));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        private INTERNO_ValorDevuelto_Modelo Buscar_CodigoRepetido()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                string str_Codigo = g_frm_P_Expediente.Exferia_TextBox_Numero.Text.Trim();

                bool bol_CodigoRepetido = Datos_Generales.Buscar_CodigoRepetido(nameof(CTG_Expedientes),
                                                                                nameof(CTG_Expedientes.numero),
                                                                                str_Codigo,
                                                                                nameof(CTG_Expedientes.id),
                                                                                (g_mdl_INTERNO_CTG_Expediente_Modelo != null ? g_mdl_INTERNO_CTG_Expediente_Modelo.id : -1),
                                                                                "",
                                                                                g_frm_P_Expediente.P_Base_ValoresGenerales.lng_idEmpresa,
                                                                                true);

                if (bol_CodigoRepetido)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_REPETIDO(g_frm_P_Expediente.Exferia_Label_Numero.Text);
                }
            }
            catch (Control_Errores)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CODIGOVALIDACIONREPETIDO();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Buscar_CodigoRepetido));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CODIGOVALIDACIONREPETIDO();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #region Cargar Datos
        public void RecargarDatos()
        {
            try
            {
                //Bloquear el formulario para que no se pueda hacer nada hasta que termine
                g_frm_P_Expediente.Enabled = false;

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

                // Si la tarea asincrona esta en marcha la paro
                if (g_obj_TareaAsincrona_CargarDatos != null)
                {

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

                //Vaciar
                VaciarDatos();

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

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

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

                throw new Control_Errores(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA(), ex, nameof(P_Expediente_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_Expediente.P_Base_id) == false)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
                }
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_DoWork));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_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_Expediente.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_Expediente.Salir_P_Base();
                }
                else
                {
                    //Rellenamos el listado de Anticipo
                    Rellenar_DataGrid_Anticipos();
                    //Rellenamos el listado de Pago
                    Rellenar_DataGrid_Pagos();
                    //Rellenamos el listado de GastoCabecera
                    Rellenar_DataGrid_GastoCabecera();
                    //Rellenamos el listado de OCS
                    Rellenar_DataGrid_OCS();
                    //Rellenamos el listado de Documento
                    Rellenar_DataGrid_Documento();
                    //Rellenamos el listado de facturas
                    Rellenar_DataGrid_Facturas();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_CargarDatos_Completed));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_CARGARDATOSPANTALLA());

                g_frm_P_Expediente.Salir_P_Base();
            }
            finally
            {
                //Hacemos foco al primer control.
                g_frm_P_Expediente.Exferia_TextBox_Numero.Exferia_TextBox_Foco();
            }
        }

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

            try
            {
                g_mdl_INTERNO_CTG_Expediente_Modelo = g_obj_CTG_Expedientes_Datos.Obtener(_lng_id);

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

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

                    //nmero
                    g_frm_P_Expediente.Exferia_TextBox_Numero.Text = g_mdl_INTERNO_CTG_Expediente_Modelo.numero.ToString();

                    //descripcion
                    g_frm_P_Expediente.Exferia_TextBox_Descripcion.Text = g_mdl_INTERNO_CTG_Expediente_Modelo.descripcion != null ? g_mdl_INTERNO_CTG_Expediente_Modelo.descripcion : "";

                    //fecha
                    g_frm_P_Expediente.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Fecha = g_mdl_INTERNO_CTG_Expediente_Modelo.fecha.ToString("dd/MM/yyyy");

                    //estado
                    g_str_Estado = g_mdl_INTERNO_CTG_Expediente_Modelo.estado;

                    //observaciones
                    g_frm_P_Expediente.Exferia_RichTextBox_ConBotones_Observaciones.Exferia_RichTextBox_RTF = g_mdl_INTERNO_CTG_Expediente_Modelo.observaciones != null ? g_mdl_INTERNO_CTG_Expediente_Modelo.observaciones : "";

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

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

                    //Anticipo
                    if (g_mdl_INTERNO_CTG_Expediente_Modelo.Anticipos != null &&
                       g_mdl_INTERNO_CTG_Expediente_Modelo.Anticipos.Count > 0)
                    {
                        g_lst_INTERNO_CTG_Anticipos_Listado_Modelo = g_mdl_INTERNO_CTG_Expediente_Modelo.Anticipos;
                    }

                    //Pago
                    if (g_mdl_INTERNO_CTG_Expediente_Modelo.Pagos != null &&
                       g_mdl_INTERNO_CTG_Expediente_Modelo.Pagos.Count > 0)
                    {
                        g_lst_INTERNO_CTG_Pagos_Listado_Modelo = g_mdl_INTERNO_CTG_Expediente_Modelo.Pagos;
                    }

                    //GastoCabecera
                    if (g_mdl_INTERNO_CTG_Expediente_Modelo.GastosCabecera != null &&
                       g_mdl_INTERNO_CTG_Expediente_Modelo.GastosCabecera.Count > 0)
                    {
                        g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo = g_mdl_INTERNO_CTG_Expediente_Modelo.GastosCabecera;
                    }

                    //OCS
                    if (g_mdl_INTERNO_CTG_Expediente_Modelo.OrdenesComisionesServicios != null &&
                       g_mdl_INTERNO_CTG_Expediente_Modelo.OrdenesComisionesServicios.Count > 0)
                    {
                        g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo = g_mdl_INTERNO_CTG_Expediente_Modelo.OrdenesComisionesServicios;
                    }

                    //Documento
                    if (g_mdl_INTERNO_CTG_Expediente_Modelo.Documentos != null &&
                       g_mdl_INTERNO_CTG_Expediente_Modelo.Documentos.Count > 0)
                    {
                        g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo = g_mdl_INTERNO_CTG_Expediente_Modelo.Documentos;
                    }

                    //Facturas
                    if (g_mdl_INTERNO_CTG_Expediente_Modelo.FacturasCabecera != null &&
                       g_mdl_INTERNO_CTG_Expediente_Modelo.FacturasCabecera.Count > 0)
                    {
                        g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo = g_mdl_INTERNO_CTG_Expediente_Modelo.FacturasCabecera;
                    }

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

                        dynamic dnm_Objeto = g_mdl_INTERNO_CTG_Expediente_Modelo;
                        foreach (string str_campo in arr_Campos)
                        {
                            var Valor = dnm_Objeto.GetType().GetProperty(str_campo).GetValue(dnm_Objeto, null);
                            if (Valor != null)
                            {
                                str_ValorAMostrarFinal += " " + Valor;
                            }

                            // fecha
                            if (str_campo.Equals(nameof(g_mdl_INTERNO_CTG_Expediente_Modelo.numero)))
                            {
                                str_MenuSuperior_Codigo = g_mdl_INTERNO_CTG_Expediente_Modelo.numero.ToString("dd/MM/yyyy");
                            }
                        }
                        if (str_ValorAMostrarFinal != "")
                        {
                            g_frm_P_Expediente.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_Expediente.Tag.ToString(), str_MenuSuperior_Codigo);
                    //#################################################################################################

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

            return bol_ValorDevuelto;
        }
        #endregion

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

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(GrabarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_GrabarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

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

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_GrabarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            finally
            {
                e.Result = mdl_ValorDevuelto_Modelo;
            }
        }
        private void TareaAsincrona_GrabarDatos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Expediente.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_Expediente, mdl_ValorDevuelto_Modelo_Resultado.Objeto);
                        }
                    }

                    g_bol_GrabarDatos_TerminoCorrectamente = false;
                }
                else
                {
                    // Devolver al Listado el Row Añadido/Modificado
                    if (g_frm_P_Expediente.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Expediente.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Expediente.P_Base_F3Origen != null)
                    {
                        g_frm_P_Expediente.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

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

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

            try
            {
                //Si el Numero esta vacio y se intenta buscar el ultimo numerico
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    if (g_frm_P_Expediente.Exferia_TextBox_Numero.Text.Trim().Length == 0)
                    {
                        INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = Buscar_CodigoSiguiente();

                        if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                        {
                            mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo.Mensaje;
                            mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Expediente.Exferia_TextBox_Numero;
                        }
                    }
                }

                // Numero de docmento no puede estar Repetido
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = Buscar_CodigoRepetido();

                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto == false)
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = mdl_INTERNO_ValorDevuelto_Modelo.Mensaje;
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Expediente.Exferia_TextBox_Numero;
                    }
                }

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

                    if (int_fechaAlta_Respuesta == 1)//Vacia
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_VACIO(g_frm_P_Expediente.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Expediente.Exferia_FechaSeleccion_fecha;
                    }
                    else if (int_fechaAlta_Respuesta == 2)//Incorrecta
                    {
                        mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                        mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_FECHA_INCORRECTA(g_frm_P_Expediente.Exferia_FechaSeleccion_fecha.Exferia_FechaSeleccion_Descripcion);
                        mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Expediente.Exferia_FechaSeleccion_fecha;
                    }
                }

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

                // Si hay Empleado_Autorizado validar que es Correcta
                if (mdl_ValorDevuelto_Modelo.TodoCorrecto && (g_frm_P_Expediente.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Codigo.Trim().Length != 0 ||
                    g_frm_P_Expediente.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Descripcion.Trim().Length != 0) && g_frm_P_Expediente.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Id == -1)
                {
                    mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_F3_INCORRECTO(g_frm_P_Expediente.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_Titulo);
                    mdl_ValorDevuelto_Modelo.Objeto = g_frm_P_Expediente.Exferia_F3_SoloSeleccion_Empleado_Autorizado.Exferia_F3_SoloSeleccion_PRINCIPAL_TextBox_Codigo;
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_VALIDARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(ValidarDatos));

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

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

            try
            {
                CTG_Expedientes mdl_CTG_Expedientes = new CTG_Expedientes();
                mdl_CTG_Expedientes.id = g_mdl_INTERNO_CTG_Expediente_Modelo != null ? g_mdl_INTERNO_CTG_Expediente_Modelo.id : -1;

                //numero
                mdl_CTG_Expedientes.numero = Convert.ToInt64(g_frm_P_Expediente.Exferia_TextBox_Numero.Text);

                //descripcion
                mdl_CTG_Expedientes.descripcion = g_frm_P_Expediente.Exferia_TextBox_Descripcion.Text;

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

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

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

                //observaciones
                mdl_CTG_Expedientes.observaciones = g_frm_P_Expediente.Exferia_RichTextBox_ConBotones_Observaciones.Exferia_RichTextBox_RTF;

                //estado
                mdl_CTG_Expedientes.estado = g_str_Estado;

                // Se graba el modelo ya relleno
                mdl_ValorDevuelto_Modelo = g_obj_CTG_Expedientes_Datos.Grabar(mdl_CTG_Expedientes);

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

                    //Obtener el modelo que se acaba de grabar
                    g_mdl_INTERNO_CTG_Expediente_Modelo = g_obj_CTG_Expedientes_Datos.Obtener(lng_idExpediente);

                    g_frm_P_Expediente.P_Base_id = lng_idExpediente;

                    //se desbloquea el boton de borrar
                    g_frm_P_Expediente.Exferia_Button_Borrar.Enabled = true;
                }
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(GrabarDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_GRABARDATOSPANTALLA();
            }
            return mdl_ValorDevuelto_Modelo;
        }

        #endregion

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(BorrarDatos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                // Borrar 
                mdl_ValorDevuelto_Modelo = BorrarDatos_Final();
            }
            catch (ThreadAbortException ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_DoWork));

                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_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_Expediente.Enabled = true;

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

                //Mostrar si tuviera algun mensaje
                if (mdl_ValorDevuelto_Modelo_Resultado.TodoCorrecto == false)
                {
                    if (mdl_ValorDevuelto_Modelo_Resultado.Mensaje.Trim().Length > 0)
                    {
                        Mensajes.MostrarMensaje(mdl_ValorDevuelto_Modelo_Resultado.Mensaje);
                    }
                }
                else
                {
                    // Devolver al Listado el Row Borrar
                    if (g_frm_P_Expediente.P_Base_PantallaOrigen != null)
                    {
                        g_frm_P_Expediente.P_Base_PantallaOrigen.P_Base_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }
                    else if (g_frm_P_Expediente.P_Base_F3Origen != null)
                    {
                        g_frm_P_Expediente.P_Base_F3Origen.Exferia_F3_ActualizarRegistro(mdl_ValorDevuelto_Modelo_Resultado.Id, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);
                    }

                    g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
                    g_frm_P_Expediente.Salir_P_Base();
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Completed));
            }
        }
        private INTERNO_ValorDevuelto_Modelo BorrarDatos_Final()
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            try
            {
                mdl_ValorDevuelto_Modelo = g_obj_CTG_Expedientes_Datos.Borrar(g_mdl_INTERNO_CTG_Expediente_Modelo != null ? g_mdl_INTERNO_CTG_Expediente_Modelo.id : -1);

                return mdl_ValorDevuelto_Modelo;
            }
            catch (Control_Errores)
            {
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(BorrarDatos_Final));
                mdl_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

        #region Anticipo

        #region Rellenar DataGrid de Anticipo
        public void Rellenar_DataGrid_Anticipos()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Anticipo.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Anticipo.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Expediente.Exferia_DataGridView_Anticipo.Rows.Clear();
                g_int_TotalRegistrosInsertados_Anticipo = 0;
                g_int_TotalRegistros_Anticipo = 0;
                g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Anticipo;
                g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Anticipo;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Anticipo.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Expediente_Controladora) + "/" + nameof(Rellenar_DataGrid_Anticipos));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Anticipo_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CTG_Anticipos_Listado_Modelo> lst_INTERNO_CTG_Anticipos_Listado_Modelo = Filtrar_Anticipos();

                if (lst_INTERNO_CTG_Anticipos_Listado_Modelo != null && lst_INTERNO_CTG_Anticipos_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_Anticipo = lst_INTERNO_CTG_Anticipos_Listado_Modelo.Count();

                    foreach (INTERNO_CTG_Anticipos_Listado_Modelo mdl_INTERNO_CTG_Anticipos_Listado_Modelo in lst_INTERNO_CTG_Anticipos_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_Anticipo += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Anticipo(mdl_INTERNO_CTG_Anticipos_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Anticipo_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Anticipo al DataGrid
                g_frm_P_Expediente.Exferia_DataGridView_Anticipo.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Anticipo;
                g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Anticipo;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Anticipo_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Expediente.Anticipos_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Anticipo(INTERNO_CTG_Anticipos_Listado_Modelo _mdl_INTERNO_CTG_Anticipos_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Expediente.Exferia_DataGridView_Anticipo.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Expediente.Exferia_DataGridView_Anticipo);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Anticipo)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CTG_Anticipos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Anticipos_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CTG_Anticipos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Anticipos_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_CTG_Anticipos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Anticipos_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_CTG_Anticipos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Anticipos_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_CTG_Anticipos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Anticipos_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                {
                    TimeSpan? tms_valor = (TimeSpan?)_mdl_INTERNO_CTG_Anticipos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Anticipos_Listado_Modelo, null);
                    if (tms_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = tms_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CTG_Anticipos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Anticipos_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CTG_Anticipos_Listado_Modelo> Filtrar_Anticipos()
        {
            //Filtros Avanzados
            if (g_dct_ListadoFiltros_Anticipo != null && g_dct_ListadoFiltros_Anticipo.Count > 0)
            {
                return g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CTG_Anticipos_Listado_Modelo>(g_dct_ListadoFiltros_Anticipo, g_obj_ABS_Listado_Anticipo)).ToList();
            }
            else
            {
                return g_lst_INTERNO_CTG_Anticipos_Listado_Modelo;
            }
        }
        #endregion

        public void Anticipos_Actualizar_Registro(long _lng_idAnticipo, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_CTG_Anticipos_Listado_Modelo mdl_INTERNO_CTG_Anticipos_Listado_Modelo = g_obj_CTG_Anticipos_Datos.Obtener_ParaListado(_lng_idAnticipo);

                if (mdl_INTERNO_CTG_Anticipos_Listado_Modelo != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_INTERNO_CTG_Anticipos_Listado_Modelo != null && g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Count > 0)
                    {
                        INTERNO_CTG_Anticipos_Listado_Modelo mdl_INTERNO_CTG_Anticipos_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Where(m => m.id.Equals(mdl_INTERNO_CTG_Anticipos_Listado_Modelo.id)).FirstOrDefault();
                        if (mdl_INTERNO_CTG_Anticipos_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_INTERNO_CTG_Anticipos_Listado_Modelo[g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.FindIndex(m => m.id.Equals(mdl_INTERNO_CTG_Anticipos_Listado_Modelo.id))] = mdl_INTERNO_CTG_Anticipos_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Add(mdl_INTERNO_CTG_Anticipos_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_INTERNO_CTG_Anticipos_Listado_Modelo == null)
                        {
                            g_lst_INTERNO_CTG_Anticipos_Listado_Modelo = new List<INTERNO_CTG_Anticipos_Listado_Modelo>();
                        }

                        g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Add(mdl_INTERNO_CTG_Anticipos_Listado_Modelo);
                    }
                }

                //Actualizar el DataGridView #####################################################################################
                //Modificar
                if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                {
                    DataGridViewRow row = g_frm_P_Expediente.Exferia_DataGridView_Anticipo.Rows
                               .Cast<DataGridViewRow>()
                               .Where(r => r.Cells[nameof(INTERNO_CTG_Anticipos_Listado_Modelo.id)].Value.Equals(_lng_idAnticipo)).FirstOrDefault();

                    if (row != null)//Modificada
                    {
                        //Actualizar el Grid
                        Transformar_Modelo_A_Row_Anticipo(mdl_INTERNO_CTG_Anticipos_Listado_Modelo, row);

                        //Ordenar Listado
                        g_frm_P_Expediente.Anticipos_Ordenar_DataGridView();
                    }
                }
                //Insertar
                else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                {
                    g_frm_P_Expediente.Exferia_DataGridView_Anticipo.Rows.Add(Transformar_Modelo_A_Row_Anticipo(mdl_INTERNO_CTG_Anticipos_Listado_Modelo, null));

                    //Ordenar Listado
                    g_frm_P_Expediente.Anticipos_Ordenar_DataGridView();
                }

                //Sumar Cantidad de Anticipo Borradas
                g_int_TotalRegistros_Anticipo += 1;
                g_int_TotalRegistrosInsertados_Anticipo += 1;

                g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Anticipo;
                g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Anticipo;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Anticipos_Actualizar_Registro));
            }
        }
        public void Anticipos_Borrar_Registro(List<long> _lst_idAnticipo)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_CTG_Anticipos_Listado_Modelo != null && g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_CTG_Anticipos_Listado_Modelo> lst_INTERNO_CTG_Anticipos_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Where(m => _lst_idAnticipo.Contains(m.id)).ToList();
                    if (lst_INTERNO_CTG_Anticipos_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_CTG_Anticipos_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_CTG_Anticipos_Listado_Modelo mdl_INTERNO_CTG_Anticipos_Listado_Modelo in lst_INTERNO_CTG_Anticipos_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Remove(mdl_INTERNO_CTG_Anticipos_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Expediente.Exferia_DataGridView_Anticipo.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idAnticipo.Contains(long.Parse(r.Cells[nameof(INTERNO_CTG_Anticipos_Listado_Modelo.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_Expediente.Exferia_DataGridView_Anticipo.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Anticipo Borradas
                g_int_TotalRegistros_Anticipo = g_int_TotalRegistrosInsertados_Anticipo - _lst_idAnticipo.Count();
                g_int_TotalRegistrosInsertados_Anticipo -= _lst_idAnticipo.Count();

                g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Anticipo;
                g_frm_P_Expediente.Exferia_BarraProgreso_Anticipo.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Anticipo;

                g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Anticipos_Borrar_Registro));
            }
        }

        #region Borrar Datos Anticipos
        public void BorrarDatos_Anticipos(List<long> _lst_idAnticipo)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Expediente.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idAnticipo);

                    g_obj_TareaAsincrona_BorrarDatos_Anticipo = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_Anticipo.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_Anticipos_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_Anticipo.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Anticipos_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_Anticipo.RunWorkerAsync(lst_Argumentos);

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(BorrarDatos_Anticipos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_Anticipos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idAnticipos = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = g_obj_CTG_Anticipos_Datos.Borrar(lst_idAnticipos);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idAnticipos;
                        mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Anticipos_DoWork));

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

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Anticipos_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_Anticipos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Expediente.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(Variables.G_STR_OPCION_CTG_ANTICIPOS);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_Expediente.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Anticipos_Completed));
            }
        }
        #endregion

        #endregion

        #region Pago

        #region Rellenar DataGrid de Pago
        public void Rellenar_DataGrid_Pagos()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Pago.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Pago.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Expediente.Exferia_DataGridView_Pago.Rows.Clear();
                g_int_TotalRegistrosInsertados_Pago = 0;
                g_int_TotalRegistros_Pago = 0;
                g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Pago;
                g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Pago;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Pago.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Expediente_Controladora) + "/" + nameof(Rellenar_DataGrid_Pagos));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Pago_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CTG_Pagos_Listado_Modelo> lst_INTERNO_CTG_Pagos_Listado_Modelo = Filtrar_Pagos();

                if (lst_INTERNO_CTG_Pagos_Listado_Modelo != null && lst_INTERNO_CTG_Pagos_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_Pago = lst_INTERNO_CTG_Pagos_Listado_Modelo.Count();

                    foreach (INTERNO_CTG_Pagos_Listado_Modelo mdl_INTERNO_CTG_Pagos_Listado_Modelo in lst_INTERNO_CTG_Pagos_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_Pago += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Pago(mdl_INTERNO_CTG_Pagos_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Pago_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Pago al DataGrid
                g_frm_P_Expediente.Exferia_DataGridView_Pago.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Pago;
                g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Pago;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Pago_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Expediente.Pagos_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Pago(INTERNO_CTG_Pagos_Listado_Modelo _mdl_INTERNO_CTG_Pagos_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Expediente.Exferia_DataGridView_Pago.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Expediente.Exferia_DataGridView_Pago);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Pago)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CTG_Pagos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Pagos_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CTG_Pagos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Pagos_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_CTG_Pagos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Pagos_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_CTG_Pagos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Pagos_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_CTG_Pagos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Pagos_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                {
                    TimeSpan? tms_valor = (TimeSpan?)_mdl_INTERNO_CTG_Pagos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Pagos_Listado_Modelo, null);
                    if (tms_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = tms_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CTG_Pagos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Pagos_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CTG_Pagos_Listado_Modelo> Filtrar_Pagos()
        {
            //Filtros Avanzados
            if (g_dct_ListadoFiltros_Pago != null && g_dct_ListadoFiltros_Pago.Count > 0)
            {
                return g_lst_INTERNO_CTG_Pagos_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CTG_Pagos_Listado_Modelo>(g_dct_ListadoFiltros_Pago, g_obj_ABS_Listado_Pago)).ToList();
            }
            else
            {
                return g_lst_INTERNO_CTG_Pagos_Listado_Modelo;
            }
        }
        #endregion

        public void Pagos_Actualizar_Registro(long _lng_idPago, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_CTG_Pagos_Listado_Modelo mdl_INTERNO_CTG_Pagos_Listado_Modelo = g_obj_CTG_Pagos_Datos.Obtener_ParaListado(_lng_idPago);

                if (mdl_INTERNO_CTG_Pagos_Listado_Modelo != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_INTERNO_CTG_Pagos_Listado_Modelo != null && g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Count > 0)
                    {
                        INTERNO_CTG_Pagos_Listado_Modelo mdl_INTERNO_CTG_Pagos_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Where(m => m.id.Equals(mdl_INTERNO_CTG_Pagos_Listado_Modelo.id)).FirstOrDefault();
                        if (mdl_INTERNO_CTG_Pagos_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_INTERNO_CTG_Pagos_Listado_Modelo[g_lst_INTERNO_CTG_Pagos_Listado_Modelo.FindIndex(m => m.id.Equals(mdl_INTERNO_CTG_Pagos_Listado_Modelo.id))] = mdl_INTERNO_CTG_Pagos_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Add(mdl_INTERNO_CTG_Pagos_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_INTERNO_CTG_Pagos_Listado_Modelo == null)
                        {
                            g_lst_INTERNO_CTG_Pagos_Listado_Modelo = new List<INTERNO_CTG_Pagos_Listado_Modelo>();
                        }

                        g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Add(mdl_INTERNO_CTG_Pagos_Listado_Modelo);
                    }
                }

                //Actualizar el DataGridView #####################################################################################
                //Modificar
                if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                {
                    DataGridViewRow row = g_frm_P_Expediente.Exferia_DataGridView_Pago.Rows
                               .Cast<DataGridViewRow>()
                               .Where(r => r.Cells[nameof(INTERNO_CTG_Pagos_Listado_Modelo.id)].Value.Equals(_lng_idPago)).FirstOrDefault();

                    if (row != null)//Modificada
                    {
                        //Actualizar el Grid
                        Transformar_Modelo_A_Row_Pago(mdl_INTERNO_CTG_Pagos_Listado_Modelo, row);

                        //Ordenar Listado
                        g_frm_P_Expediente.Pagos_Ordenar_DataGridView();
                    }
                }
                //Insertar
                else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                {
                    g_frm_P_Expediente.Exferia_DataGridView_Pago.Rows.Add(Transformar_Modelo_A_Row_Pago(mdl_INTERNO_CTG_Pagos_Listado_Modelo, null));

                    //Ordenar Listado
                    g_frm_P_Expediente.Pagos_Ordenar_DataGridView();
                }

                //Sumar Cantidad de Pago Borradas
                g_int_TotalRegistros_Pago += 1;
                g_int_TotalRegistrosInsertados_Pago += 1;

                g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Pago;
                g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Pago;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Pagos_Actualizar_Registro));
            }
        }
        public void Pagos_Borrar_Registro(List<long> _lst_idPago)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_CTG_Pagos_Listado_Modelo != null && g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_CTG_Pagos_Listado_Modelo> lst_INTERNO_CTG_Pagos_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Where(m => _lst_idPago.Contains(m.id)).ToList();
                    if (lst_INTERNO_CTG_Pagos_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_CTG_Pagos_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_CTG_Pagos_Listado_Modelo mdl_INTERNO_CTG_Pagos_Listado_Modelo in lst_INTERNO_CTG_Pagos_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Remove(mdl_INTERNO_CTG_Pagos_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Expediente.Exferia_DataGridView_Pago.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idPago.Contains(long.Parse(r.Cells[nameof(INTERNO_CTG_Pagos_Listado_Modelo.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_Expediente.Exferia_DataGridView_Pago.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Pago Borradas
                g_int_TotalRegistros_Pago = g_int_TotalRegistrosInsertados_Pago - _lst_idPago.Count();
                g_int_TotalRegistrosInsertados_Pago -= _lst_idPago.Count();

                g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Pago;
                g_frm_P_Expediente.Exferia_BarraProgreso_Pago.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Pago;

                g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Pagos_Borrar_Registro));
            }
        }

        #region Borrar Datos Pagos
        public void BorrarDatos_Pagos(List<long> _lst_idPago)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Expediente.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idPago);

                    g_obj_TareaAsincrona_BorrarDatos_Pago = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_Pago.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_Pagos_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_Pago.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Pagos_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_Pago.RunWorkerAsync(lst_Argumentos);

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(BorrarDatos_Pagos));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_Pagos_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idPagos = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = g_obj_CTG_Pagos_Datos.Borrar(lst_idPagos);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idPagos;
                        mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Pagos_DoWork));

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

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Pagos_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_Pagos_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Expediente.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(Variables.G_STR_OPCION_CTG_PAGOS);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_Expediente.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Pagos_Completed));
            }
        }
        #endregion

        #endregion

        #region GastoCabecera

        #region Rellenar DataGrid de GastoCabecera
        public void Rellenar_DataGrid_GastoCabecera()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Expediente.Exferia_DataGridView_GastoCabecera.Rows.Clear();
                g_int_TotalRegistrosInsertados_GastoCabecera = 0;
                g_int_TotalRegistros_GastoCabecera = 0;
                g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Total = g_int_TotalRegistros_GastoCabecera;
                g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_GastoCabecera;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_GastoCabecera.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Expediente_Controladora) + "/" + nameof(Rellenar_DataGrid_GastoCabecera));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_GastoCabecera_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CTG_GastosCabecera_Listado_Modelo> lst_INTERNO_CTG_GastosCabecera_Listado_Modelo = Filtrar_GastoCabecera();

                if (lst_INTERNO_CTG_GastosCabecera_Listado_Modelo != null && lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_GastoCabecera = lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.Count();

                    foreach (INTERNO_CTG_GastosCabecera_Listado_Modelo mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo in lst_INTERNO_CTG_GastosCabecera_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_GastoCabecera += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_GastoCabecera(mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_GastoCabecera_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir GastoCabecera al DataGrid
                g_frm_P_Expediente.Exferia_DataGridView_GastoCabecera.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Total = g_int_TotalRegistros_GastoCabecera;
                g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_GastoCabecera;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_GastoCabecera_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Expediente.GastoCabecera_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_GastoCabecera(INTERNO_CTG_GastosCabecera_Listado_Modelo _mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Expediente.Exferia_DataGridView_GastoCabecera.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Expediente.Exferia_DataGridView_GastoCabecera);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_GastoCabecera)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                {
                    TimeSpan? tms_valor = (TimeSpan?)_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, null);
                    if (tms_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = tms_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CTG_GastosCabecera_Listado_Modelo> Filtrar_GastoCabecera()
        {
            //Filtros Avanzados
            if (g_dct_ListadoFiltros_GastoCabecera != null && g_dct_ListadoFiltros_GastoCabecera.Count > 0)
            {
                return g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CTG_GastosCabecera_Listado_Modelo>(g_dct_ListadoFiltros_GastoCabecera, g_obj_ABS_Listado_GastoCabecera)).ToList();
            }
            else
            {
                return g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo;
            }
        }
        #endregion

        public void GastoCabecera_Actualizar_Registro(long _lng_idGastoCabecera, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_CTG_GastosCabecera_Listado_Modelo mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo = g_obj_CTG_GastosCabecera_Datos.Obtener_ParaListado(_lng_idGastoCabecera);

                if (mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo != null && g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.Count > 0)
                    {
                        INTERNO_CTG_GastosCabecera_Listado_Modelo mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.Where(m => m.id.Equals(mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo.id)).FirstOrDefault();
                        if (mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo[g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.FindIndex(m => m.id.Equals(mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo.id))] = mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.Add(mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo == null)
                        {
                            g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo = new List<INTERNO_CTG_GastosCabecera_Listado_Modelo>();
                        }

                        g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.Add(mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo);
                    }
                }

                //Actualizar el DataGridView #####################################################################################
                //Modificar
                if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                {
                    DataGridViewRow row = g_frm_P_Expediente.Exferia_DataGridView_GastoCabecera.Rows
                               .Cast<DataGridViewRow>()
                               .Where(r => r.Cells[nameof(INTERNO_CTG_GastosCabecera_Listado_Modelo.id)].Value.Equals(_lng_idGastoCabecera)).FirstOrDefault();

                    if (row != null)//Modificada
                    {
                        //Actualizar el Grid
                        Transformar_Modelo_A_Row_GastoCabecera(mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, row);

                        //Ordenar Listado
                        g_frm_P_Expediente.GastoCabecera_Ordenar_DataGridView();
                    }
                }
                //Insertar
                else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                {
                    g_frm_P_Expediente.Exferia_DataGridView_GastoCabecera.Rows.Add(Transformar_Modelo_A_Row_GastoCabecera(mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo, null));

                    //Ordenar Listado
                    g_frm_P_Expediente.GastoCabecera_Ordenar_DataGridView();
                }

                //Sumar Cantidad de GastoCabecera Borradas
                g_int_TotalRegistros_GastoCabecera += 1;
                g_int_TotalRegistrosInsertados_GastoCabecera += 1;

                g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_GastoCabecera;
                g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_GastoCabecera;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(GastoCabecera_Actualizar_Registro));
            }
        }
        public void GastoCabecera_Borrar_Registro(List<long> _lst_idGastoCabecera)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo != null && g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_CTG_GastosCabecera_Listado_Modelo> lst_INTERNO_CTG_GastosCabecera_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.Where(m => _lst_idGastoCabecera.Contains(m.id)).ToList();
                    if (lst_INTERNO_CTG_GastosCabecera_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_CTG_GastosCabecera_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_CTG_GastosCabecera_Listado_Modelo mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo in lst_INTERNO_CTG_GastosCabecera_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_CTG_GastosCabecera_Listado_Modelo.Remove(mdl_INTERNO_CTG_GastosCabecera_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Expediente.Exferia_DataGridView_GastoCabecera.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idGastoCabecera.Contains(long.Parse(r.Cells[nameof(INTERNO_CTG_GastosCabecera_Listado_Modelo.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_Expediente.Exferia_DataGridView_GastoCabecera.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de GastoCabecera Borradas
                g_int_TotalRegistros_GastoCabecera = g_int_TotalRegistrosInsertados_GastoCabecera - _lst_idGastoCabecera.Count();
                g_int_TotalRegistrosInsertados_GastoCabecera -= _lst_idGastoCabecera.Count();

                g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_GastoCabecera;
                g_frm_P_Expediente.Exferia_BarraProgreso_GastoCabecera.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_GastoCabecera;

                g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(GastoCabecera_Borrar_Registro));
            }
        }

        #region Borrar Datos GastoCabecera
        public void BorrarDatos_GastoCabecera(List<long> _lst_idGastoCabecera)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Expediente.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idGastoCabecera);

                    g_obj_TareaAsincrona_BorrarDatos_GastoCabecera = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_GastoCabecera.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_GastoCabecera_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_GastoCabecera.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_GastoCabecera_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_GastoCabecera.RunWorkerAsync(lst_Argumentos);

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(BorrarDatos_GastoCabecera));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_GastoCabecera_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idGastoCabecera = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = g_obj_CTG_GastosCabecera_Datos.Borrar(lst_idGastoCabecera);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idGastoCabecera;
                        mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_GastoCabecera_DoWork));

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

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_GastoCabecera_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_GastoCabecera_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Expediente.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(Variables.G_STR_OPCION_CTG_GASTOSCABECERA);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_Expediente.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_GastoCabecera_Completed));
            }
        }
        #endregion

        #endregion

        #region OrdenComisionServicio

        #region Rellenar DataGrid de OCS
        public void Rellenar_DataGrid_OCS()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_OCS.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_OCS.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Expediente.Exferia_DataGridView_OCS.Rows.Clear();
                g_int_TotalRegistrosInsertados_OCS = 0;
                g_int_TotalRegistros_OCS = 0;
                g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Total = g_int_TotalRegistros_OCS;
                g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_OCS;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_OCS.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Expediente_Controladora) + "/" + nameof(Rellenar_DataGrid_OCS));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_OCS_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo> lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo = Filtrar_OCS();

                if (lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo != null && lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_OCS = lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Count();

                    foreach (INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo in lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_OCS += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_OCS(mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_OCS_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir OCS al DataGrid
                g_frm_P_Expediente.Exferia_DataGridView_OCS.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Total = g_int_TotalRegistros_OCS;
                g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_OCS;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_OCS_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Expediente.OCS_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_OCS(INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo _mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Expediente.Exferia_DataGridView_OCS.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Expediente.Exferia_DataGridView_OCS);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_OCS)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                {
                    TimeSpan? tms_valor = (TimeSpan?)_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, null);
                    if (tms_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = tms_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo> Filtrar_OCS()
        {
            //Filtros Avanzados
            if (g_dct_ListadoFiltros_OCS != null && g_dct_ListadoFiltros_OCS.Count > 0)
            {
                return g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo>(g_dct_ListadoFiltros_OCS, g_obj_ABS_Listado_OCS)).ToList();
            }
            else
            {
                return g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo;
            }
        }
        #endregion

        public void OCS_Actualizar_Registro(long _lng_idOCS, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo = g_obj_CTG_OrdenComisionServiciosCabecera_Datos.Obtener_ParaListado(_lng_idOCS);

                if (mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo != null && g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Count > 0)
                    {
                        INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Where(m => m.id.Equals(mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.id)).FirstOrDefault();
                        if (mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo[g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.FindIndex(m => m.id.Equals(mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.id))] = mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Add(mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo == null)
                        {
                            g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo = new List<INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo>();
                        }

                        g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Add(mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo);
                    }
                }

                //Actualizar el DataGridView #####################################################################################
                //Modificar
                if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                {
                    DataGridViewRow row = g_frm_P_Expediente.Exferia_DataGridView_OCS.Rows
                               .Cast<DataGridViewRow>()
                               .Where(r => r.Cells[nameof(INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.id)].Value.Equals(_lng_idOCS)).FirstOrDefault();

                    if (row != null)//Modificada
                    {
                        //Actualizar el Grid
                        Transformar_Modelo_A_Row_OCS(mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, row);

                        //Ordenar Listado
                        g_frm_P_Expediente.OCS_Ordenar_DataGridView();
                    }
                }
                //Insertar
                else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                {
                    g_frm_P_Expediente.Exferia_DataGridView_OCS.Rows.Add(Transformar_Modelo_A_Row_OCS(mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo, null));

                    //Ordenar Listado
                    g_frm_P_Expediente.OCS_Ordenar_DataGridView();
                }

                //Sumar Cantidad de OCS Borradas
                g_int_TotalRegistros_OCS += 1;
                g_int_TotalRegistrosInsertados_OCS += 1;

                g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_OCS;
                g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_OCS;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(OCS_Actualizar_Registro));
            }
        }
        public void OCS_Borrar_Registro(List<long> _lst_idOCS)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo != null && g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo> lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Where(m => _lst_idOCS.Contains(m.id)).ToList();
                    if (lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo in lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Remove(mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Expediente.Exferia_DataGridView_OCS.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idOCS.Contains(long.Parse(r.Cells[nameof(INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_Expediente.Exferia_DataGridView_OCS.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de OCS Borradas
                g_int_TotalRegistros_OCS = g_int_TotalRegistrosInsertados_OCS - _lst_idOCS.Count();
                g_int_TotalRegistrosInsertados_OCS -= _lst_idOCS.Count();

                g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_OCS;
                g_frm_P_Expediente.Exferia_BarraProgreso_OCS.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_OCS;

                g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(OCS_Borrar_Registro));
            }
        }

        #region Borrar Datos OCS
        public void BorrarDatos_OCS(List<long> _lst_idOCS)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Expediente.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idOCS);

                    g_obj_TareaAsincrona_BorrarDatos_OCS = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_OCS.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_OCS_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_OCS.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_OCS_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_OCS.RunWorkerAsync(lst_Argumentos);

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(BorrarDatos_OCS));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_OCS_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idOCS = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = g_obj_CTG_OrdenComisionServiciosCabecera_Datos.Borrar(lst_idOCS);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idOCS;
                        mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_OCS_DoWork));

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

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_OCS_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_OCS_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Expediente.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(Variables.G_STR_OPCION_CTG_ORDENCOMISIONSERVICIOSCABECERA);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_Expediente.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_OCS_Completed));
            }
        }
        #endregion

        #endregion

        #region Documento

        #region Rellenar DataGrid de Documento
        public void Rellenar_DataGrid_Documento()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Documento.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Documento.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Expediente.Exferia_DataGridView_Documento.Rows.Clear();
                g_int_TotalRegistrosInsertados_Documento = 0;
                g_int_TotalRegistros_Documento = 0;
                g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Documento;
                g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Documento;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Documento.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Expediente_Controladora) + "/" + nameof(Rellenar_DataGrid_Documento));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Documento_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_CTG_Expedientes_Documentos_Listado_Modelo> lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo = Filtrar_Documento();

                if (lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo != null && lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_Documento = lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.Count();

                    foreach (INTERNO_CTG_Expedientes_Documentos_Listado_Modelo mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo in lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_Documento += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Documento(mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Documento_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Docuemnto al DataGrid
                g_frm_P_Expediente.Exferia_DataGridView_Documento.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Documento;
                g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Documento;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Documento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Expediente.Documento_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Documento(INTERNO_CTG_Expedientes_Documentos_Listado_Modelo _mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Expediente.Exferia_DataGridView_Documento.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Expediente.Exferia_DataGridView_Documento);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Documento)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                {
                    TimeSpan? tms_valor = (TimeSpan?)_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, null);
                    if (tms_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = tms_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_CTG_Expedientes_Documentos_Listado_Modelo> Filtrar_Documento()
        {
            //Filtros Avanzados
            if (g_dct_ListadoFiltros_Documento != null && g_dct_ListadoFiltros_Documento.Count > 0)
            {
                return g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_CTG_Expedientes_Documentos_Listado_Modelo>(g_dct_ListadoFiltros_Documento, g_obj_ABS_Listado_Documento)).ToList();
            }
            else
            {
                return g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo;
            }
        }
        #endregion

        public void Documento_Actualizar_Registro(long _lng_idDocumento, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos
                INTERNO_CTG_Expedientes_Documentos_Listado_Modelo mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo = g_obj_CTG_Expedientes_Documentos_Datos.Obtener_ParaListado(_lng_idDocumento);

                if (mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo != null && g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.Count > 0)
                    {
                        INTERNO_CTG_Expedientes_Documentos_Listado_Modelo mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.Where(m => m.id.Equals(mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.id)).FirstOrDefault();
                        if (mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo[g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.FindIndex(m => m.id.Equals(mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.id))] = mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.Add(mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo == null)
                        {
                            g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo = new List<INTERNO_CTG_Expedientes_Documentos_Listado_Modelo>();
                        }

                        g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.Add(mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo);
                    }
                }

                //Actualizar el DataGridView #####################################################################################
                //Modificar
                if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                {
                    DataGridViewRow row = g_frm_P_Expediente.Exferia_DataGridView_Documento.Rows
                               .Cast<DataGridViewRow>()
                               .Where(r => r.Cells[nameof(INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.id)].Value.Equals(_lng_idDocumento)).FirstOrDefault();

                    if (row != null)//Modificada
                    {
                        //Actualizar el Grid
                        Transformar_Modelo_A_Row_Documento(mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, row);

                        //Ordenar Listado
                        g_frm_P_Expediente.Documento_Ordenar_DataGridView();
                    }
                }
                //Insertar
                else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                {
                    g_frm_P_Expediente.Exferia_DataGridView_Documento.Rows.Add(Transformar_Modelo_A_Row_Documento(mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo, null));

                    //Ordenar Listado
                    g_frm_P_Expediente.Documento_Ordenar_DataGridView();
                }

                //Sumar Cantidad de Documento Borradas
                g_int_TotalRegistros_Documento += 1;
                g_int_TotalRegistrosInsertados_Documento += 1;

                g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Documento;
                g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Documento;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Documento_Actualizar_Registro));
            }
        }
        public void Documento_Borrar_Registro(List<long> _lst_idDocumento)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo != null && g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_CTG_Expedientes_Documentos_Listado_Modelo> lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.Where(m => _lst_idDocumento.Contains(m.id)).ToList();
                    if (lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_CTG_Expedientes_Documentos_Listado_Modelo mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo in lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.Remove(mdl_INTERNO_CTG_Expedientes_Documentos_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Expediente.Exferia_DataGridView_Documento.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idDocumento.Contains(long.Parse(r.Cells[nameof(INTERNO_CTG_Expedientes_Documentos_Listado_Modelo.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_Expediente.Exferia_DataGridView_Documento.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Documento Borradas
                g_int_TotalRegistros_Documento = g_int_TotalRegistrosInsertados_Documento - _lst_idDocumento.Count();
                g_int_TotalRegistrosInsertados_Documento -= _lst_idDocumento.Count();

                g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Documento;
                g_frm_P_Expediente.Exferia_BarraProgreso_Documento.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Documento;

                g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Documento_Borrar_Registro));
            }
        }

        #region Borrar Datos Documento
        public void BorrarDatos_Documento(List<long> _lst_idDocumento)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Expediente.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idDocumento);

                    g_obj_TareaAsincrona_BorrarDatos_Documento = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_Documento.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_Documento_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_Documento.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Documento_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_Documento.RunWorkerAsync(lst_Argumentos);

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(BorrarDatos_Documento));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_Documento_DoWork(object sender, DoWorkEventArgs e)
        {
            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            //Iniciar transaccion
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idDocumento = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    mdl_ValorDevuelto_Modelo = g_obj_CTG_Expedientes_Documentos_Datos.Borrar(lst_idDocumento);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_ValorDevuelto_Modelo.Listado_Id = lst_idDocumento;
                        mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Documento_DoWork));

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

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Documento_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_Documento_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Expediente.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(Variables.G_STR_OPCION_CTG_EXPEDIENTESDOCUMENTOS);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_Expediente.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Documento_Completed));
            }
        }
        #endregion

        #endregion

        #region Factura

        #region Rellenar DataGrid de Factura
        public void Rellenar_DataGrid_Facturas()
        {
            try
            {
                g_TareaAsincrona_Rellenar_DataGrid_Factura.CancelAsync();
                while (g_TareaAsincrona_Rellenar_DataGrid_Factura.IsBusy)
                {
                    Application.DoEvents();
                }

                //Vaciar el Listado
                g_frm_P_Expediente.Exferia_DataGridView_Factura.Rows.Clear();
                g_int_TotalRegistrosInsertados_Factura = 0;
                g_int_TotalRegistros_Factura = 0;
                g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Factura;
                g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Factura;

                //(Tarea Asincrona) Cargar Datos ##################################################################
                g_TareaAsincrona_Rellenar_DataGrid_Factura.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, nameof(P_Expediente_Controladora) + "/" + nameof(Rellenar_DataGrid_Facturas));
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Factura_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                List<INTERNO_COM_FacturasCabecera_Listado_Modelo> lst_INTERNO_COM_FacturasCabecera_Listado_Modelo = Filtrar_Facturas();

                if (lst_INTERNO_COM_FacturasCabecera_Listado_Modelo != null && lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Count > 0)
                {
                    //Total
                    g_int_TotalRegistros_Factura = lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Count();

                    foreach (INTERNO_COM_FacturasCabecera_Listado_Modelo mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo in lst_INTERNO_COM_FacturasCabecera_Listado_Modelo)
                    {
                        //Se Cancelo la tarea asincrona #########################
                        if (((BackgroundWorker)sender).CancellationPending)
                        {
                            e.Cancel = true;
                            return;
                        }

                        //Progreso
                        g_int_TotalRegistrosInsertados_Factura += 1;

                        //Añadir al DataGridView
                        ((BackgroundWorker)sender).ReportProgress(2, Transformar_Modelo_A_Row_Factura(mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, null));

                        //Esperar un poco
                        Thread.Sleep(1);
                    }
                }
            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Factura_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Añadir Factura al DataGrid
                g_frm_P_Expediente.Exferia_DataGridView_Factura.Rows.Add((DataGridViewRow)e.UserState);

                //Barra de Progreso
                g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Total = g_int_TotalRegistros_Factura;
                g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistrosInsertados_Factura;
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Rellenar_DataGrid_Factura_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (!e.Cancelled)
            {
                g_frm_P_Expediente.Facturas_Ordenar_DataGridView();
            }
        }

        public DataGridViewRow Transformar_Modelo_A_Row_Factura(INTERNO_COM_FacturasCabecera_Listado_Modelo _mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, DataGridViewRow _obj_DataGridViewRow)
        {
            DataGridViewRow obj_DataGridViewRow = _obj_DataGridViewRow;

            if (obj_DataGridViewRow == null)
            {
                obj_DataGridViewRow = (DataGridViewRow)g_frm_P_Expediente.Exferia_DataGridView_Factura.RowTemplate.Clone();
                obj_DataGridViewRow.CreateCells(g_frm_P_Expediente.Exferia_DataGridView_Factura);
            }

            int int_ContadorFila = 0;
            foreach (INTERNO_ABS_Listado_ColumnasDatos_Modelo mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo in g_lst_INTERNO_ABS_Listado_ColumnasDatos_Modelo_Factura)
            {
                //Segun el Tipo
                if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DATETIME))
                {
                    DateTime? dtt_Valor = (DateTime?)_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, null);
                    if (dtt_Valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dtt_Valor.Value;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.BOOLEAN))
                {
                    bool? bol_Valor = (bool?)_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, null);
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = bol_Valor != null && bol_Valor.Value ? "X" : "";
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.DECIMAL))
                {
                    decimal? dcm_valor = (decimal?)_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, null);
                    if (dcm_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = dcm_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.LONG))
                {
                    long? lng_valor = (long?)_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, null);
                    if (lng_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = lng_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.INT))
                {
                    int? int_valor = (int?)_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, null);
                    if (int_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = int_valor;
                    }
                }
                else if (mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.TipoDato.Equals(G_ENUM_TIPOSDATOS.HORASIMPLE))
                {
                    TimeSpan? tms_valor = (TimeSpan?)_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, null);
                    if (tms_valor != null)
                    {
                        obj_DataGridViewRow.Cells[int_ContadorFila].Value = tms_valor;
                    }
                }
                else
                {
                    obj_DataGridViewRow.Cells[int_ContadorFila].Value = _mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.GetType().GetProperty(mdl_INTERNO_ABS_Listado_ColumnasDatos_Modelo.Descripcion_Interna).GetValue(_mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, null);
                }

                int_ContadorFila += 1;
            }

            return obj_DataGridViewRow;
        }

        public List<INTERNO_COM_FacturasCabecera_Listado_Modelo> Filtrar_Facturas()
        {
            //Filtros Avanzados
            if (g_dct_ListadoFiltros_Factura != null && g_dct_ListadoFiltros_Factura.Count > 0)
            {
                return g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.AsQueryable().Where(Funciones_Lambda.Formar_EmpresionLambda_Filtrado<INTERNO_COM_FacturasCabecera_Listado_Modelo>(g_dct_ListadoFiltros_Factura, g_obj_ABS_Listado_Factura)).ToList();
            }
            else
            {
                return g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo;
            }
        }
        #endregion

        public void Facturas_Actualizar_Registro(long _lng_idFactutaCabecera, G_ENUM_TIPOACCION _enum_TipoAccion)
        {
            try
            {
                //Buscar el Registro en Base de datos

                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_COMPRAS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_COMPRAS + "." + Variables.G_STR_LIBRERIA_DATOSCOMPRAS);
                //creamos la instancia
                var obj_Clase = Activator.CreateInstance(m_type);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCOMPRAS_PROCEDIMIENTO_COMFACTURASCABECERA_OBTENERPARALISTADO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { _lng_idFactutaCabecera };
                //Pasamos los parametros al metodo y lo ejecutamos
                INTERNO_COM_FacturasCabecera_Listado_Modelo mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo = (INTERNO_COM_FacturasCabecera_Listado_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

                if (mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo != null)
                {
                    //Actualizar primero el List<> General ################################################################################
                    if (g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo != null && g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Count > 0)
                    {
                        INTERNO_COM_FacturasCabecera_Listado_Modelo mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Where(m => m.id.Equals(mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.id)).FirstOrDefault();
                        if (mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo_BUSQUEDA != null)
                        {
                            g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo[g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.FindIndex(m => m.id.Equals(mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.id))] = mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo;
                        }
                        else
                        {
                            g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Add(mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo);
                        }
                    }
                    else
                    {
                        if (g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo == null)
                        {
                            g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo = new List<INTERNO_COM_FacturasCabecera_Listado_Modelo>();
                        }

                        g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Add(mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo);
                    }
                }

                //Actualizar el DataGridView #####################################################################################
                //Modificar
                if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_MODIFICAR))
                {
                    DataGridViewRow row = g_frm_P_Expediente.Exferia_DataGridView_Factura.Rows
                               .Cast<DataGridViewRow>()
                               .Where(r => r.Cells[nameof(INTERNO_COM_FacturasCabecera_Listado_Modelo.id)].Value.Equals(_lng_idFactutaCabecera)).FirstOrDefault();

                    if (row != null)//Modificada
                    {
                        //Actualizar el Grid
                        Transformar_Modelo_A_Row_Factura(mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, row);

                        //Ordenar Listado
                        g_frm_P_Expediente.Facturas_Ordenar_DataGridView();
                    }
                }
                //Insertar
                else if (_enum_TipoAccion.Equals(G_ENUM_TIPOACCION.INT_INSERTAR))
                {
                    g_frm_P_Expediente.Exferia_DataGridView_Factura.Rows.Add(Transformar_Modelo_A_Row_Factura(mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo, null));

                    //Ordenar Listado
                    g_frm_P_Expediente.Facturas_Ordenar_DataGridView();
                }

                //Sumar Cantidad de Factura Borradas
                g_int_TotalRegistros_Factura += 1;
                g_int_TotalRegistrosInsertados_Factura += 1;

                g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Factura;
                g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Factura;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Facturas_Actualizar_Registro));
            }
        }
        public void Facturas_Borrar_Registro(List<long> _lst_idFactura)
        {
            try
            {
                //Borrar primero el List<> General ################################################################################
                if (g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo != null && g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Count > 0)
                {
                    List<INTERNO_COM_FacturasCabecera_Listado_Modelo> lst_INTERNO_COM_FacturasCabecera_Listado_Modelo_BUSQUEDA = g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Where(m => _lst_idFactura.Contains(m.id)).ToList();
                    if (lst_INTERNO_COM_FacturasCabecera_Listado_Modelo_BUSQUEDA != null && lst_INTERNO_COM_FacturasCabecera_Listado_Modelo_BUSQUEDA.Count > 0)
                    {
                        foreach (INTERNO_COM_FacturasCabecera_Listado_Modelo mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo in lst_INTERNO_COM_FacturasCabecera_Listado_Modelo_BUSQUEDA)
                        {
                            g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Remove(mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo);
                        }
                    }
                }

                //Borrar del DataGridView
                List<DataGridViewRow> lst_DataGridViewRow = g_frm_P_Expediente.Exferia_DataGridView_Factura.Rows
                                .Cast<DataGridViewRow>()
                                .Where(r => _lst_idFactura.Contains(long.Parse(r.Cells[nameof(INTERNO_COM_FacturasCabecera_Listado_Modelo.id)].Value.ToString()))).ToList();

                if (lst_DataGridViewRow != null && lst_DataGridViewRow.Count > 0)
                {
                    //Borrar del Grid
                    foreach (DataGridViewRow dgvr_Borrar in lst_DataGridViewRow)
                    {
                        g_frm_P_Expediente.Exferia_DataGridView_Factura.Rows.Remove(dgvr_Borrar);
                    }
                }

                //Restar Cantidad de Factura Borradas
                g_int_TotalRegistros_Factura = g_int_TotalRegistrosInsertados_Factura - _lst_idFactura.Count();
                g_int_TotalRegistrosInsertados_Factura -= _lst_idFactura.Count();

                g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Total = g_int_TotalRegistrosInsertados_Factura;
                g_frm_P_Expediente.Exferia_BarraProgreso_Factura.Exferia_BarraProgreso_Actualizar = g_int_TotalRegistros_Factura;

                g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
            }
            catch (Control_Errores)
            {
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(Facturas_Borrar_Registro));
            }
        }

        #region Borrar Datos Facturas
        public void BorrarDatos_Facturas(List<long> _lst_idFactura)
        {
            try
            {
                // Preguntar si esta Seguro de Borrar
                if (Mensajes.MostrarMensaje_Pregunta(Mensajes.G_STR_MENSAJES_GENERAL_PREGUNTA_BORRAR()))
                {
                    g_frm_P_Expediente.Enabled = false;
                    g_frm_PE_Esperando = new PE_Esperando(Mensajes.G_STR_ESPERANDO_BORRANDODATOS());

                    List<object> lst_Argumentos = new List<object>();
                    lst_Argumentos.Add(_lst_idFactura);

                    g_obj_TareaAsincrona_BorrarDatos_Factura = new BackgroundWorker();
                    g_obj_TareaAsincrona_BorrarDatos_Factura.DoWork += new DoWorkEventHandler(TareaAsincrona_BorrarDatos_Facturas_DoWork);
                    g_obj_TareaAsincrona_BorrarDatos_Factura.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_BorrarDatos_Facturas_Completed);
                    g_obj_TareaAsincrona_BorrarDatos_Factura.RunWorkerAsync(lst_Argumentos);

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

                Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(BorrarDatos_Facturas));
                Mensajes.MostrarMensaje(Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA());
            }
        }
        private void TareaAsincrona_BorrarDatos_Facturas_DoWork(object sender, DoWorkEventArgs e)
        {
            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, TimeSpan.MaxValue))
            {
                try
                {
                    //Argumentos
                    List<object> lst_Argumentos = (List<object>)e.Argument;
                    List<long> lst_idFacturas = (List<long>)lst_Argumentos[0];

                    // Borrar 
                    //Cargamos el ensamblado
                    Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_COMPRAS + ".dll");
                    //Obtenemos el tipo de la clase
                    Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_COMPRAS + "." + Variables.G_STR_LIBRERIA_DATOSCOMPRAS);
                    //creamos la instancia
                    var obj_Clase = Activator.CreateInstance(m_type);
                    //Cargamos el metodo solicitado
                    MethodInfo obj_MethodInfo = obj_Clase.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSCOMPRAS_PROCEDIMIENTO_COMFACTURASCABECERA_BORRAR, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros = { lst_idFacturas };
                    //Pasamos los parametros al metodo y lo ejecutamos
                    mdl_INTERNO_ValorDevuelto_Modelo = (INTERNO_ValorDevuelto_Modelo)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

                    //Si esta todo Correcto cierro transaccion
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        mdl_INTERNO_ValorDevuelto_Modelo.Listado_Id = lst_idFacturas;
                        mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
                        transaccion_SQL.Complete();
                    }

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Facturas_DoWork));

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                catch (Control_Errores)
                {
                    transaccion_SQL.Dispose();

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

                    Control_Errores.Errores_Log(ex.Message, ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Facturas_DoWork));

                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BORRARDATOSPANTALLA();
                }
                finally
                {
                    e.Result = mdl_INTERNO_ValorDevuelto_Modelo;
                }
            }
        }
        private void TareaAsincrona_BorrarDatos_Facturas_Completed(object sender, RunWorkerCompletedEventArgs e)
        {
            if (g_frm_PE_Esperando != null)
            {
                g_frm_PE_Esperando.Close();
                g_frm_PE_Esperando = null;
            }
            g_frm_P_Expediente.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(Variables.G_STR_OPCION_COM_FACTURACABECERA_AUX_2);
                    lst_obj.Add(mdl_ValorDevuelto_Modelo_Resultado.Listado_Id);

                    g_frm_P_Expediente.P_Base_ActualizarRegistro_ConObjeto(lst_obj, mdl_ValorDevuelto_Modelo_Resultado.TipoAccion);

                    g_frm_P_Expediente.P_Base_SeModificoDatosPantalla = false;
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Expediente_Controladora) + "/" + nameof(TareaAsincrona_BorrarDatos_Facturas_Completed));
            }
        }
        #endregion

        #endregion

        #region Liquidacion
        public void Liquidacion_Generar()
        {
            try
            {
                BackgroundWorker obj_TareaAsincrona_Liquidacion_Generar = new BackgroundWorker();
                obj_TareaAsincrona_Liquidacion_Generar.DoWork += new DoWorkEventHandler(TareaAsincrona_Liquidacion_Generar_DoWork);
                obj_TareaAsincrona_Liquidacion_Generar.ProgressChanged += new ProgressChangedEventHandler(TareaAsincrona_Liquidacion_Generar_ProgressChanged);
                obj_TareaAsincrona_Liquidacion_Generar.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TareaAsincrona_Liquidacion_Generar_Completed);
                obj_TareaAsincrona_Liquidacion_Generar.WorkerReportsProgress = true;
                obj_TareaAsincrona_Liquidacion_Generar.WorkerSupportsCancellation = true;

                //Vaciar el Listados
                g_frm_P_Expediente.Exferia_DataGridView_Liquidacion.Rows.Clear();
                g_frm_P_Expediente.Exferia_DataGridView_Itinerario.Rows.Clear();

                //(Tarea Asincrona) ###############################################################################
                obj_TareaAsincrona_Liquidacion_Generar.RunWorkerAsync();
                //#################################################################################################
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(P_Expediente_Controladora) + "/" + nameof(Liquidacion_Generar));
            }
        }
        private void TareaAsincrona_Liquidacion_Generar_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {

                #region TAB ECONOMICO

                #region GASTOS
                List<INTERNO_Liquidacion_Modelo> lst_INTERNO_Liquidacion_Modelo_GASTOS = g_obj_CTG_GastosLineas_Datos.Obtener_Para_Liquidacion(g_mdl_INTERNO_CTG_Expediente_Modelo.id);
                decimal dcm_Total_Gastos = 0m;

                if (lst_INTERNO_Liquidacion_Modelo_GASTOS != null && lst_INTERNO_Liquidacion_Modelo_GASTOS.Count > 0)
                {
                    string str_Agrupado = "";
                    decimal? dcm_Total = null;
                    foreach (INTERNO_Liquidacion_Modelo mdl_INTERNO_Liquidacion_Modelo in lst_INTERNO_Liquidacion_Modelo_GASTOS)
                    {
                        //AGRUPADO
                        if (str_Agrupado != mdl_INTERNO_Liquidacion_Modelo.Agrupado)
                        {
                            //TOTAL DEL AGRUPADO ANTERIOR ################################################
                            if (dcm_Total != null)
                            {
                                object[] arr_fila_AgrupadoTotal = new object[3];

                                //Tipo
                                arr_fila_AgrupadoTotal[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_TotalAgrupado;

                                //Descripcion
                                arr_fila_AgrupadoTotal[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "TOTAL " + str_Agrupado.ToUpper();

                                //Resultado
                                arr_fila_AgrupadoTotal[g_int_ColumnaPosicion_Liquidacion_Resultado] = dcm_Total.Value;

                                //Insertar en el listado
                                ((BackgroundWorker)sender).ReportProgress(1, arr_fila_AgrupadoTotal);
                            }
                            //############################################################################

                            //AGRUPADO ###################################################################
                            object[] arr_fila_Agrupado = new object[3];

                            //Tipo
                            arr_fila_Agrupado[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Agrupado;

                            //Descripcion
                            arr_fila_Agrupado[g_int_ColumnaPosicion_Liquidacion_Descripcion] = mdl_INTERNO_Liquidacion_Modelo.Agrupado;

                            //Resultado
                            arr_fila_Agrupado[g_int_ColumnaPosicion_Liquidacion_Resultado] = "";

                            //Insertar en el listado
                            ((BackgroundWorker)sender).ReportProgress(1, arr_fila_Agrupado);
                            //############################################################################

                            str_Agrupado = mdl_INTERNO_Liquidacion_Modelo.Agrupado;
                            dcm_Total = 0m;
                        }

                        //LINEA DE GASTO ###############################################################
                        object[] arr_fila = new object[3];

                        //Tipo
                        arr_fila[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Linea;

                        //Descripcion
                        arr_fila[g_int_ColumnaPosicion_Liquidacion_Descripcion] = mdl_INTERNO_Liquidacion_Modelo.Descripcion;

                        //Resultado
                        arr_fila[g_int_ColumnaPosicion_Liquidacion_Resultado] = mdl_INTERNO_Liquidacion_Modelo.Resultado;

                        //Insertar en el listado
                        ((BackgroundWorker)sender).ReportProgress(1, arr_fila);
                        //############################################################################

                        //Sumar Totales
                        dcm_Total += mdl_INTERNO_Liquidacion_Modelo.Resultado;
                        dcm_Total_Gastos += mdl_INTERNO_Liquidacion_Modelo.Resultado;
                    }

                    //TOTAL DEL AGRUPADO ANTERIOR ################################################
                    if (dcm_Total != null)
                    {
                        object[] arr_fila_AgrupadoTotal = new object[3];

                        //Tipo
                        arr_fila_AgrupadoTotal[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_TotalAgrupado;

                        //Descripcion
                        arr_fila_AgrupadoTotal[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "TOTAL " + str_Agrupado.ToUpper();

                        //Resultado
                        arr_fila_AgrupadoTotal[g_int_ColumnaPosicion_Liquidacion_Resultado] = dcm_Total.Value;

                        //Insertar en el listado
                        ((BackgroundWorker)sender).ReportProgress(1, arr_fila_AgrupadoTotal);
                    }
                    //############################################################################
                }

                //TOTAL DE GASTOS ############################################################
                object[] arr_fila_Total_Gastos = new object[3];

                //Tipo
                arr_fila_Total_Gastos[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Agrupado;

                //Descripcion
                arr_fila_Total_Gastos[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "Total de Gastos";

                //Resultado
                arr_fila_Total_Gastos[g_int_ColumnaPosicion_Liquidacion_Resultado] = dcm_Total_Gastos;

                //Insertar en el listado
                ((BackgroundWorker)sender).ReportProgress(1, arr_fila_Total_Gastos);
                //############################################################################
                #endregion

                #region PAGOS
                decimal dcm_Total_Pagos = 0m;

                //PAGOS REALIZADOS ############################################################
                object[] arr_fila_Pagos_Titulo = new object[3];

                //Tipo
                arr_fila_Pagos_Titulo[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Agrupado;

                //Descripcion
                arr_fila_Pagos_Titulo[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "Pagos realizados";

                //Resultado
                arr_fila_Pagos_Titulo[g_int_ColumnaPosicion_Liquidacion_Resultado] = "";

                //Insertar en el listado
                ((BackgroundWorker)sender).ReportProgress(1, arr_fila_Pagos_Titulo);
                //############################################################################

                //ANTICIPOS #################################################################
                if (g_lst_INTERNO_CTG_Anticipos_Listado_Modelo != null && g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Count > 0)
                {
                    object[] arr_fila_Anticipos = new object[3];

                    //Tipo
                    arr_fila_Anticipos[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Linea;

                    //Descripcion
                    arr_fila_Anticipos[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "Anticipos";

                    //Resultado
                    arr_fila_Anticipos[g_int_ColumnaPosicion_Liquidacion_Resultado] = g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Sum(m => m.importe);

                    //Insertar en el listado
                    ((BackgroundWorker)sender).ReportProgress(1, arr_fila_Anticipos);

                    //Total de pagos
                    dcm_Total_Pagos += g_lst_INTERNO_CTG_Anticipos_Listado_Modelo.Sum(m => m.importe);
                }
                //############################################################################

                //FACTURAS ##################################################################
                if (g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo != null && g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo.Count > 0)
                {
                    string str_FormaPago = "";
                    long? lng_idFormaPago = null;
                    decimal dcm_Total_FormaPago = 0m;
                    foreach (INTERNO_COM_FacturasCabecera_Listado_Modelo mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo in g_lst_INTERNO_COM_FacturasCabecera_Listado_Modelo)
                    {
                        if (lng_idFormaPago == null)
                        {
                            str_FormaPago = mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.FormaPago_Nombre;
                            lng_idFormaPago = mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.idFormaPago;
                        }
                        else if (lng_idFormaPago.Value != mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.idFormaPago)
                        {
                            object[] arr_fila_Facturas = new object[3];

                            //Tipo
                            arr_fila_Facturas[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Linea;

                            //Descripcion
                            arr_fila_Facturas[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "Pagos proveedor " + str_FormaPago;

                            //Resultado
                            arr_fila_Facturas[g_int_ColumnaPosicion_Liquidacion_Resultado] = dcm_Total_FormaPago;

                            //Insertar en el listado
                            ((BackgroundWorker)sender).ReportProgress(1, arr_fila_Facturas);


                            str_FormaPago = mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.FormaPago_Nombre;
                            lng_idFormaPago = mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.idFormaPago;

                            dcm_Total_FormaPago = 0m;
                        }

                        //Importe por forma de pago
                        dcm_Total_FormaPago += mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.total;

                        //Total de pagos
                        dcm_Total_Pagos += mdl_INTERNO_COM_FacturasCabecera_Listado_Modelo.total;
                    }

                    object[] arr_fila_Facturas_ultimoRegistro = new object[3];

                    //Tipo
                    arr_fila_Facturas_ultimoRegistro[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Linea;

                    //Descripcion
                    arr_fila_Facturas_ultimoRegistro[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "Pagos proveedor " + str_FormaPago;

                    //Resultado
                    arr_fila_Facturas_ultimoRegistro[g_int_ColumnaPosicion_Liquidacion_Resultado] = dcm_Total_FormaPago;

                    //Insertar en el listado
                    ((BackgroundWorker)sender).ReportProgress(1, arr_fila_Facturas_ultimoRegistro);
                }
                //###########################################################################

                //PAGOS NORMALES ##################################################################
                if (g_lst_INTERNO_CTG_Pagos_Listado_Modelo != null && g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Count > 0)
                {
                    string str_TipoPago = "";
                    long? lng_idTipoPago = null;
                    decimal dcm_Total_TipoPago = 0m;
                    foreach (INTERNO_CTG_Pagos_Listado_Modelo mdl_INTERNO_CTG_Pagos_Listado_Modelo in g_lst_INTERNO_CTG_Pagos_Listado_Modelo)
                    {
                        if (lng_idTipoPago == null)
                        {
                            str_TipoPago = mdl_INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Descripcion;
                            lng_idTipoPago = mdl_INTERNO_CTG_Pagos_Listado_Modelo.idTipoPago;
                        }
                        else if (lng_idTipoPago.Value != mdl_INTERNO_CTG_Pagos_Listado_Modelo.idTipoPago)
                        {
                            object[] arr_fila_Facturas = new object[3];

                            //Tipo
                            arr_fila_Facturas[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Linea;

                            //Descripcion
                            arr_fila_Facturas[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "Pagos proveedor " + str_TipoPago;

                            //Resultado
                            arr_fila_Facturas[g_int_ColumnaPosicion_Liquidacion_Resultado] = dcm_Total_TipoPago;

                            //Insertar en el listado
                            ((BackgroundWorker)sender).ReportProgress(1, arr_fila_Facturas);


                            str_TipoPago = mdl_INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Descripcion;
                            lng_idTipoPago = mdl_INTERNO_CTG_Pagos_Listado_Modelo.idTipoPago;

                            dcm_Total_TipoPago = 0m;
                        }

                        //Importe por forma de pago
                        dcm_Total_TipoPago += mdl_INTERNO_CTG_Pagos_Listado_Modelo.importe;

                        //Total de pagos
                        dcm_Total_Pagos += mdl_INTERNO_CTG_Pagos_Listado_Modelo.importe;
                    }

                    object[] arr_fila_Facturas_ultimoRegistro = new object[3];

                    //Tipo
                    arr_fila_Facturas_ultimoRegistro[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Linea;

                    //Descripcion
                    arr_fila_Facturas_ultimoRegistro[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "Otros " + str_TipoPago;

                    //Resultado
                    arr_fila_Facturas_ultimoRegistro[g_int_ColumnaPosicion_Liquidacion_Resultado] = dcm_Total_TipoPago;

                    //Insertar en el listado
                    ((BackgroundWorker)sender).ReportProgress(1, arr_fila_Facturas_ultimoRegistro);
                }
                //###########################################################################

                //TOTAL DE PAGOS ############################################################
                object[] arr_fila_Total_Pagos = new object[3];

                //Tipo
                arr_fila_Total_Pagos[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_TotalAgrupado;

                //Descripcion
                arr_fila_Total_Pagos[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "TOTAL PAGOS REALIZADOS";

                //Resultado
                arr_fila_Total_Pagos[g_int_ColumnaPosicion_Liquidacion_Resultado] = dcm_Total_Pagos;

                //Insertar en el listado
                ((BackgroundWorker)sender).ReportProgress(1, arr_fila_Total_Pagos);
                //############################################################################

                #endregion

                //IMPORTE A PAGAR ############################################################
                object[] arr_fila_ImporteAPagar = new object[3];

                //Tipo
                arr_fila_ImporteAPagar[g_int_ColumnaPosicion_Liquidacion_Tipo] = g_int_TipoColumna_Agrupado;

                //Descripcion
                arr_fila_ImporteAPagar[g_int_ColumnaPosicion_Liquidacion_Descripcion] = "Importe a pagar";

                //Resultado
                arr_fila_ImporteAPagar[g_int_ColumnaPosicion_Liquidacion_Resultado] = dcm_Total_Gastos - dcm_Total_Pagos;

                //Insertar en el listado
                ((BackgroundWorker)sender).ReportProgress(1, arr_fila_ImporteAPagar);
                //############################################################################
                #endregion

                #region TAB ITINERARIO
                if (g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo != null && g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.Count > 0)
                {
                    foreach (INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo in g_lst_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo)
                    {
                        //buscar el itinerario de la cabecera de orden de comision de servicios
                        List<INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo> lst_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo = g_obj_CTG_OrdenComisionServiciosItinerarios_Datos.Obtener_PorCabecera(mdl_INTERNO_CTG_OrdenComisionServiciosCabecera_Listado_Modelo.id);

                        if (lst_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo != null && lst_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo.Count > 0)
                        {
                            foreach (INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo mdl_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo in lst_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo)
                            {
                                object[] arr_fila_Itinerario = new object[5];

                                //Desde
                                arr_fila_Itinerario[g_int_ColumnaPosicion_Itinerario_Desde] = mdl_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo.Origen_Texto;

                                //Hasta
                                arr_fila_Itinerario[g_int_ColumnaPosicion_Itinerario_Hasta] = mdl_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo.Destino_Texto;

                                //Fecha
                                arr_fila_Itinerario[g_int_ColumnaPosicion_Itinerario_Fecha] = mdl_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo.fecha.ToString("dd/MM/yyyy");

                                //Hora Llegada
                                arr_fila_Itinerario[g_int_ColumnaPosicion_Itinerario_HoraSalida] = mdl_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo.horaSalida.ToString("hh\\:mm"); ;

                                //Hora salida
                                arr_fila_Itinerario[g_int_ColumnaPosicion_Itinerario_HoraLlegada] = mdl_INTERNO_CTG_OrdenComisionServiciosItinerarios_Listado_Modelo.horaLlegada.ToString("hh\\:mm"); ;

                                //Insertar en el listado
                                ((BackgroundWorker)sender).ReportProgress(2, arr_fila_Itinerario);

                            }
                        }
                    }
                }
                #endregion

            }
            catch (ThreadAbortException)
            {
                e.Cancel = true;
            }
            catch (Control_Errores)
            {
                e.Cancel = true;
            }
            catch (Exception)
            {
                e.Cancel = true;
            }
        }
        private void TareaAsincrona_Liquidacion_Generar_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            try
            {
                //Economico
                if (e.ProgressPercentage == 1)
                {
                    g_frm_P_Expediente.Exferia_DataGridView_Liquidacion.Rows.Add((object[])e.UserState);
                }
                //Itinerario
                else if (e.ProgressPercentage == 2)
                {
                    g_frm_P_Expediente.Exferia_DataGridView_Itinerario.Rows.Add((object[])e.UserState);
                }
            }
            catch (Exception)
            { }
        }
        private void TareaAsincrona_Liquidacion_Generar_Completed(object sender, RunWorkerCompletedEventArgs e)
        { }
        #endregion
    }
}
