using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Herencia.Capas;
using Exferia_Aplicacion.Modelos_Volcado;
using Exferia_ControlGastos._0_Modelos;
using Exferia_EntityFramework;
using Exferia_General;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_ControlGastos._1_Datos
{
    public class CTG_Pagos_Datos : ABS_Datos
    {
        #region Listados 
        private List<INTERNO_CTG_Pagos_Listado_Modelo> g_lst_INTERNO_CTG_Pagos_Listado_Modelo = null;

        public override List<dynamic> Obtener_Listado(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            List<dynamic> lst_CTG = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                // Consulta .....................................................
                ConsultaRellenar_Listado(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(CTG_Pagos).Name), _lst_CamposConRelacionABuscar, -1, null, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if ((g_lst_INTERNO_CTG_Pagos_Listado_Modelo != null) && (g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Count() > 0))
                {
                    lst_CTG = g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Obtener_Listado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return lst_CTG;
        }
        public override dynamic Obtener_RegistroListado(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo, long _lng_id, List<long> _lst_ids)
        {
            Exferia_Entities obj_Exferia_Entities = null;
            dynamic dnm_CTG = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                // Consulta .....................................................
                ConsultaRellenar_Listado(obj_Exferia_Entities, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(CTG_Pagos).Name), _lst_CamposConRelacionABuscar, _lng_id, _lst_ids, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if ((g_lst_INTERNO_CTG_Pagos_Listado_Modelo != null) && (g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Count() > 0))
                {
                    dnm_CTG = g_lst_INTERNO_CTG_Pagos_Listado_Modelo.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Obtener_RegistroListado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return dnm_CTG;
        }
        protected override void ConsultaRellenar_Listado(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionas, List<string> _lst_CamposConRelacionABuscar, long _lng_id, List<long> _lst_id, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            try
            {
                string str_SQL =
                " SELECT " +
                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.id) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.fecha) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.importe) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.estado) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                   //ids
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idExpediente) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idGastoLinea) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idTipoPago) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idPredefinidoCabecera_Pago) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Propuesto) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Autorizado) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                   //GastoLinea
                   (
                        (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea)))
                            ?
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_Codigo) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.codigo) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_Descripcion) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.descripcion) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_FechaBorrado) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.fechaBorrado) + ","
                                )
                            :
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_Codigo) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_Descripcion) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_FechaBorrado) + " = NULL ,"
                                )
                   ) +
                   //TipoPago
                   (
                        (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago)))
                            ?
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Codigo) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.codigo) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Descripcion) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.descripcion) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_FechaBorrado) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.fechaBorrado) + ","
                                )
                            :
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Codigo) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Descripcion) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_FechaBorrado) + " = NULL ,"
                                )
                   ) +
                   //PredefinidoCabecera_Pago
                   (
                        (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago)))
                            ?
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_Codigo) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.codigo) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_Descripcion) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.descripcion) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_FechaBorrado) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.fechaBorrado) + ","
                                )
                            :
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_Codigo) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_Descripcion) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_FechaBorrado) + " = NULL ,"
                                )
                   ) +
                   //Empleado_Propuesto
                   (
                        (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto)))
                            ?
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_Codigo) + " = AUX_1." + nameof(MAE_Empleados.codigo) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_Descripcion) + " = AUX_1." + nameof(MAE_Empleados.nombre) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_FechaBorrado) + " = AUX_1." + nameof(MAE_Empleados.fechaBorrado) + ","
                                )
                            :
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_Codigo) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_Descripcion) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_FechaBorrado) + " = NULL ,"
                                )
                   ) +
                   //Empleado_Autorizado
                   (
                        (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado)))
                            ?
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_Codigo) + " = AUX_2." + nameof(MAE_Empleados.codigo) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_Descripcion) + " = AUX_2." + nameof(MAE_Empleados.nombre) + "," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_FechaBorrado) + " = AUX_2." + nameof(MAE_Empleados.fechaBorrado)
                                )
                            :
                                (
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_Codigo) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_Descripcion) + " = ''," +
                                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_FechaBorrado) + " = NULL"
                                )
                   ) +
             " FROM " + nameof(CTG_Pagos) +
             //GastoLinea
             (
                 (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea)))
                 ?
                     (
                             " LEFT JOIN " + nameof(CTG_GastosLineas) + " ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idGastoLinea) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.id)
                     )
                 : ("")
             ) +
             //TipoPago
             (
                 (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago)))
                 ?
                     (
                             " LEFT JOIN " + nameof(MAE_TiposPagos) + " ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idTipoPago) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.id)
                     )
                 : ("")
             ) +
             //GastoLinea
             (
                 (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago)))
                 ?
                     (
                             " LEFT JOIN " + nameof(CTA_PredefinidosCabeceras) + " ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.id)
                     )
                 : ("")
             ) +
            //Empleado_Propuesto
            (
                (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto)))
                ?
                    (
                            " LEFT JOIN " + nameof(MAE_Empleados) + " AS AUX_1 ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Propuesto) + " = AUX_1." + nameof(MAE_Empleados.id)
                    )
                : ("")
            ) +
            //Empleado_Autorizado
            (
                (_lst_CamposConRelacionABuscar.Contains(nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado)))
                ?
                    (
                            " LEFT JOIN " + nameof(MAE_Empleados) + " AS AUX_2 ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Autorizado) + " = AUX_2." + nameof(MAE_Empleados.id)
                    )
                : ("")
            ) +
             " WHERE " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fechaBorrado) + " IS null AND " +
                         (_lng_id > -1 ? nameof(CTG_Pagos) + "." + (nameof(CTG_Pagos.id) + "=@id") : "1 = 1");

                //Parametros
                object[] arr_Parametros = new object[]
                {
                    new SqlParameter("@id", _lng_id)
                };

                //Rellenar el Modelo
                g_lst_INTERNO_CTG_Pagos_Listado_Modelo = _obj_Exferia_Entities.Database.SqlQuery<INTERNO_CTG_Pagos_Listado_Modelo>(str_SQL, arr_Parametros).ToList();


            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(ConsultaRellenar_Listado), true);
            }
        }

        #endregion

        #region Listado Secundario
        public override List<dynamic> Obtener_Listado_Secundario(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            throw new NotImplementedException();
        }
        public override dynamic Obtener_RegistroListado_Secundario(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo, long _lng_id, List<long> _lst_id)
        {
            throw new NotImplementedException();
        }
        protected override void ConsultaRellenar_Listado_Secundario(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionadas, List<string> _lst_CamposConRelacionABuscar, long _lng_id, List<long> _lst_ids, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        { }
        #endregion

        #region F3
        public override dynamic Obtener_F3(string _str_filtro, string _str_CampoBusqueda, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            throw new NotImplementedException();
        }
        public override dynamic Obtener_F3_PorId(long _lng_id, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            throw new NotImplementedException();
        }
        protected override void ConsultaRellenar_F3(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionadas, string _str_CampoBusqueda, string _str_Filtro, long _lng_id, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        { }
        #endregion

        #region Obtener

        #region Obtener Simple
        private dynamic g_dnm_Modelo_Obtener = null;

        private static int g_int_TotalHilos_Obtener = 6;
        private bool[] g_bol_Hilos_Terminados_Obtener = new bool[g_int_TotalHilos_Obtener];

        public override dynamic Obtener(long _lng_id)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                string str_SQL =
                          " SELECT " +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idExpediente) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idGastoLinea) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idTipoPago) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fecha) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.importe) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Propuesto) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Autorizado) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.observaciones) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.estado) + "," +
                              nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fechaBorrado) +
                        " FROM " + nameof(CTG_Pagos) +
                        " WHERE  " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fechaBorrado) + " IS null AND " +
                                     nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "=@id ";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Rellenar el Modelo
                g_dnm_Modelo_Obtener = obj_Exferia_Entities.Database.SqlQuery<CTG_Pagos>(str_SQL, arr_Parametros).FirstOrDefault();

                #region Rellenar tablas Relacionadas
                if (g_dnm_Modelo_Obtener != null)
                {
                    //reiniciar Valores de los hilos
                    for (int int_Contador = 0; int_Contador < g_int_TotalHilos_Obtener; int_Contador++)
                    {
                        g_bol_Hilos_Terminados_Obtener[int_Contador] = false;
                    }

                    //CTG_Expedientes ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idExpediente != null)
                    {
                        ThreadStart obj_ThreadStart_EXPEDINETE = new ThreadStart(Obtener_Expediente_Modelo_Obtener);
                        Thread obj_Thread_EXPEDINETE = new Thread(obj_ThreadStart_EXPEDINETE);
                        obj_Thread_EXPEDINETE.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[0] = true;
                    }

                    //CTG_GastosLineas ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idGastoLinea != null)
                    {
                        ThreadStart obj_ThreadStart_GASTOLINEA = new ThreadStart(Obtener_GastoLinea_Modelo_Obtener);
                        Thread obj_Thread_GASTOLINEA = new Thread(obj_ThreadStart_GASTOLINEA);
                        obj_Thread_GASTOLINEA.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[1] = true;
                    }

                    //MAE_TiposPagos ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idTipoPago != null)
                    {
                        ThreadStart obj_ThreadStart_TIPOPAGO = new ThreadStart(Obtener_TipoPago_Modelo_Obtener);
                        Thread obj_Thread_TIPOPAGO = new Thread(obj_ThreadStart_TIPOPAGO);
                        obj_Thread_TIPOPAGO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[2] = true;
                    }

                    //CTA_PredefinidosCabeceras ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idPredefinidoCabecera_Pago != null)
                    {
                        ThreadStart obj_ThreadStart_PREDEFINIDOCABECERA = new ThreadStart(Obtener_PredefinidoCabecera_Modelo_Obtener);
                        Thread obj_Thread_PREDEFINIDOCABECERA = new Thread(obj_ThreadStart_PREDEFINIDOCABECERA);
                        obj_Thread_PREDEFINIDOCABECERA.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[3] = true;
                    }

                    //MAE_Empleados (Propuesto) ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idEmpleado_Propuesto != null)
                    {
                        ThreadStart obj_ThreadStart_EMPLEADOPROPUESTO = new ThreadStart(Obtener_EmpleadoPropuesto_Modelo_Obtener);
                        Thread obj_Thread_EMPLEADOPROPUESTO = new Thread(obj_ThreadStart_EMPLEADOPROPUESTO);
                        obj_Thread_EMPLEADOPROPUESTO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[4] = true;
                    }

                    //MAE_Empleados (Autorizado) ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idEmpleado_Autorizado != null)
                    {
                        ThreadStart obj_ThreadStart_EMPLEADOAUTORIZADO = new ThreadStart(Obtener_EmpleadoAutorizado_Modelo_Obtener);
                        Thread obj_Thread_EMPLEADOAUTORIZADO = new Thread(obj_ThreadStart_EMPLEADOAUTORIZADO);
                        obj_Thread_EMPLEADOAUTORIZADO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[5] = true;
                    }

                    //Esperando a que terminen todos los hilos .........................................
                    bool bol_Termino = false;
                    while (bol_Termino == false)
                    {
                        bol_Termino = true;
                        foreach (bool bol_Termino_Hilo in g_bol_Hilos_Terminados_Obtener)
                        {
                            if (bol_Termino_Hilo == false)
                            {
                                bol_Termino = false;
                                break;
                            }
                        }

                        Thread.Sleep(10);
                    }
                    //.................................................................................
                }
                #endregion

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Obtener), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return g_dnm_Modelo_Obtener;
        }

        #region Tablas Relacionadas
        private void Obtener_Expediente_Modelo_Obtener()
        {
            try
            {
                CTG_Expedientes_Datos obj_CTG_Expedientes_Datos = new CTG_Expedientes_Datos();
                g_dnm_Modelo_Obtener.CTG_Expedientes = obj_CTG_Expedientes_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idExpediente);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[0] = true;
            }
        }
        private void Obtener_GastoLinea_Modelo_Obtener()
        {
            try
            {
                CTG_GastosLineas_Datos obj_CTG_GastosLineas_Datos = new CTG_GastosLineas_Datos();
                g_dnm_Modelo_Obtener.CTG_GastosLineas = obj_CTG_GastosLineas_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idGastoLinea);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[1] = true;
            }
        }
        private void Obtener_TipoPago_Modelo_Obtener()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //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_DATOSMAESTROS_PROCEDIMIENTO_MAETIPOSPAGOS_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

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

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[2] = true;
            }
        }
        private void Obtener_PredefinidoCabecera_Modelo_Obtener()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                //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_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAPREDEFINIDOCABECERA_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

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

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[3] = true;
            }
        }
        private void Obtener_EmpleadoPropuesto_Modelo_Obtener()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //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_DATOSMAESTROS_PROCEDIMIENTO_MAEEMPLEADOS_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.idEmpleado_Propuesto };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_Empleados = (MAE_Empleados)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[4] = true;
            }
        }
        private void Obtener_EmpleadoAutorizado_Modelo_Obtener()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //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_DATOSMAESTROS_PROCEDIMIENTO_MAEEMPLEADOS_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.idEmpleado_Autorizado };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_Empleados1 = (MAE_Empleados)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[5] = true;
            }
        }
        #endregion
        #endregion

        public override dynamic Obtener_Registro_PorCampo(string _str_Filtro, string _str_CampoBusqueda, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual)
        {
            throw new NotImplementedException();
        }

        #region OBTENER POR EXPEDIENTE
        List<INTERNO_CTG_Pagos_Listado_Modelo> g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE = null;

        //Listado de modelos Relacionados
        private List<MAE_Empleados> g_lst_MAE_Empleados_POREXPEDIENTE = null;
        private List<long> g_lst_Empleados_POREXPEDIENTE = null;
        private List<CTA_PredefinidosCabeceras> g_lst_CTA_PredefinidosCabeceras_POREXPEDIENTE = null;
        private List<MAE_TiposPagos> g_lst_MAE_TiposPagos_POREXPEDIENTE = null;
        private List<CTG_GastosLineas> g_lst_CTG_GastosLineas_POREXPEDIENTE = null;

        private static int g_int_TotalHilos_POREXPEDIENTE = 4;
        private bool[] g_bol_Hilos_Terminados_POREXPEDIENTE = new bool[g_int_TotalHilos_POREXPEDIENTE];

        public List<INTERNO_CTG_Pagos_Listado_Modelo> Obtener_PorExpediente(long _lng_idExpediente)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                string str_SQL =
                " SELECT " +
                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.id) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.fecha) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fecha) + "," +
                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.importe) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.importe) + "," +
                    nameof(INTERNO_CTG_Pagos_Listado_Modelo.estado) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.estado) + "," +
                   //ids
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idExpediente) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idExpediente) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idGastoLinea) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idGastoLinea) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idTipoPago) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idTipoPago) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idPredefinidoCabecera_Pago) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Propuesto) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Propuesto) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Autorizado) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Autorizado) + "," +
                   //GastoLinea
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_Codigo) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.codigo) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_Descripcion) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.descripcion) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_FechaBorrado) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.fechaBorrado) + "," +
                   //TipoPago
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Codigo) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.codigo) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Descripcion) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.descripcion) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_FechaBorrado) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.fechaBorrado) + "," +
                   //PredefinidoCabecera_Pago
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_Codigo) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.codigo) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_Descripcion) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.descripcion) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_FechaBorrado) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.fechaBorrado) + "," +
                   //Empleado_Propuesto
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_Codigo) + " = AUX_1." + nameof(MAE_Empleados.codigo) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_Descripcion) + " = AUX_1." + nameof(MAE_Empleados.nombre) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_FechaBorrado) + " = AUX_1." + nameof(MAE_Empleados.fechaBorrado) + "," +
                   //Empleado_Autorizado
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_Codigo) + " = AUX_2." + nameof(MAE_Empleados.codigo) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_Descripcion) + " = AUX_2." + nameof(MAE_Empleados.nombre) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_FechaBorrado) + " = AUX_2." + nameof(MAE_Empleados.fechaBorrado) +
             " FROM " + nameof(CTG_Pagos) +
             //GastoLinea
             " LEFT JOIN " + nameof(CTG_GastosLineas) + " ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idGastoLinea) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.id) +
             //TipoPago
             " LEFT JOIN " + nameof(MAE_TiposPagos) + " ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idTipoPago) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.id) +
             //PredefinidoCabecera_Pago
             " LEFT JOIN " + nameof(CTA_PredefinidosCabeceras) + " ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.id) +
             //Empleado_Propuesto
             " LEFT JOIN " + nameof(MAE_Empleados) + " AS AUX_1 ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Propuesto) + " = AUX_1." + nameof(MAE_Empleados.id) +
             //Empleado_Autorizado
             " LEFT JOIN " + nameof(MAE_Empleados) + " AS AUX_2 ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Autorizado) + " = AUX_2." + nameof(MAE_Empleados.id) +
             " WHERE " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fechaBorrado) + " IS null AND " +
                         nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idExpediente) + "=@idExpediente";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                    new SqlParameter("@idExpediente", _lng_idExpediente)
                };

                //Rellenar el Modelo
                g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE = obj_Exferia_Entities.Database.SqlQuery<INTERNO_CTG_Pagos_Listado_Modelo>(str_SQL, arr_Parametros).ToList();


                #region Rellenar Tablas Relacionadas
                if (g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE != null &&
                    g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE.Count > 0)
                {
                    #region PRIMERO BUSCO LOS DATOS DE LAS TABLAS RELACIONADAS
                    //reiniciar Valores de los hilos
                    for (int int_Contador = 0; int_Contador < g_int_TotalHilos_POREXPEDIENTE; int_Contador++)
                    {
                        g_bol_Hilos_Terminados_POREXPEDIENTE[int_Contador] = false;
                    }

                    g_lst_Empleados_POREXPEDIENTE = new List<long>();

                    //MAE_Empleado (Propuesto) #######################################################
                    g_lst_Empleados_POREXPEDIENTE.AddRange(g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE.Where(m => m.idEmpleado_Propuesto != null).Select(m => m.idEmpleado_Propuesto.Value).ToList());

                    //MAE_Empleado (Autorizado) #######################################################
                    g_lst_Empleados_POREXPEDIENTE.AddRange(g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE.Where(m => m.idEmpleado_Autorizado != null).Select(m => m.idEmpleado_Autorizado.Value).ToList());

                    if (g_lst_Empleados_POREXPEDIENTE.Count > 0)
                    {
                        ThreadStart obj_ThreadStart_EMPLEADOS = new ThreadStart(Obtener_Empleados_Modelo_Obtener_POREXPEDIENTE);
                        Thread obj_Thread_EMPLEADOS = new Thread(obj_ThreadStart_EMPLEADOS);
                        obj_Thread_EMPLEADOS.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_POREXPEDIENTE[0] = true;
                    }

                    //CTA_PredefinidosCabeceras #######################################################
                    ThreadStart obj_ThreadStart_PREDEFINIDOCABECERA = new ThreadStart(Obtener_PredefinidoCabecera_Modelo_Obtener_POREXPEDIENTE);
                    Thread obj_Thread_PREDEFINIDOCABECERA = new Thread(obj_ThreadStart_PREDEFINIDOCABECERA);
                    obj_Thread_PREDEFINIDOCABECERA.Start();

                    //MAE_TiposPagos #######################################################
                    ThreadStart obj_ThreadStart_TIPOSPAGOS = new ThreadStart(Obtener_TiposPagos_Modelo_Obtener_POREXPEDIENTE);
                    Thread obj_Thread_TIPOSPAGOS = new Thread(obj_ThreadStart_TIPOSPAGOS);
                    obj_Thread_TIPOSPAGOS.Start();

                    //CTG_GastosLineas #######################################################
                    ThreadStart obj_ThreadStart_GASTOSLINEAS = new ThreadStart(Obtener_GastosLineas_Modelo_Obtener_POREXPEDIENTE);
                    Thread obj_Thread_GASTOSLINEAS = new Thread(obj_ThreadStart_GASTOSLINEAS);
                    obj_Thread_GASTOSLINEAS.Start();

                    //Esperando a que terminen todos los hilos .........................................
                    bool bol_Termino = false;
                    while (bol_Termino == false)
                    {
                        bol_Termino = true;
                        foreach (bool bol_Termino_Hilo in g_bol_Hilos_Terminados_POREXPEDIENTE)
                        {
                            if (bol_Termino_Hilo == false)
                            {
                                bol_Termino = false;
                                break;
                            }
                        }

                        Thread.Sleep(10);
                    }
                    //.................................................................................
                    #endregion

                    #region DESPUES SE LO VOY ASIGNANDO A LOS REGISTRO UNO A UNO
                    foreach (INTERNO_CTG_Pagos_Listado_Modelo mdl_INTERNO_CTG_Pagos_Listado_Modelo in g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE)
                    {
                        //MAE_Empleados (Propuesto) #############################################
                        if (g_lst_MAE_Empleados_POREXPEDIENTE != null &&
                            g_lst_MAE_Empleados_POREXPEDIENTE.Count > 0 &&
                            mdl_INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Propuesto != null)
                        {
                            mdl_INTERNO_CTG_Pagos_Listado_Modelo.MAE_Empleados = g_lst_MAE_Empleados_POREXPEDIENTE.Where(m => m.id == mdl_INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Propuesto.Value).FirstOrDefault();
                        }

                        //MAE_Empleados (Autorizado) #############################################
                        if (g_lst_MAE_Empleados_POREXPEDIENTE != null &&
                            g_lst_MAE_Empleados_POREXPEDIENTE.Count > 0 &&
                            mdl_INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Autorizado != null)
                        {
                            mdl_INTERNO_CTG_Pagos_Listado_Modelo.MAE_Empleados1 = g_lst_MAE_Empleados_POREXPEDIENTE.Where(m => m.id == mdl_INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Autorizado.Value).FirstOrDefault();
                        }

                        //CTA_PredefinidoCabecera #############################################
                        if (g_lst_CTA_PredefinidosCabeceras_POREXPEDIENTE != null &&
                            g_lst_CTA_PredefinidosCabeceras_POREXPEDIENTE.Count > 0 &&
                            mdl_INTERNO_CTG_Pagos_Listado_Modelo.idPredefinidoCabecera_Pago != null)
                        {
                            mdl_INTERNO_CTG_Pagos_Listado_Modelo.CTA_PredefinidosCabeceras = g_lst_CTA_PredefinidosCabeceras_POREXPEDIENTE.Where(m => m.id == mdl_INTERNO_CTG_Pagos_Listado_Modelo.idPredefinidoCabecera_Pago.Value).FirstOrDefault();
                        }

                        //MAE_TIPOPAGO #############################################
                        if (g_lst_MAE_TiposPagos_POREXPEDIENTE != null &&
                            g_lst_MAE_TiposPagos_POREXPEDIENTE.Count > 0)
                        {
                            mdl_INTERNO_CTG_Pagos_Listado_Modelo.MAE_TiposPagos = g_lst_MAE_TiposPagos_POREXPEDIENTE.Where(m => m.id == mdl_INTERNO_CTG_Pagos_Listado_Modelo.idTipoPago).FirstOrDefault();
                        }

                        //CTG_GastosLineas #############################################
                        if (g_lst_CTG_GastosLineas_POREXPEDIENTE != null &&
                            g_lst_CTG_GastosLineas_POREXPEDIENTE.Count > 0)
                        {
                            mdl_INTERNO_CTG_Pagos_Listado_Modelo.CTG_GastosLineas = g_lst_CTG_GastosLineas_POREXPEDIENTE.Where(m => m.id == mdl_INTERNO_CTG_Pagos_Listado_Modelo.idGastoLinea).FirstOrDefault();
                        }
                    }
                    #endregion
                }
                #endregion

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Obtener_PorExpediente), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE;
        }

        #region Tablas Relacionadas
        private void Obtener_Empleados_Modelo_Obtener_POREXPEDIENTE()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //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_DATOSMAESTROS_PROCEDIMIENTO_MAEEMPLEADOS_OBTENERMODELOLISTADO_POR_IDS, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_lst_Empleados_POREXPEDIENTE };

                g_lst_MAE_Empleados_POREXPEDIENTE = (List<MAE_Empleados>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_POREXPEDIENTE[0] = true;
            }
        }
        private void Obtener_PredefinidoCabecera_Modelo_Obtener_POREXPEDIENTE()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                //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_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAPREDEFINIDOCABECERA_OBTENERMODELOLISTADO_POR_IDS, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE.Where(x => x.idPredefinidoCabecera_Pago != null).Select(m => m.idPredefinidoCabecera_Pago.Value).ToList() };

                g_lst_CTA_PredefinidosCabeceras_POREXPEDIENTE = (List<CTA_PredefinidosCabeceras>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_POREXPEDIENTE[1] = true;
            }
        }
        private void Obtener_TiposPagos_Modelo_Obtener_POREXPEDIENTE()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //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_DATOSMAESTROS_PROCEDIMIENTO_MAETIPOSPAGOS_OBTENERMODELOLISTADO_POR_IDS, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE.Select(m => m.idTipoPago).ToList() };

                g_lst_MAE_TiposPagos_POREXPEDIENTE = (List<MAE_TiposPagos>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_POREXPEDIENTE[2] = true;
            }
        }
        private void Obtener_GastosLineas_Modelo_Obtener_POREXPEDIENTE()
        {
            try
            {
                CTG_GastosLineas_Datos obj_CTG_GastosLineas_Datos = new CTG_GastosLineas_Datos();
                g_lst_CTG_GastosLineas_POREXPEDIENTE = obj_CTG_GastosLineas_Datos.Obtener_ModeloListado_Por_Ids(g_lst_INTERNO_CTG_Pagos_Listado_Modelo_POREXPEDIENTE.Select(x => x.idGastoLinea).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_POREXPEDIENTE[3] = true;
            }
        }
        #endregion

        #endregion

        #region OBTENER PARA LISTADO
        INTERNO_CTG_Pagos_Listado_Modelo g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO = null;

        private static int g_int_TotalHilos_PARALISTADO = 5;
        private bool[] g_bol_Hilos_Terminados_PARALISTADO = new bool[g_int_TotalHilos_PARALISTADO];

        public INTERNO_CTG_Pagos_Listado_Modelo Obtener_ParaListado(long _lng_id)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                string str_SQL =
               " SELECT " +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.id) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.fecha) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fecha) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.importe) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.importe) + "," +
                   nameof(INTERNO_CTG_Pagos_Listado_Modelo.estado) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.estado) + "," +
                  //ids
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.idExpediente) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idExpediente) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.idGastoLinea) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idGastoLinea) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.idTipoPago) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idTipoPago) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.idPredefinidoCabecera_Pago) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Propuesto) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Propuesto) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.idEmpleado_Autorizado) + " = " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Autorizado) + "," +
                  //GastoLinea
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_Codigo) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.codigo) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_Descripcion) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.descripcion) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.GastoLinea_FechaBorrado) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.fechaBorrado) + "," +
                  //TipoPago
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Codigo) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.codigo) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_Descripcion) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.descripcion) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.TipoPago_FechaBorrado) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.fechaBorrado) + "," +
                  //PredefinidoCabecera_Pago
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_Codigo) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.codigo) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_Descripcion) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.descripcion) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.PredefinidoCabecera_Pago_FechaBorrado) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.fechaBorrado) + "," +
                  //Empleado_Propuesto
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_Codigo) + " = AUX_1." + nameof(MAE_Empleados.codigo) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_Descripcion) + " = AUX_1." + nameof(MAE_Empleados.nombre) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Propuesto_FechaBorrado) + " = AUX_1." + nameof(MAE_Empleados.fechaBorrado) + "," +
                  //Empleado_Autorizado
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_Codigo) + " = AUX_2." + nameof(MAE_Empleados.codigo) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_Descripcion) + " = AUX_2." + nameof(MAE_Empleados.nombre) + "," +
                  nameof(INTERNO_CTG_Pagos_Listado_Modelo.Empleado_Autorizado_FechaBorrado) + " = AUX_2." + nameof(MAE_Empleados.fechaBorrado) +
            " FROM " + nameof(CTG_Pagos) +
            //GastoLinea
            " LEFT JOIN " + nameof(CTG_GastosLineas) + " ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idGastoLinea) + " = " + nameof(CTG_GastosLineas) + "." + nameof(CTG_GastosLineas.id) +
            //TipoPago
            " LEFT JOIN " + nameof(MAE_TiposPagos) + " ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idTipoPago) + " = " + nameof(MAE_TiposPagos) + "." + nameof(MAE_TiposPagos.id) +
            //PredefinidoCabecera_Pago
            " LEFT JOIN " + nameof(CTA_PredefinidosCabeceras) + " ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + " = " + nameof(CTA_PredefinidosCabeceras) + "." + nameof(CTA_PredefinidosCabeceras.id) +
            //Empleado_Propuesto
            " LEFT JOIN " + nameof(MAE_Empleados) + " AS AUX_1 ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Propuesto) + " = AUX_1." + nameof(MAE_Empleados.id) +
            //Empleado_Autorizado
            " LEFT JOIN " + nameof(MAE_Empleados) + " AS AUX_2 ON " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Autorizado) + " = AUX_2." + nameof(MAE_Empleados.id) +
            " WHERE " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fechaBorrado) + " IS null AND " +
                        nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "=@id";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                    new SqlParameter("@id", _lng_id)
                };

                //Rellenar el Modelo
                g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO = obj_Exferia_Entities.Database.SqlQuery<INTERNO_CTG_Pagos_Listado_Modelo>(str_SQL, arr_Parametros).FirstOrDefault();

                #region Rellenar tablas Relacionadas
                if (g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO != null)
                {
                    //reiniciar Valores de los hilos
                    for (int int_Contador = 0; int_Contador < g_int_TotalHilos_PARALISTADO; int_Contador++)
                    {
                        g_bol_Hilos_Terminados_PARALISTADO[int_Contador] = false;
                    }

                    //MAE_Empleados (Propuesto) ##########################################################################################
                    if (g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.idEmpleado_Propuesto != null)
                    {
                        ThreadStart obj_ThreadStart_EMPLEADOPROPUESTO = new ThreadStart(Obtener_EmpleadoPropuesto_PARALISTADO);
                        Thread obj_Thread_EMPLEADOPROPUESTO = new Thread(obj_ThreadStart_EMPLEADOPROPUESTO);
                        obj_Thread_EMPLEADOPROPUESTO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_PARALISTADO[0] = true;
                    }

                    //MAE_Empleados (Autorizado) ##########################################################################################
                    if (g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.idEmpleado_Autorizado != null)
                    {
                        ThreadStart obj_ThreadStart_EMPLEADOAUTORIZADO = new ThreadStart(Obtener_EmpleadoAutorizado_PARALISTADO);
                        Thread obj_Thread_EMPLEADOAUTORIZADO = new Thread(obj_ThreadStart_EMPLEADOAUTORIZADO);
                        obj_Thread_EMPLEADOAUTORIZADO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_PARALISTADO[1] = true;
                    }

                    //CTA_PredefinidosCabeceras ##########################################################################################
                    if (g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.idPredefinidoCabecera_Pago != null)
                    {
                        ThreadStart obj_ThreadStart_PREDEFINIDOCABECERA = new ThreadStart(Obtener_PredefinidoCabecera_PARALISTADO);
                        Thread obj_Thread_PREDEFINIDOCABECERA = new Thread(obj_ThreadStart_PREDEFINIDOCABECERA);
                        obj_Thread_PREDEFINIDOCABECERA.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_PARALISTADO[3] = true;
                    }

                    //MAE_TiposPAgos ##########################################################################################
                    ThreadStart obj_ThreadStart_TIPOPAGO = new ThreadStart(Obtener_TipoPago_PARALISTADO);
                    Thread obj_Thread_TIPOPAGO = new Thread(obj_ThreadStart_TIPOPAGO);
                    obj_Thread_TIPOPAGO.Start();

                    //CTG_GastosLineas ##########################################################################################
                    ThreadStart obj_ThreadStart_GASTOLINEA = new ThreadStart(Obtener_GastoLinea_PARALISTADO);
                    Thread obj_Thread_GASTOLINEA = new Thread(obj_ThreadStart_GASTOLINEA);
                    obj_Thread_GASTOLINEA.Start();

                    //Esperando a que terminen todos los hilos .........................................
                    bool bol_Termino = false;
                    while (bol_Termino == false)
                    {
                        bol_Termino = true;
                        foreach (bool bol_Termino_Hilo in g_bol_Hilos_Terminados_PARALISTADO)
                        {
                            if (bol_Termino_Hilo == false)
                            {
                                bol_Termino = false;
                                break;
                            }
                        }

                        Thread.Sleep(10);
                    }
                    //.................................................................................
                }
                #endregion

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Obtener_ParaListado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO;
        }

        #region Tablas Relacionadas
        private void Obtener_EmpleadoPropuesto_PARALISTADO()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //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_DATOSMAESTROS_PROCEDIMIENTO_MAEEMPLEADOS_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.idEmpleado_Propuesto.Value };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.MAE_Empleados = (MAE_Empleados)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_PARALISTADO[0] = true;
            }
        }
        private void Obtener_EmpleadoAutorizado_PARALISTADO()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //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_DATOSMAESTROS_PROCEDIMIENTO_MAEEMPLEADOS_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.idEmpleado_Autorizado.Value };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.MAE_Empleados1 = (MAE_Empleados)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_PARALISTADO[1] = true;
            }
        }
        private void Obtener_PredefinidoCabecera_PARALISTADO()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_CONTABILIDAD + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_CONTABILIDAD + "." + Variables.G_STR_LIBRERIA_DATOSCONTABILIDAD);
                //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_DATOSCONTABILIDAD_PROCEDIMIENTO_CTAPREDEFINIDOCABECERA_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.idPredefinidoCabecera_Pago.Value };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.CTA_PredefinidosCabeceras = (CTA_PredefinidosCabeceras)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_PARALISTADO[2] = true;
            }
        }
        private void Obtener_TipoPago_PARALISTADO()
        {
            try
            {
                //Cargamos el ensamblado
                Assembly m_assembly = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type = m_assembly.GetType(Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //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_DATOSMAESTROS_PROCEDIMIENTO_MAETIPOSPAGOS_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.idTipoPago };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.MAE_TiposPagos = (MAE_TiposPagos)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_PARALISTADO[3] = true;
            }
        }
        private void Obtener_GastoLinea_PARALISTADO()
        {
            try
            {
                CTG_GastosLineas_Datos obj_CTG_GastosLineas_Datos = new CTG_GastosLineas_Datos();
                g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.CTG_GastosLineas = obj_CTG_GastosLineas_Datos.Obtener_Modelo_Por_Id(g_mdl_INTERNO_CTG_Pagos_Listado_Modelo_PARALISTADO.idGastoLinea);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_PARALISTADO[4] = true;
            }
        }
        #endregion

        #endregion

        public string Obtener_Estado(long _lng_id)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            string str_Estado = "";

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                string str_SQL =
                         " SELECT " +
                             nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.estado) +
                       " FROM " + nameof(CTG_Pagos) +
                       " WHERE  " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fechaBorrado) + " IS null AND " +
                                    nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "=@id ";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Rellenar el Modelo
                str_Estado = obj_Exferia_Entities.Database.SqlQuery<string>(str_SQL, arr_Parametros).FirstOrDefault();

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Obtener_Estado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return str_Estado;
        }

        public INTERNO_CTG_Pagos_Volcado_Modelo Obtener_Volcado(long _lng_id)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_CTG_Pagos_Volcado_Modelo mdl_INTERNO_CTG_Pagos_Volcado_Modelo = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                string str_SQL =
                        " SELECT " +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.id) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.fecha) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fecha) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.importe) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.importe) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.estado) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.estado) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.observaciones) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.observaciones) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.fechaBorrado) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fechaBorrado) + "," +
                            //ids
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.idExpediente) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idExpediente) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.idGastoLinea) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idGastoLinea) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.idTipoPago) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idTipoPago) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.idPredefinidoCabecera_Pago) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.idEmpleado_Propuesto) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Propuesto) + "," +
                            nameof(INTERNO_CTG_Pagos_Volcado_Modelo.idEmpleado_Autorizado) + "=" + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.idEmpleado_Autorizado) + "," +
                      " FROM " + nameof(CTG_Pagos) +
                      " WHERE  " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.fechaBorrado) + " IS null AND " +
                                   nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "=@id ";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Rellenar el Modelo
                mdl_INTERNO_CTG_Pagos_Volcado_Modelo = obj_Exferia_Entities.Database.SqlQuery<INTERNO_CTG_Pagos_Volcado_Modelo>(str_SQL, arr_Parametros).FirstOrDefault();

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Obtener_Volcado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return mdl_INTERNO_CTG_Pagos_Volcado_Modelo;
        }
        #endregion

        #region MODELOS

        #region Modelo Simple
        private CTG_Pagos g_mdl_CTG_Pagos = null;

        public CTG_Pagos Obtener_Modelo_Por_Id(long _lng_id)
        {
            try
            {
                string str_SQL = Obtener_Consulta_Modelo() +
                                      //WHERE
                                      " WHERE " + nameof(CTG_Pagos) + "." + nameof(CTG_Pagos.id) + "=@id";

                //Parametros
                object[] arr_Parametros = new object[]
                {
                     new SqlParameter("@id",  _lng_id)
                };

                //Ejecutar y rellenar el modelo
                Ejecutar_Consulta_Modelo(str_SQL,
                                         arr_Parametros);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Obtener_Modelo_Por_Id), true);
            }

            return g_mdl_CTG_Pagos;
        }

        private void Ejecutar_Consulta_Modelo(string _str_SQL,
                                             object[] _arr_Parametros)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            try
            {
                //Conexion
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                //Rellenar el Modelo
                g_mdl_CTG_Pagos = obj_Exferia_Entities.Database.SqlQuery<CTG_Pagos>(_str_SQL, _arr_Parametros).FirstOrDefault();

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }
        #endregion

        private string Obtener_Consulta_Modelo()
        {
            return
                " SELECT " +
                    nameof(CTG_Pagos.id) + "," +
                    nameof(CTG_Pagos.idExpediente) + "," +
                    nameof(CTG_Pagos.idGastoLinea) + "," +
                    nameof(CTG_Pagos.idTipoPago) + "," +
                    nameof(CTG_Pagos.fecha) + "," +
                    nameof(CTG_Pagos.importe) + "," +
                    nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + "," +
                    nameof(CTG_Pagos.idEmpleado_Propuesto) + "," +
                    nameof(CTG_Pagos.idEmpleado_Autorizado) + "," +
                    nameof(CTG_Pagos.observaciones) + "," +
                    nameof(CTG_Pagos.estado) + "," +
                    nameof(CTG_Pagos.fechaBorrado) +
                " FROM " + nameof(CTG_Pagos);
        }
        #endregion

        #region Grabar
        public override INTERNO_ValorDevuelto_Modelo Grabar(object _mdl_obj)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();

                CTG_Pagos mdl_CTG_Pagos_AGrabar = (CTG_Pagos)_mdl_obj;
                CTG_Pagos mdl_CTG_Pagos_DatosViejos = new CTG_Pagos();

                // Ver si existe ######################################################################
                CTG_Pagos mdl_CTG_Pagos_Final = Obtener_Modelo_Por_Id(mdl_CTG_Pagos_AGrabar.id);
                //######################################################################################

                //UPDATE
                if (mdl_CTG_Pagos_Final != null)
                {
                    //Tipo de Accion que se va a realizar
                    mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_MODIFICAR;

                    //Datos viejos para la trazabilidad
                    Funciones.CopiarPropiedadesObjetos(mdl_CTG_Pagos_Final, mdl_CTG_Pagos_DatosViejos, false, false);

                    // Cargar los Datos Nuevos del Modelo
                    Funciones.CopiarPropiedadesObjetos(mdl_CTG_Pagos_AGrabar, mdl_CTG_Pagos_Final, false, false);

                    #region Update
                    string str_SQL_Update = " UPDATE " + nameof(CTG_Pagos) +
                                           " SET " +
                                               nameof(CTG_Pagos.idExpediente) + "=@idExpediente," +
                                               nameof(CTG_Pagos.idGastoLinea) + "=@idGastoLinea," +
                                               nameof(CTG_Pagos.idTipoPago) + "=@idTipoPago," +
                                               nameof(CTG_Pagos.fecha) + "=@fecha," +
                                               nameof(CTG_Pagos.importe) + "=@importe," +
                                               nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + "=@idPredefinidoCabecera_Pago," +
                                               nameof(CTG_Pagos.idEmpleado_Propuesto) + "=@idEmpleado_Propuesto," +
                                               nameof(CTG_Pagos.idEmpleado_Autorizado) + "=@idEmpleado_Autorizado," +
                                               nameof(CTG_Pagos.observaciones) + "=@observaciones," +
                                               nameof(CTG_Pagos.estado) + "=@estado," +
                                               nameof(CTG_Pagos.fechaBorrado) + "=@fechaBorrado" +
                                           " WHERE " +
                                               nameof(CTG_Pagos.id) + "=@id";

                    //Parametros
                    object[] arr_Parametros_Update = new object[]
                    {
                         new SqlParameter("@idExpediente",  mdl_CTG_Pagos_Final.idExpediente),
                         new SqlParameter("@idGastoLinea",  mdl_CTG_Pagos_Final.idGastoLinea),
                         new SqlParameter("@idTipoPago",  mdl_CTG_Pagos_Final.idTipoPago),
                         new SqlParameter("@fecha",  mdl_CTG_Pagos_Final.fecha),
                         new SqlParameter("@importe",  mdl_CTG_Pagos_Final.importe),
                         mdl_CTG_Pagos_Final.idPredefinidoCabecera_Pago != null
                            ?   new SqlParameter("@idPredefinidoCabecera_Pago", mdl_CTG_Pagos_Final.idPredefinidoCabecera_Pago.Value)
                            :   new SqlParameter("@idPredefinidoCabecera_Pago",  DBNull.Value),
                         mdl_CTG_Pagos_Final.idEmpleado_Propuesto != null
                            ?   new SqlParameter("@idEmpleado_Propuesto", mdl_CTG_Pagos_Final.idEmpleado_Propuesto.Value)
                            :   new SqlParameter("@idEmpleado_Propuesto",  DBNull.Value),
                         mdl_CTG_Pagos_Final.idEmpleado_Autorizado != null
                            ?   new SqlParameter("@idEmpleado_Autorizado", mdl_CTG_Pagos_Final.idEmpleado_Autorizado.Value)
                            :   new SqlParameter("@idEmpleado_Autorizado",  DBNull.Value),
                         mdl_CTG_Pagos_Final.observaciones != null
                            ?   new SqlParameter("@observaciones", mdl_CTG_Pagos_Final.observaciones)
                            :   new SqlParameter("@observaciones",  DBNull.Value),
                         mdl_CTG_Pagos_Final.estado != null
                            ?   new SqlParameter("@estado", mdl_CTG_Pagos_Final.estado)
                            :   new SqlParameter("@estado",  DBNull.Value),
                         mdl_CTG_Pagos_Final.fechaBorrado != null
                            ?   new SqlParameter("@fechaBorrado", mdl_CTG_Pagos_Final.fechaBorrado.Value)
                            :   new SqlParameter("@fechaBorrado",  DBNull.Value),
                         new SqlParameter("@id",  mdl_CTG_Pagos_Final.id)
                    };
                    #endregion

                    //Update
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Update, arr_Parametros_Update);

                    //Id de la tabla
                    mdl_INTERNO_ValorDevuelto_Modelo.Id = mdl_CTG_Pagos_Final.id;
                }
                //INSERT
                else
                {
                    mdl_CTG_Pagos_Final = new CTG_Pagos();

                    //Tipo de Accion que se va a realizar
                    mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_INSERTAR;

                    // Cargar los Datos del Modelo
                    Funciones.CopiarPropiedadesObjetos(mdl_CTG_Pagos_AGrabar, mdl_CTG_Pagos_Final, false, false);


                    #region INSERT
                    string str_SQL_Insert = " INSERT INTO " + nameof(CTG_Pagos) +
                                              " (" +
                                                       nameof(CTG_Pagos.idExpediente) + "," +
                                                       nameof(CTG_Pagos.idGastoLinea) + "," +
                                                       nameof(CTG_Pagos.idTipoPago) + "," +
                                                       nameof(CTG_Pagos.fecha) + "," +
                                                       nameof(CTG_Pagos.importe) + "," +
                                                       nameof(CTG_Pagos.idPredefinidoCabecera_Pago) + "," +
                                                       nameof(CTG_Pagos.idEmpleado_Propuesto) + "," +
                                                       nameof(CTG_Pagos.idEmpleado_Autorizado) + "," +
                                                       nameof(CTG_Pagos.observaciones) + "," +
                                                       nameof(CTG_Pagos.estado) + "," +
                                                       nameof(CTG_Pagos.fechaBorrado) +
                                              " ) " +
                                              " OUTPUT INSERTED." + nameof(CTG_Pagos.id) +
                                              " VALUES " +
                                              " ( " +
                                                   "@idExpediente," +
                                                   "@idGastoLinea," +
                                                   "@idTipoPago," +
                                                   "@fecha," +
                                                   "@importe," +
                                                   "@idPredefinidoCabecera_Pago," +
                                                   "@idEmpleado_Propuesto," +
                                                   "@idEmpleado_Autorizado," +
                                                   "@observaciones," +
                                                   "@estado," +
                                                   "@fechaBorrado" +
                                              " ) ";

                    //Parametros
                    object[] arr_Parametros_Insert = new object[]
                    {
                        new SqlParameter("@idExpediente",  mdl_CTG_Pagos_Final.idExpediente),
                         new SqlParameter("@idGastoLinea",  mdl_CTG_Pagos_Final.idGastoLinea),
                         new SqlParameter("@idTipoPago",  mdl_CTG_Pagos_Final.idTipoPago),
                         new SqlParameter("@fecha",  mdl_CTG_Pagos_Final.fecha),
                         new SqlParameter("@importe",  mdl_CTG_Pagos_Final.importe),
                         mdl_CTG_Pagos_Final.idPredefinidoCabecera_Pago != null
                            ?   new SqlParameter("@idPredefinidoCabecera_Pago", mdl_CTG_Pagos_Final.idPredefinidoCabecera_Pago.Value)
                            :   new SqlParameter("@idPredefinidoCabecera_Pago",  DBNull.Value),
                         mdl_CTG_Pagos_Final.idEmpleado_Propuesto != null
                            ?   new SqlParameter("@idEmpleado_Propuesto", mdl_CTG_Pagos_Final.idEmpleado_Propuesto.Value)
                            :   new SqlParameter("@idEmpleado_Propuesto",  DBNull.Value),
                         mdl_CTG_Pagos_Final.idEmpleado_Autorizado != null
                            ?   new SqlParameter("@idEmpleado_Autorizado", mdl_CTG_Pagos_Final.idEmpleado_Autorizado.Value)
                            :   new SqlParameter("@idEmpleado_Autorizado",  DBNull.Value),
                         mdl_CTG_Pagos_Final.observaciones != null
                            ?   new SqlParameter("@observaciones", mdl_CTG_Pagos_Final.observaciones)
                            :   new SqlParameter("@observaciones",  DBNull.Value),
                         mdl_CTG_Pagos_Final.estado != null
                            ?   new SqlParameter("@estado", mdl_CTG_Pagos_Final.estado)
                            :   new SqlParameter("@estado",  DBNull.Value),
                         mdl_CTG_Pagos_Final.fechaBorrado != null
                            ?   new SqlParameter("@fechaBorrado", mdl_CTG_Pagos_Final.fechaBorrado.Value)
                            :   new SqlParameter("@fechaBorrado",  DBNull.Value)
                    };
                    #endregion

                    //Id de la tabla
                    mdl_INTERNO_ValorDevuelto_Modelo.Id = obj_Exferia_Entities.Database.SqlQuery<long>(str_SQL_Insert, arr_Parametros_Insert).Single();
                }

                // Grabar un registro de trazabilidad con los datos de la transaccion realizada.
                Datos_Generales.USR_Trazabilidad_Grabar(typeof(CTG_Pagos), mdl_CTG_Pagos_DatosViejos, mdl_CTG_Pagos_Final, mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion, obj_Exferia_Entities);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Grabar), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

        #region Borrar
        public override INTERNO_ValorDevuelto_Modelo Borrar(long _lng_id)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;
            //Tipo de Accion que se va a realizar
            mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                // Ver si existe ######################################################################
                CTG_Pagos mdl_CTG_Pagos_Final = Obtener_Modelo_Por_Id(_lng_id);
                //######################################################################################

                if (mdl_CTG_Pagos_Final != null)
                {
                    #region Update
                    string str_SQL_Update = " UPDATE " + nameof(CTG_Pagos) +
                                                " SET " +
                                                nameof(CTG_Pagos.fechaBorrado) + "=@fechaBorrado " +
                                            " WHERE " +
                                                nameof(CTG_Pagos.id) + "=@id";
                    //Parametros
                    object[] arr_Parametros_Update = new object[]
                    {
                        new SqlParameter("@fechaBorrado",  DateTime.Now),
                        new SqlParameter("@id", _lng_id)
                    };
                    #endregion

                    //Update
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Update, arr_Parametros_Update);

                    //Grabar un registro de trazabilidad con los datos de la transaccion realizada
                    Datos_Generales.USR_Trazabilidad_Grabar(typeof(CTG_Pagos), null, mdl_CTG_Pagos_Final, Enumerados.G_ENUM_TIPOACCION.INT_ELIMINAR, obj_Exferia_Entities);
                }

                //Devolver tambien el Objeto
                mdl_ValorDevuelto_Modelo.Id = _lng_id;
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Borrar), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(long _lng_id, long _lng_idAuxiliar)
        {
            throw new NotImplementedException();
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(object _mdl_obj)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            INTERNO_ValorDevuelto_Modelo mdl_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                List<long> lst_idPago = (List<long>)_mdl_obj;

                if (lst_idPago != null & lst_idPago.Count > 0)
                {
                    DateTime dtt_FechaActual = DateTime.Now;

                    //Coger los ids y ponerlos de forma que sirva para la consulta
                    string str_Filtros_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(lst_idPago);

                    string str_SQL = " UPDATE " + nameof(CTG_Pagos) +
                                        " SET " + nameof(CTG_Pagos.fechaBorrado) + "='" + dtt_FechaActual + "' " +
                                     " WHERE " + nameof(CTG_Pagos.id) + " in (" + str_Filtros_IDS + ")";

                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL);
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(CTG_Pagos_Datos) + "/" + nameof(Borrar), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion

    }
}
