using Exferia_Aplicacion.Calculos.VentasCompras;
using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Herencia.Capas;
using Exferia_EntityFramework;
using Exferia_General;
using Exferia_Ventas._0_Modelos;
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 System.Transactions;
using static Exferia_Aplicacion.General.Enumerados;

namespace Exferia_Ventas._1_Datos
{
    public class VTA_PresupuestosLineas_Datos : ABS_Datos
    {
        #region Listado
        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)
        {
            return null;
        }
        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)
        {
            return null;
        }
        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)
        { }

        #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)
        {
            List<dynamic> lst_MAE = null;

            try
            {

                // Consulta .....................................................
                ConsultaRellenar_Listado_Secundario(null, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(VTA_PresupuestosLineas).Name), _lst_CamposConRelacionABuscar, -1, null, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if ((g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO != null) && (g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Count() > 0))
                {
                    lst_MAE = g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_Listado_Secundario), true);
            }

            return lst_MAE;
        }
        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_ids)
        {
            dynamic dnm_MAE = null;

            try
            {
                // Consulta .....................................................
                ConsultaRellenar_Listado_Secundario(null, _lng_idEmpresaSeleccionada, _lng_idEjercicioActual, Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresaSeleccionada, typeof(VTA_PresupuestosLineas).Name), _lst_CamposConRelacionABuscar, _lng_id, _lst_ids, _lst_INTERNO_Filtro_OpcionPadre_Modelo, _lst_INTERNO_Filtro_Modelo);
                // ..............................................................

                if ((g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO != null) && (g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Count() > 0))
                {
                    dnm_MAE = g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_RegistroListado_Secundario), true);
            }

            return dnm_MAE;
        }
        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)
        {
            try
            {
                //Datos del Padre si los tuviera .........................
                long lng_idCliente = -1;
                string str_Opcion_Cliente = "";

                long lng_idArticulo = -1;
                string str_Opcion_Articulo = "";

                long lng_idArticuloComodin = -1;
                string str_Opcion_ArticuloComodin = "";

                if (_lst_INTERNO_Filtro_OpcionPadre_Modelo != null && _lst_INTERNO_Filtro_OpcionPadre_Modelo.Count > 0)
                {
                    foreach (INTERNO_Filtro_OpcionPadre_Modelo mdl_INTERNO_Filtro_OpcionPadre_Modelo in _lst_INTERNO_Filtro_OpcionPadre_Modelo)
                    {
                        //CLIENTE
                        if (mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO.Equals(Variables.G_STR_OPCION_MAE_CLIENTE))
                        {
                            str_Opcion_Cliente = mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO;
                            lng_idCliente = mdl_INTERNO_Filtro_OpcionPadre_Modelo.VALOR;
                        }
                        //ARTICULO
                        else if (mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO.Equals(Variables.G_STR_OPCION_MAE_ARTICULO))
                        {
                            lng_idArticulo = mdl_INTERNO_Filtro_OpcionPadre_Modelo.VALOR;
                            str_Opcion_Articulo = mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO;
                        }
                        //ARTICULOCOMODIN
                        else if (mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO.Equals(Variables.G_STR_OPCION_MAE_ARTICULOCOMODIN))
                        {
                            lng_idArticuloComodin = mdl_INTERNO_Filtro_OpcionPadre_Modelo.VALOR;
                            str_Opcion_ArticuloComodin = mdl_INTERNO_Filtro_OpcionPadre_Modelo.NOMBRE_CAMPO;
                        }
                    }
                }

                //Si tiene filto por articulo y por articulo comodin y los dos estan a -1 se deja solo uno
                if (str_Opcion_Articulo.Trim().Length > 0 &&
                    str_Opcion_ArticuloComodin.Trim().Length > 0)
                {
                    if (lng_idArticulo == -1 &&
                        lng_idArticuloComodin > -1)
                    {
                        str_Opcion_Articulo = "";
                    }
                    else if (lng_idArticuloComodin == -1 &&
                             lng_idArticulo > -1)
                    {
                        str_Opcion_ArticuloComodin = "";
                    }
                    else
                    {
                        str_Opcion_ArticuloComodin = "";
                    }
                }

                string str_Filtro_PresupuestosLineas = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(VTA_PresupuestosLineas),
                                                                                                nameof(VTA_PresupuestosLineas.id),
                                                                                                G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.AND_FIN,
                                                                                                _lst_ids);

                string str_SQL = Obtener_Consulta_Para_Listado() +
                            " WHERE " +
                                nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.fechaBorrado) + " IS null AND " +
                                str_Filtro_PresupuestosLineas +
                                (
                                    _lng_id > -1
                                        ? (nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.id) + " = " + _lng_id)
                                        : " 1 = 1  "
                                )
                                + " AND " +
                                //Articulo
                                (
                                    str_Opcion_Articulo != ""
                                        ? (
                                                "( not " + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticulo) + " is null) and  " +
                                                nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticulo) + " = " + lng_idArticulo
                                            )
                                        : " 1 = 1  "
                                )
                                + " AND " +
                                //Articulo Comodin
                                (
                                    str_Opcion_ArticuloComodin != ""
                                        ? (
                                                "( not " + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticuloComodin) + " is null) and  " +
                                                nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticuloComodin) + " = " + lng_idArticuloComodin
                                            )
                                        : " 1 = 1  "
                                )
                                + " AND " +
                                //Cliente
                                (
                                    str_Opcion_Cliente != ""
                                        ? (
                                            " ( " +
                                                //PEDIDO
                                                " ( " +
                                                    "( not " + nameof(VTA_PresupuestosCabecera) + "." + nameof(VTA_PresupuestosCabecera.idCliente) + " is null) and  " +
                                                    nameof(VTA_PresupuestosCabecera) + "." + nameof(VTA_PresupuestosCabecera.idCliente) + " = " + lng_idCliente +
                                                " ) " +
                                            " ) "
                                            )
                                        : " 1 = 1  "
                                );



                Ejecutar_Consulta_Modelo_Listado_PARALISTADO(str_SQL,
                                                            new object[] { });



            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(ConsultaRellenar_Listado_Secundario), true);
            }
        }
        #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)
        {
            return null;
        }
        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)
        {
            return null;
        }
        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 = 14;
        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(INTERNO_VTA_PresupuestosLineas_Modelo.id) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.id) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idTipoCompraVenta) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idTipoCompraVenta) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idPresupuestoCabecera) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.id) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idArticulo) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticulo) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idArticuloComodin) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticuloComodin) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idAlmacen) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idAlmacen) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idUbicacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idUbicacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idEmbalaje) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.segundaUnidad_idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_idEmbalaje) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idNomenclaturaPrecio) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idNomenclaturaPrecio) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idImpuestoTipo) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idImpuestoTipo) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idPresupuestoLinea_Padre) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_idEmbalaje) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje) + " , " +
                        //Otros
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.numeroLinea) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.numeroLinea) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.descripcionArticuloComodin) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.descripcionArticuloComodin) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.cantidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.cantidad) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.relacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.relacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.operacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.operacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.segundaUnidad_relacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_relacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.segundaUnidad_cantidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_cantidad) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.precio) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.precio) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.numeroRedondeo) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.numeroRedondeo) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.descuentoGeneral) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.descuentoGeneral) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.importe) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.importe) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_relacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_relacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_operacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_operacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_precio) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_precio) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.fechaBorrado) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.fechaBorrado) +
                  " FROM " + nameof(VTA_PresupuestosLineas) +
                  " WHERE " + nameof(VTA_PresupuestosLineas.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<INTERNO_VTA_PresupuestosLineas_Modelo>(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;
                    }

                    //MAE_Articulos ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idArticulo != null)
                    {
                        ThreadStart obj_ThreadStart_ARTICULO = new ThreadStart(Obtener_Articulo_Modelo_OBTENER);
                        Thread obj_Thread_ARTICULO = new Thread(obj_ThreadStart_ARTICULO);
                        obj_Thread_ARTICULO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[0] = true;
                    }

                    //MAE_ArticulosComodin ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idArticuloComodin != null)
                    {
                        ThreadStart obj_ThreadStart_ARTICULOCOMODIN = new ThreadStart(Obtener_ArticuloComodin_Modelo_OBTENER);
                        Thread obj_Thread_ARTICULOCOMODIN = new Thread(obj_ThreadStart_ARTICULOCOMODIN);
                        obj_Thread_ARTICULOCOMODIN.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[1] = true;
                    }

                    //GEN_Almacenes ##########################################################################################
                    ThreadStart obj_ThreadStart_ALMACEN = new ThreadStart(Obtener_Almacen_Modelo_OBTENER);
                    Thread obj_Thread_ALMACEN = new Thread(obj_ThreadStart_ALMACEN);
                    obj_Thread_ALMACEN.Start();


                    //MAE_Embalajes ##########################################################################################
                    ThreadStart obj_ThreadStart_EMBALAJE = new ThreadStart(Obtener_Embalaje_Modelo_OBTENER);
                    Thread obj_Thread_EMBALAJE = new Thread(obj_ThreadStart_EMBALAJE);
                    obj_Thread_EMBALAJE.Start();


                    //MAE_Embalajes1 ##########################################################################################
                    if (g_dnm_Modelo_Obtener.segundaUnidad_idEmbalaje != null)
                    {
                        ThreadStart obj_ThreadStart_EMBALAJESEGUNDAUNIDAD = new ThreadStart(Obtener_EmbalajeSegundaUnidad_Modelo_OBTENER);
                        Thread obj_Thread_EMBALAJESEGUNDAUNIDAD = new Thread(obj_ThreadStart_EMBALAJESEGUNDAUNIDAD);
                        obj_Thread_EMBALAJESEGUNDAUNIDAD.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[4] = true;
                    }

                    //GEN_TiposCompraVenta ##########################################################################################
                    ThreadStart obj_ThreadStart_TIPOCOMPRAVENTA = new ThreadStart(Obtener_TipoCompraVenta_Modelo_OBTENER);
                    Thread obj_Thread_TIPOCOMPRAVENTA = new Thread(obj_ThreadStart_TIPOCOMPRAVENTA);
                    obj_Thread_TIPOCOMPRAVENTA.Start();

                    //MAE_NomenclaturasPrecios ##########################################################################################
                    ThreadStart obj_ThreadStart_NOMENCLATURAPRECIO = new ThreadStart(Obtener_Nomenclaturaprecio_Modelo_OBTENER);
                    Thread obj_Thread_NOMENCLATURAPRECIO = new Thread(obj_ThreadStart_NOMENCLATURAPRECIO);
                    obj_Thread_NOMENCLATURAPRECIO.Start();

                    //GEN_ImpuestosTipos ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idImpuestoTipo != null)
                    {
                        ThreadStart obj_ThreadStart_IMPUESTOTIPO = new ThreadStart(Obtener_ImpuestoTipo_Modelo_OBTENER);
                        Thread obj_Thread_IMPUESTOTIPO = new Thread(obj_ThreadStart_IMPUESTOTIPO);
                        obj_Thread_IMPUESTOTIPO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[7] = true;
                    }

                    //MAE_Embalajes2 ##########################################################################################
                    ThreadStart obj_ThreadStart_ARTICULOPRINCIPALEMBALAJE = new ThreadStart(Obtener_ArticuloPrincipalEmbalaje_Modelo_OBTENER);
                    Thread obj_Thread_ARTICULOPRINCIPALEMBALAJE = new Thread(obj_ThreadStart_ARTICULOPRINCIPALEMBALAJE);
                    obj_Thread_ARTICULOPRINCIPALEMBALAJE.Start();


                    //MAE_Embalajes3 ##########################################################################################
                    if (g_dnm_Modelo_Obtener.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje != null)
                    {
                        ThreadStart obj_ThreadStart_ARTICULOPRINCIPALEMBALAJESEGUNDAUNIDAD = new ThreadStart(Obtener_ArticuloPrincipalEmbalajeSegundaUnidad_Modelo_OBTENER);
                        Thread obj_Thread_ARTICULOPRINCIPALEMBALAJESEGUNDAUNIDAD = new Thread(obj_ThreadStart_ARTICULOPRINCIPALEMBALAJESEGUNDAUNIDAD);
                        obj_Thread_ARTICULOPRINCIPALEMBALAJESEGUNDAUNIDAD.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[9] = true;
                    }

                    //VTA_PresupuestosLineas_Comentarios ##########################################################################################
                    ThreadStart obj_ThreadStart_COMENTARIOS = new ThreadStart(Obtener_Comentarios_Modelo_OBTENER);
                    Thread obj_Thread_COMENTARIOS = new Thread(obj_ThreadStart_COMENTARIOS);
                    obj_Thread_COMENTARIOS.Start();

                    //VTA_PresupuestosLineas_TarifasPromociones ##########################################################################################
                    ThreadStart obj_ThreadStart_TARIFASPROMOCIONES = new ThreadStart(Obtener_TarifasPromociones_Modelo_OBTENER);
                    Thread obj_Thread_TARIFASPROMOCIONES = new Thread(obj_ThreadStart_TARIFASPROMOCIONES);
                    obj_Thread_TARIFASPROMOCIONES.Start();

                    //VTA_PresupuestosLineas (En Promocion) ##########################################################################################
                    ThreadStart obj_ThreadStart_ENPROMOCION = new ThreadStart(Obtener_EnPromocion_Modelo_OBTENER);
                    Thread obj_Thread_ENPROMOCION = new Thread(obj_ThreadStart_ENPROMOCION);
                    obj_Thread_ENPROMOCION.Start();

                    //MAE_Ubicaciones ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idUbicacion != null)
                    {
                        ThreadStart obj_ThreadStart_UBICACION = new ThreadStart(Obtener_Ubicacion_Modelo_OBTENER);
                        Thread obj_Thread_UBICACION = new Thread(obj_ThreadStart_UBICACION);
                        obj_Thread_UBICACION.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[13] = 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(VTA_PresupuestosLineas_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_Articulo_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_MAEARTICULOS_OBTENER_MODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.idArticulo };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_Articulos = (MAE_Articulos)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[0] = true;
            }
        }
        private void Obtener_ArticuloComodin_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_MAEARTICULOSCOMODIN_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.idArticuloComodin };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_ArticulosComodin = (MAE_ArticulosComodin)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[1] = true;
            }
        }
        private void Obtener_Almacen_Modelo_OBTENER()
        {
            try
            {
                g_dnm_Modelo_Obtener.GEN_Almacenes = Datos_Generales.GEN_Almacenes_Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idAlmacen);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[2] = true;
            }
        }
        private void Obtener_Embalaje_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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.idEmbalaje };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_Embalajes = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[3] = true;
            }
        }
        private void Obtener_EmbalajeSegundaUnidad_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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.segundaUnidad_idEmbalaje };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_Embalajes1 = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[4] = true;
            }
        }
        private void Obtener_TipoCompraVenta_Modelo_OBTENER()
        {
            try
            {
                g_dnm_Modelo_Obtener.GEN_TiposCompraVenta = Datos_Generales.GEN_TiposCompraVenta_Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idTipoCompraVenta);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[5] = true;
            }
        }
        private void Obtener_Nomenclaturaprecio_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_MAENOMENCLATURASPRECIOS_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.idNomenclaturaPrecio };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_NomenclaturasPrecios = (MAE_NomenclaturasPrecios)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[6] = true;
            }
        }
        private void Obtener_ImpuestoTipo_Modelo_OBTENER()
        {
            try
            {
                g_dnm_Modelo_Obtener.GEN_ImpuestosTipos = Datos_Generales.GEN_ImpuestosTipos_Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idImpuestoTipo);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[7] = true;
            }
        }
        private void Obtener_ArticuloPrincipalEmbalaje_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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.embalajePrincipalDelArticulo_idEmbalaje };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_Embalajes2 = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[8] = true;
            }
        }
        private void Obtener_ArticuloPrincipalEmbalajeSegundaUnidad_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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_Embalajes3 = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[9] = true;
            }
        }
        private void Obtener_Comentarios_Modelo_OBTENER()
        {
            try
            {
                VTA_PresupuestosLineas_Comentarios_Datos obj_VTA_PresupuestosLineas_Comentarios_Datos = new VTA_PresupuestosLineas_Comentarios_Datos();
                g_dnm_Modelo_Obtener.VTA_PresupuestosLineas_Comentarios = obj_VTA_PresupuestosLineas_Comentarios_Datos.Obtener_ModeloListado_Por_PresupuestoLinea(g_dnm_Modelo_Obtener.id);

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[10] = true;
            }
        }
        private void Obtener_TarifasPromociones_Modelo_OBTENER()
        {
            try
            {
                VTA_PresupuestosLineas_TarifasPromociones_Datos obj_VTA_PresupuestosLineas_TarifasPromociones_Datos = new VTA_PresupuestosLineas_TarifasPromociones_Datos();
                g_dnm_Modelo_Obtener.TarifasPromociones = obj_VTA_PresupuestosLineas_TarifasPromociones_Datos.Obtener_Listado(g_dnm_Modelo_Obtener.id);

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[11] = true;
            }
        }
        private void Obtener_EnPromocion_Modelo_OBTENER()
        {
            try
            {
                g_dnm_Modelo_Obtener.Linea_EnPromocion = Obtener_EnPromocion(g_dnm_Modelo_Obtener.id);

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[12] = true;
            }
        }
        private void Obtener_Ubicacion_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_MAEUBICACIONES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_dnm_Modelo_Obtener.idUbicacion };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_dnm_Modelo_Obtener.MAE_Ubicaciones = (MAE_Ubicaciones)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[13] = 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 En Promocion
        private INTERNO_VTA_PresupuestosLineas_Modelo g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION = null;

        private static int g_int_TotalHilos_Obtener_ENPROMOCION = 12;
        private bool[] g_bol_Hilos_Terminados_Obtener_ENPROMOCION = new bool[g_int_TotalHilos_Obtener_ENPROMOCION];

        public INTERNO_VTA_PresupuestosLineas_Modelo Obtener_EnPromocion(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_VTA_PresupuestosLineas_Modelo.id) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.id) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idTipoCompraVenta) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idTipoCompraVenta) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idPresupuestoCabecera) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.id) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idArticulo) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticulo) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idArticuloComodin) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticuloComodin) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idAlmacen) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idAlmacen) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idUbicacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idUbicacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idEmbalaje) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.segundaUnidad_idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_idEmbalaje) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idNomenclaturaPrecio) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idNomenclaturaPrecio) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idImpuestoTipo) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idImpuestoTipo) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.idPresupuestoLinea_Padre) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_idEmbalaje) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje) + " , " +
                        //Otros
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.numeroLinea) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.numeroLinea) + " , " +
                         nameof(INTERNO_VTA_PresupuestosLineas_Modelo.descripcionArticuloComodin) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.descripcionArticuloComodin) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.cantidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.cantidad) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.relacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.relacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.operacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.operacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.segundaUnidad_relacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_relacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.segundaUnidad_cantidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_cantidad) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.precio) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.precio) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.numeroRedondeo) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.numeroRedondeo) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.descuentoGeneral) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.descuentoGeneral) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.importe) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.importe) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_relacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_relacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_operacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_operacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_precio) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_precio) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.embalajePrincipalDelArticulo_segundaUnidad_relacion) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion) + " , " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Modelo.fechaBorrado) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.fechaBorrado) +
                  " FROM " + nameof(VTA_PresupuestosLineas) +
                  " WHERE " + nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + "=@id";

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

                //Rellenar el Modelo
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION = obj_Exferia_Entities.Database.SqlQuery<INTERNO_VTA_PresupuestosLineas_Modelo>(str_SQL, arr_Parametros).FirstOrDefault();
                
                #region Rellenar Tablas Relacionadas
                if (g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION != null)
                {
                    //reiniciar Valores de los hilos
                    for (int int_Contador = 0; int_Contador < g_int_TotalHilos_Obtener_ENPROMOCION; int_Contador++)
                    {
                        g_bol_Hilos_Terminados_Obtener_ENPROMOCION[int_Contador] = false;
                    }

                    //MAE_Articulos ##########################################################################################
                    if (g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idArticulo != null)
                    {
                        ThreadStart obj_ThreadStart_ARTICULO = new ThreadStart(Obtener_Articulo_Modelo_ENPROMOCION);
                        Thread obj_Thread_ARTICULO = new Thread(obj_ThreadStart_ARTICULO);
                        obj_Thread_ARTICULO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener_ENPROMOCION[0] = true;
                    }

                    //MAE_ArticulosComodin ##########################################################################################
                    if (g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idArticuloComodin != null)
                    {
                        ThreadStart obj_ThreadStart_ARTICULOCOMODIN = new ThreadStart(Obtener_ArticuloComodin_Modelo_ENPROMOCION);
                        Thread obj_Thread_ARTICULOCOMODIN = new Thread(obj_ThreadStart_ARTICULOCOMODIN);
                        obj_Thread_ARTICULOCOMODIN.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener_ENPROMOCION[1] = true;
                    }

                    //GEN_Almacenes ##########################################################################################
                    ThreadStart obj_ThreadStart_ALMACEN = new ThreadStart(Obtener_Almacen_Modelo_ENPROMOCION);
                    Thread obj_Thread_ALMACEN = new Thread(obj_ThreadStart_ALMACEN);
                    obj_Thread_ALMACEN.Start();


                    //MAE_Embalajes ##########################################################################################
                    ThreadStart obj_ThreadStart_EMBALAJE = new ThreadStart(Obtener_Embalaje_Modelo_ENPROMOCION);
                    Thread obj_Thread_EMBALAJE = new Thread(obj_ThreadStart_EMBALAJE);
                    obj_Thread_EMBALAJE.Start();


                    //MAE_Embalajes1 ##########################################################################################
                    if (g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.segundaUnidad_idEmbalaje != null)
                    {
                        ThreadStart obj_ThreadStart_EMBALAJESEGUNDAUNIDAD = new ThreadStart(Obtener_EmbalajeSegundaUnidad_Modelo_ENPROMOCION);
                        Thread obj_Thread_EMBALAJESEGUNDAUNIDAD = new Thread(obj_ThreadStart_EMBALAJESEGUNDAUNIDAD);
                        obj_Thread_EMBALAJESEGUNDAUNIDAD.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener_ENPROMOCION[4] = true;
                    }

                    //GEN_TiposCompraVenta ##########################################################################################
                    ThreadStart obj_ThreadStart_TIPOCOMPRAVENTA = new ThreadStart(Obtener_TipoCompraVenta_Modelo_ENPROMOCION);
                    Thread obj_Thread_TIPOCOMPRAVENTA = new Thread(obj_ThreadStart_TIPOCOMPRAVENTA);
                    obj_Thread_TIPOCOMPRAVENTA.Start();

                    //MAE_NomenclaturasPrecios ##########################################################################################
                    ThreadStart obj_ThreadStart_NOMENCLATURAPRECIO = new ThreadStart(Obtener_Nomenclaturaprecio_Modelo_ENPROMOCION);
                    Thread obj_Thread_NOMENCLATURAPRECIO = new Thread(obj_ThreadStart_NOMENCLATURAPRECIO);
                    obj_Thread_NOMENCLATURAPRECIO.Start();

                    //GEN_ImpuestosTipos ##########################################################################################
                    if (g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idImpuestoTipo != null)
                    {
                        ThreadStart obj_ThreadStart_IMPUESTOTIPO = new ThreadStart(Obtener_ImpuestoTipo_Modelo_ENPROMOCION);
                        Thread obj_Thread_IMPUESTOTIPO = new Thread(obj_ThreadStart_IMPUESTOTIPO);
                        obj_Thread_IMPUESTOTIPO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener_ENPROMOCION[7] = true;
                    }

                    //MAE_Embalajes2 ##########################################################################################
                    ThreadStart obj_ThreadStart_ARTICULOPRINCIPALEMBALAJE = new ThreadStart(Obtener_ArticuloPrincipalEmbalaje_Modelo_ENPROMOCION);
                    Thread obj_Thread_ARTICULOPRINCIPALEMBALAJE = new Thread(obj_ThreadStart_ARTICULOPRINCIPALEMBALAJE);
                    obj_Thread_ARTICULOPRINCIPALEMBALAJE.Start();


                    //MAE_Embalajes3 ##########################################################################################
                    if (g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje != null)
                    {
                        ThreadStart obj_ThreadStart_ARTICULOPRINCIPALEMBALAJESEGUNDAUNIDAD = new ThreadStart(Obtener_ArticuloPrincipalEmbalajeSegundaUnidad_Modelo_ENPROMOCION);
                        Thread obj_Thread_ARTICULOPRINCIPALEMBALAJESEGUNDAUNIDAD = new Thread(obj_ThreadStart_ARTICULOPRINCIPALEMBALAJESEGUNDAUNIDAD);
                        obj_Thread_ARTICULOPRINCIPALEMBALAJESEGUNDAUNIDAD.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener_ENPROMOCION[9] = true;
                    }

                    //VTA_PresupuestosLineas_Comentarios ##########################################################################################
                    ThreadStart obj_ThreadStart_COMENTARIOS = new ThreadStart(Obtener_Comentarios_Modelo_ENPROMOCION);
                    Thread obj_Thread_COMENTARIOS = new Thread(obj_ThreadStart_COMENTARIOS);
                    obj_Thread_COMENTARIOS.Start();

                    //MAE_Ubicaciones ##########################################################################################
                    if (g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idUbicacion != null)
                    {
                        ThreadStart obj_ThreadStart_UBICACION = new ThreadStart(Obtener_Ubicacion_Modelo_ENPROMOCION);
                        Thread obj_Thread_UBICACION = new Thread(obj_ThreadStart_UBICACION);
                        obj_Thread_UBICACION.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener_ENPROMOCION[11] = 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_ENPROMOCION)
                        {
                            if (bol_Termino_Hilo == false)
                            {
                                bol_Termino = false;
                                break;
                            }
                        }

                        Thread.Sleep(10);
                    }
                    //.................................................................................
                }
                #endregion
                            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_EnPromocion), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION;
        }

        #region Tablas Relacionadas

        private void Obtener_Articulo_Modelo_ENPROMOCION()
        {
            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_MAEARTICULOS_OBTENER_MODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idArticulo.Value };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.MAE_Articulos = (MAE_Articulos)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[0] = true;
            }
        }
        private void Obtener_ArticuloComodin_Modelo_ENPROMOCION()
        {
            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_MAEARTICULOSCOMODIN_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idArticuloComodin.Value };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.MAE_ArticulosComodin = (MAE_ArticulosComodin)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[1] = true;
            }
        }
        private void Obtener_Almacen_Modelo_ENPROMOCION()
        {
            try
            {
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.GEN_Almacenes = Datos_Generales.GEN_Almacenes_Obtener_Modelo_Por_Id(g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idAlmacen);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[2] = true;
            }
        }
        private void Obtener_Embalaje_Modelo_ENPROMOCION()
        {
            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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idEmbalaje };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.MAE_Embalajes = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[3] = true;
            }
        }
        private void Obtener_EmbalajeSegundaUnidad_Modelo_ENPROMOCION()
        {
            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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.segundaUnidad_idEmbalaje.Value };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.MAE_Embalajes1 = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[4] = true;
            }
        }
        private void Obtener_TipoCompraVenta_Modelo_ENPROMOCION()
        {
            try
            {
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.GEN_TiposCompraVenta = Datos_Generales.GEN_TiposCompraVenta_Obtener_Modelo_Por_Id(g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idTipoCompraVenta);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[5] = true;
            }
        }
        private void Obtener_Nomenclaturaprecio_Modelo_ENPROMOCION()
        {
            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_MAENOMENCLATURASPRECIOS_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idNomenclaturaPrecio };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.MAE_NomenclaturasPrecios = (MAE_NomenclaturasPrecios)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[6] = true;
            }
        }
        private void Obtener_ImpuestoTipo_Modelo_ENPROMOCION()
        {
            try
            {
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.GEN_ImpuestosTipos = Datos_Generales.GEN_ImpuestosTipos_Obtener_Modelo_Por_Id(g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idImpuestoTipo.Value);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[7] = true;
            }
        }
        private void Obtener_ArticuloPrincipalEmbalaje_Modelo_ENPROMOCION()
        {
            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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.embalajePrincipalDelArticulo_idEmbalaje };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.MAE_Embalajes2 = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[8] = true;
            }
        }
        private void Obtener_ArticuloPrincipalEmbalajeSegundaUnidad_Modelo_ENPROMOCION()
        {
            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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje.Value };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.MAE_Embalajes3 = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[9] = true;
            }
        }
        private void Obtener_Comentarios_Modelo_ENPROMOCION()
        {
            try
            {
                VTA_PresupuestosLineas_Comentarios_Datos obj_VTA_PresupuestosLineas_Comentarios_Datos = new VTA_PresupuestosLineas_Comentarios_Datos();
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.VTA_PresupuestosLineas_Comentarios = obj_VTA_PresupuestosLineas_Comentarios_Datos.Obtener_ModeloListado_Por_PresupuestoLinea(g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.id);

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[10] = true;
            }
        }
        private void Obtener_Ubicacion_Modelo_ENPROMOCION()
        {
            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_MAEUBICACIONES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.idUbicacion };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Modelo_ENPROMOCION.MAE_Ubicaciones = (MAE_Ubicaciones)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener_ENPROMOCION[11] = true;
            }
        }

        #endregion
        #endregion

        public List<long> Obtener_IdsPresupuestoLinea_PorCabecera(long _lng_idPresupuestoCabecera)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            List<long> lst_Ids = new List<long>();

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

                string str_SQL =
                        " SELECT " +
                         nameof(VTA_PresupuestosLineas.id) +
                        " FROM " + nameof(VTA_PresupuestosLineas) +
                        " WHERE " +
                            nameof(VTA_PresupuestosLineas.fechaBorrado) + "  is null AND " +
                            nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) + " =@idPresupuestoCabecera " +
                        " ORDER BY " + nameof(VTA_PresupuestosLineas.numeroLinea);

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

                //Rellenar el Modelo
                lst_Ids = obj_Exferia_Entities.Database.SqlQuery<long>(str_SQL, arr_Parametros).ToList();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_IdsPresupuestoLinea_PorCabecera), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return lst_Ids;
        }

        #region Para Listado

        #region Simple
        private INTERNO_VTA_PresupuestosLineas_Listado_Modelo g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO = null;

        public INTERNO_VTA_PresupuestosLineas_Listado_Modelo Obtener_Registro_Para_Listado_Por_Id(long _lng_id)
        {

            g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO = null;

            try
            {
                string str_SQL = Obtener_Consulta_Para_Listado() +
                                " WHERE " +
                                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.fechaBorrado) + "  is null AND " +
                                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.id) + " =@id ";
                //where
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();
                lst_Parametros.Add(new SqlParameter("@id", _lng_id));

                //Parametros
                object[] arr_Parametros = lst_Parametros.ToArray();

                //Ejecutar
                Ejecutar_Consulta_Modelo_ParaListado(str_SQL, arr_Parametros);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_Registro_Para_Listado_Por_Id), true);
            }

            return g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO;
        }
        #region Ejecutar Consulta Modelo Para Listado
        private static int g_int_TotalHilos_Modelo_PARALISTADO = 5;
        private bool[] g_bol_Hilos_Terminados_Modelo_PARALISTADO = new bool[g_int_TotalHilos_Modelo_PARALISTADO];

        private void Ejecutar_Consulta_Modelo_ParaListado(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_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO = obj_Exferia_Entities.Database.SqlQuery<INTERNO_VTA_PresupuestosLineas_Listado_Modelo>(_str_SQL, _arr_Parametros).FirstOrDefault();

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

                    //MAE_Embalajes ##########################################################################################
                    ThreadStart obj_ThreadStart_EMBALAJES = new ThreadStart(Obtener_Embalajes_Modelo_ParaListado);
                    Thread obj_Thread_EMBALAJES = new Thread(obj_ThreadStart_EMBALAJES);
                    obj_Thread_EMBALAJES.Start();

                    //MAE_Embalajes(SegundaUnidad) ##########################################################################################
                    if (g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.segundaUnidad_idEmbalaje != null)
                    {
                        ThreadStart obj_ThreadStart_EMBALAJESSEGUNDAUNIDAD = new ThreadStart(Obtener_EmbalajesSegundaUnidad_Modelo_ParaListado);
                        Thread obj_Thread_EMBALAJESSEGUNDAUNIDAD = new Thread(obj_ThreadStart_EMBALAJESSEGUNDAUNIDAD);
                        obj_Thread_EMBALAJESSEGUNDAUNIDAD.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo_PARALISTADO[1] = true;
                    }

                    //GEN_ImpuestosTipos(Articulo) ##########################################################################################
                    if (g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Articulo_idImpuestoTipo != null)
                    {
                        ThreadStart obj_ThreadStart_IMPUESTOTIPOARTICULO = new ThreadStart(Obtener_ArticuloImpuestosTipos_Modelo_ParaListado);
                        Thread obj_Thread_IMPUESTOTIPOARTICULO = new Thread(obj_ThreadStart_IMPUESTOTIPOARTICULO);
                        obj_Thread_IMPUESTOTIPOARTICULO.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo_PARALISTADO[2] = true;
                    }

                    //GEN_ImpuestosTipos(ArticuloComodin) ##########################################################################################
                    if (g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.ArticuloComodin_idImpuestoTipo != null)
                    {
                        ThreadStart obj_ThreadStart_IMPUESTOTIPOARTICULOCOMODIN = new ThreadStart(Obtener_ArticuloComodinImpuestosTipos_Modelo_ParaListado);
                        Thread obj_Thread_IMPUESTOTIPOARTICULOCOMODIN = new Thread(obj_ThreadStart_IMPUESTOTIPOARTICULOCOMODIN);
                        obj_Thread_IMPUESTOTIPOARTICULOCOMODIN.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Modelo_PARALISTADO[3] = true;
                    }

                    //VTA_PresupuestosLineas_Comentarios
                    ThreadStart obj_ThreadStart_COMENTARIOS = new ThreadStart(Obtener_Comentarios_Modelo_ParaListado);
                    Thread obj_Thread_COMENTARIOS = new Thread(obj_ThreadStart_COMENTARIOS);
                    obj_Thread_COMENTARIOS.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_Modelo_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(VTA_PresupuestosLineas_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo_ParaListado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }

        #region Tablas Relacionadas
        private void Obtener_Embalajes_Modelo_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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.idEmbalaje };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.EmbalajePrincipal_Modelo = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_PARALISTADO[0] = true;
            }
        }
        private void Obtener_EmbalajesSegundaUnidad_Modelo_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_MAEMBALAJES_OBTENERMODELO_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.segundaUnidad_idEmbalaje.Value };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.EmbalajeRelacional_Modelo = (MAE_Embalajes)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_PARALISTADO[1] = true;
            }
        }
        private void Obtener_ArticuloImpuestosTipos_Modelo_ParaListado()
        {
            try
            {
                g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Articulo_ImpuestoTipo = Datos_Generales.GEN_ImpuestosTipos_Obtener_Modelo_Por_Id(g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Articulo_idImpuestoTipo.Value);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_PARALISTADO[2] = true;
            }
        }
        private void Obtener_ArticuloComodinImpuestosTipos_Modelo_ParaListado()
        {
            try
            {
                g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.ArticuloComodin_ImpuestoTipo = Datos_Generales.GEN_ImpuestosTipos_Obtener_Modelo_Por_Id(g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.ArticuloComodin_idImpuestoTipo.Value);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_PARALISTADO[3] = true;
            }
        }
        private void Obtener_Comentarios_Modelo_ParaListado()
        {
            try
            {
                VTA_PresupuestosLineas_Comentarios_Datos obj_VTA_PresupuestosLineas_Comentarios_Datos = new VTA_PresupuestosLineas_Comentarios_Datos();
                g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.PresupuestosLineas_Comentario_AUX = obj_VTA_PresupuestosLineas_Comentarios_Datos.Obtener_Registros_Para_Listado_Por_Linea(g_mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.id);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_PARALISTADO[4] = true;
            }
        }

        #endregion
        #endregion

        #endregion

        #region Listado
        private List<INTERNO_VTA_PresupuestosLineas_Listado_Modelo> g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO = null;

        public List<INTERNO_VTA_PresupuestosLineas_Listado_Modelo> Obtener_Registros_Para_Listado_Por_PresupuestoCabecera(long _lng_idPresupuestoCabecera)
        {
            try
            {
                string str_SQL = Obtener_Consulta_Para_Listado() +
                                    " WHERE " +
                                        nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.fechaBorrado) + " is null and " +
                                        nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) + "=@idPresupuestoCabecera ";
                //Parametros
                //Parametros
                object[] arr_Parametros = new object[]
                {
                    new SqlParameter("@idPresupuestoCabecera",  _lng_idPresupuestoCabecera)
                };

                Ejecutar_Consulta_Modelo_Listado_PARALISTADO(str_SQL,
                                                            arr_Parametros);
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_Registros_Para_Listado_Por_PresupuestoCabecera), true);
            }

            return g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO;
        }

        public List<dynamic> Obtener_Registros_Para_Listado_Por_Ids(List<long> _lst_idPresupuestoLinea)
        {
            List<dynamic> lst_Listado = null;

            try
            {

                if (_lst_idPresupuestoLinea != null && _lst_idPresupuestoLinea.Count > 0)
                {
                    string str_Filtro_PresupuestosLineas = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(VTA_PresupuestosLineas),
                                                                                                     nameof(VTA_PresupuestosLineas.id),
                                                                                                     G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.NADA,
                                                                                                     _lst_idPresupuestoLinea);

                    string str_SQL = Obtener_Consulta_Para_Listado() +
                                        " WHERE " +
                                            nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.fechaBorrado) + " is null and " +
                                            str_Filtro_PresupuestosLineas;

                    Ejecutar_Consulta_Modelo_Listado_PARALISTADO(str_SQL,
                                                                new object[] { });


                    //Si no es nulo, lo transformo a Dinamico
                    if (g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO != null && g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Count > 0)
                    {
                        lst_Listado = g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Cast<dynamic>().ToList();
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_Registros_Para_Listado_Por_Ids), true);
            }

            return lst_Listado;
        }

        #region Ejecutar Consulta

        //Listado de modelos Relacionados
        private List<MAE_Embalajes> g_lst_MAE_Embalajes_PARALISTADO = null;
        private List<GEN_ImpuestosTipos> g_lst_GEN_ImpuestosTipos_PARALISTADO = null;
        private List<INTERNO_VTA_PresupuestosLineas_Comentarios_Listado_Modelo> g_lst_INTERNO_VTA_PresupuestosLineas_Comentarios_Listado_Modelo_PARALISTADO = null;

        //Hilos
        private static int g_int_TotalHilos_Modelo_Listado_PARALISTADO = 3;
        private bool[] g_bol_Hilos_Terminados_Modelo_Listado_PARALISTADO = new bool[g_int_TotalHilos_Modelo_Listado_PARALISTADO];

        private void Ejecutar_Consulta_Modelo_Listado_PARALISTADO(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_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO = obj_Exferia_Entities.Database.SqlQuery<INTERNO_VTA_PresupuestosLineas_Listado_Modelo>(_str_SQL, _arr_Parametros).ToList();

                #region Rellenar tablas Relacionadas
                if (g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO != null && g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.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_Modelo_Listado_PARALISTADO; int_Contador++)
                    {
                        g_bol_Hilos_Terminados_Modelo_Listado_PARALISTADO[int_Contador] = false;
                    }

                    //MAE_Embalajes
                    ThreadStart obj_ThreadStart_EMBALAJES = new ThreadStart(Obtener_Embalajes_Modelo_Listado_PARALISTADO);
                    Thread obj_Thread_EMBALAJES = new Thread(obj_ThreadStart_EMBALAJES);
                    obj_Thread_EMBALAJES.Start();

                    //GEN_ImpuestosTipos
                    ThreadStart obj_ThreadStart_IMPUESTOSTIPOS = new ThreadStart(Obtener_ImpuestosTipos_Modelo_Listado_PARALISTADO);
                    Thread obj_Thread_IMPUESTOSTIPOS = new Thread(obj_ThreadStart_IMPUESTOSTIPOS);
                    obj_Thread_IMPUESTOSTIPOS.Start();

                    //VTA_PresupuestosLineas_Comentarios
                    ThreadStart obj_ThreadStart_COMENTARIOS = new ThreadStart(Obtener_Comentarios_Modelo_Listado_PARALISTADO);
                    Thread obj_Thread_COMENTARIOS = new Thread(obj_ThreadStart_COMENTARIOS);
                    obj_Thread_COMENTARIOS.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_Modelo_Listado_PARALISTADO)
                        {
                            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_VTA_PresupuestosLineas_Listado_Modelo mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo in g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO)
                    {
                        //MAE_Embalajes #############################################
                        if (g_lst_MAE_Embalajes_PARALISTADO != null &&
                            g_lst_MAE_Embalajes_PARALISTADO.Count > 0)
                        {
                            mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.EmbalajePrincipal_Modelo = g_lst_MAE_Embalajes_PARALISTADO.Where(m => m.id == mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.idEmbalaje).FirstOrDefault();

                            //MAE_Embalajes(SegundaUnidad) #############################################
                            if (mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.segundaUnidad_idEmbalaje != null)
                            {
                                mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.EmbalajeRelacional_Modelo = g_lst_MAE_Embalajes_PARALISTADO.Where(m => m.id == mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.segundaUnidad_idEmbalaje.Value).FirstOrDefault();
                            }
                        }

                        //GEN_ImpuestosTipos #############################################
                        if (g_lst_GEN_ImpuestosTipos_PARALISTADO != null &&
                            g_lst_GEN_ImpuestosTipos_PARALISTADO.Count > 0)
                        {
                            //Articulo
                            if (mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.Articulo_idImpuestoTipo != null)
                            {
                                mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.Articulo_ImpuestoTipo = g_lst_GEN_ImpuestosTipos_PARALISTADO.Where(m => m.id == mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.Articulo_idImpuestoTipo.Value).FirstOrDefault();
                            }
                            //Articulo Comodin
                            else if (mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.ArticuloComodin_idImpuestoTipo != null)
                            {
                                mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.ArticuloComodin_ImpuestoTipo = g_lst_GEN_ImpuestosTipos_PARALISTADO.Where(m => m.id == mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.ArticuloComodin_idImpuestoTipo.Value).FirstOrDefault();
                            }
                        }

                        //VTA_PresupuestosLineas_Comentarios #############################################
                        if (g_lst_INTERNO_VTA_PresupuestosLineas_Comentarios_Listado_Modelo_PARALISTADO != null &&
                            g_lst_INTERNO_VTA_PresupuestosLineas_Comentarios_Listado_Modelo_PARALISTADO.Count > 0)
                        {
                            mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.PresupuestosLineas_Comentario_AUX = g_lst_INTERNO_VTA_PresupuestosLineas_Comentarios_Listado_Modelo_PARALISTADO.Where(m => m.idPresupuestoLinea == mdl_INTERNO_VTA_PresupuestosLineas_Listado_Modelo.id).ToList();
                        }
                    }
                    #endregion
                }
                #endregion
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo_Listado_PARALISTADO), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }
        #region Tablas Relacionadas
        private void Obtener_Embalajes_Modelo_Listado_PARALISTADO()
        {
            try
            {
                //Ids de los embalajes
                List<long> lst_idEmbalaje = g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Select(m => m.idEmbalaje).ToList();
                //Ids de los Embalajes de la segunda unidad
                List<long> lst_idEmbalajeSegundaUnidad = g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Where(m => m.segundaUnidad_idEmbalaje != null).Select(m => m.segundaUnidad_idEmbalaje.Value).ToList();
                if (lst_idEmbalajeSegundaUnidad != null && lst_idEmbalajeSegundaUnidad.Count > 0)
                {
                    lst_idEmbalaje.AddRange(lst_idEmbalajeSegundaUnidad);
                }

                //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_MAEMBALAJES_OBTENERMODELOLISTADO_POR_IDS, BindingFlags.Instance | BindingFlags.NonPublic);
                //Obtener valores
                object[] arr_Parametros = { lst_idEmbalaje.Distinct().ToList() };
                //Pasamos los parametros al metodo y lo ejecutamos
                g_lst_MAE_Embalajes_PARALISTADO = (List<MAE_Embalajes>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);

            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado_PARALISTADO[0] = true;
            }
        }
        private void Obtener_ImpuestosTipos_Modelo_Listado_PARALISTADO()
        {
            try
            {
                List<long> lst_ids = new List<long>();

                //Ids de los impuestostipo de articulos
                List<long> lst_idImpuestoTipo_Articulo = g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Where(m => m.Articulo_idImpuestoTipo != null).Select(m => m.Articulo_idImpuestoTipo.Value).ToList();
                if (lst_idImpuestoTipo_Articulo != null && lst_idImpuestoTipo_Articulo.Count > 0)
                {
                    lst_ids.AddRange(lst_idImpuestoTipo_Articulo);
                }

                //Ids de los impuestostipo de articuloscomodin
                List<long> lst_idImpuestoTipo_ArticuloComodin = g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Where(m => m.ArticuloComodin_idImpuestoTipo != null).Select(m => m.ArticuloComodin_idImpuestoTipo.Value).ToList();
                if (lst_idImpuestoTipo_ArticuloComodin != null && lst_idImpuestoTipo_ArticuloComodin.Count > 0)
                {
                    lst_ids.AddRange(lst_idImpuestoTipo_ArticuloComodin);
                }

                if (lst_ids != null && lst_ids.Count > 0)
                {
                    //Pasamos los parametros al metodo y lo ejecutamos
                    g_lst_GEN_ImpuestosTipos_PARALISTADO = Datos_Generales.GEN_ImpuestosTipos_Obtener_Modelo_Listado_Por_Ids(lst_ids.Distinct().ToList());
                }
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado_PARALISTADO[1] = true;
            }
        }
        private void Obtener_Comentarios_Modelo_Listado_PARALISTADO()
        {
            try
            {
                VTA_PresupuestosLineas_Comentarios_Datos obj_VTA_PresupuestosLineas_Comentarios_Datos = new VTA_PresupuestosLineas_Comentarios_Datos();
                g_lst_INTERNO_VTA_PresupuestosLineas_Comentarios_Listado_Modelo_PARALISTADO = obj_VTA_PresupuestosLineas_Comentarios_Datos.Obtener_Registros_Para_Listado_Por_Lineas(g_lst_INTERNO_VTA_PresupuestosLineas_Listado_Modelo_PARALISTADO.Select(m => m.id).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado_PARALISTADO[2] = true;
            }
        }
        #endregion

        #endregion
        #endregion

        private string Obtener_Consulta_Para_Listado()
        {
            return
                  " SELECT " +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.id) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.id) + "," +
                        //ids
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.idTipoCompraVenta) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idTipoCompraVenta) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.idPresupuestoCabecera) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.idArticulo) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticulo) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.idArticuloComodin) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticuloComodin) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.idImpuestoTipo) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idImpuestoTipo) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.idAlmacen) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idAlmacen) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idEmbalaje) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.idPresupuestoLinea_Padre) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + "," +
                        //
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.segundaUnidad_idEmbalaje) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_idEmbalaje) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.descripcionArticuloComodin) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.descripcionArticuloComodin) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.cantidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.cantidad) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.segundaUnidad_cantidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_cantidad) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.precio) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.precio) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.descuentoGeneral) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.descuentoGeneral) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.importe) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.importe) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.segundaUnidad_Precio_Cantidad_SegundaUnidad) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.numeroLinea) + "=" + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.numeroLinea) + "," +
                        //TipoCompraVenta
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.TipoCompraVenta_Codigo) + "=" + nameof(GEN_TiposCompraVenta) + "." + nameof(GEN_TiposCompraVenta.codigo) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.TipoCompraVenta_Descripcion) + "=" + nameof(GEN_TiposCompraVenta) + "." + nameof(GEN_TiposCompraVenta.descripcion) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.TipoCompraVenta_Opcion) + "=" + nameof(GEN_TiposCompraVenta) + "." + nameof(GEN_TiposCompraVenta.opcion) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.TipoCompraVenta_FechaBorrado) + "=" + nameof(GEN_TiposCompraVenta) + "." + nameof(GEN_TiposCompraVenta.fechaBorrado) + "," +
                        //Articulo
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.Articulo_Codigo) + "=" + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.codigo) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.Articulo_Descripcion) + "=" + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.descripcion) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.Articulo_idImpuestoTipo) + "=" + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.idImpuestoTipo) + "," +
                        //ArticuloComodin
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.ArticuloComodin_Codigo) + "=" + nameof(MAE_ArticulosComodin) + "." + nameof(MAE_ArticulosComodin.codigo) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.ArticuloComodin_idImpuestoTipo) + "=" + nameof(MAE_ArticulosComodin) + "." + nameof(MAE_ArticulosComodin.idImpuestoTipo) + "," +
                        //Almacen
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.Almacen_Codigo) + "=" + nameof(GEN_Almacenes) + "." + nameof(GEN_Almacenes.codigo) + "," +
                        nameof(INTERNO_VTA_PresupuestosLineas_Listado_Modelo.Almacen_Descripcion) + "=" + nameof(GEN_Almacenes) + "." + nameof(GEN_Almacenes.descripcion) + 
                    " FROM " + nameof(VTA_PresupuestosLineas) +
                    " INNER JOIN " + nameof(GEN_TiposCompraVenta) + " ON " + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idTipoCompraVenta) + " = " + nameof(GEN_TiposCompraVenta) + "." + nameof(GEN_TiposCompraVenta.id) +
                    " LEFT JOIN " + nameof(MAE_Articulos) + " ON " + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticulo) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.id) +
                    " LEFT JOIN " + nameof(MAE_ArticulosComodin) + " ON " + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticuloComodin) + " = " + nameof(MAE_ArticulosComodin) + "." + nameof(MAE_ArticulosComodin.id) +
                    " INNER JOIN " + nameof(GEN_Almacenes) + " ON " + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idAlmacen) + " = " + nameof(GEN_Almacenes) + "." + nameof(GEN_Almacenes.id) +
                    " LEFT JOIN " + nameof(VTA_PresupuestosCabecera) + " ON " + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) + " = " + nameof(VTA_PresupuestosCabecera) + "." + nameof(VTA_PresupuestosCabecera.id);
        }
        #endregion

        public long Obtener_IdPresupuestoCabecera_PorIdLinea(long _lng_idPresupuestoLinea)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            long lng_idPresupuestoCabecera = -1;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();

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

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

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

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

            return lng_idPresupuestoCabecera;
        }

        public List<long> Obtener_IdsPresupuestoCabecera_PorIdArticulo(long _lng_idArticulo)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            List<long> lst_idPresupuestoCabecera = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();

                string str_SQL =
                       " SELECT distinct " +
                          nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) +
                       " FROM " + nameof(VTA_PresupuestosLineas) +
                       " WHERE " +
                                   nameof(VTA_PresupuestosLineas.fechaBorrado) + "  is null AND " +
                                   "( not " + nameof(VTA_PresupuestosLineas.idArticulo) + " is null) AND " +
                                    nameof(VTA_PresupuestosLineas.idArticulo) + " =@idArticulo ";

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

                //Rellenar el Modelo
                lst_idPresupuestoCabecera = obj_Exferia_Entities.Database.SqlQuery<long>(str_SQL, arr_Parametros).ToList();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_IdsPresupuestoCabecera_PorIdArticulo), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return lst_idPresupuestoCabecera;
        }

        public List<long> Obtener_IdsPresupuestoCabecera_PorIdArticuloComodin(long _lng_idArticuloComodin)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            List<long> lst_idPresupuestoCabecera = null;

            try
            {
                obj_Exferia_Entities = new Exferia_Entities();

                string str_SQL =
                       " SELECT distinct " +
                          nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) +
                       " FROM " + nameof(VTA_PresupuestosLineas) +
                       " WHERE " +
                                   nameof(VTA_PresupuestosLineas.fechaBorrado) + "  is null AND " +
                                   "( not " + nameof(VTA_PresupuestosLineas.idArticuloComodin) + " is null) AND " +
                                    nameof(VTA_PresupuestosLineas.idArticuloComodin) + " =@idArticuloComodin ";

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

                //Rellenar el Modelo
                lst_idPresupuestoCabecera = obj_Exferia_Entities.Database.SqlQuery<long>(str_SQL, arr_Parametros).ToList();
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_IdsPresupuestoCabecera_PorIdArticuloComodin), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return lst_idPresupuestoCabecera;
        }
        #endregion

        #region MODELOS

        #region Modelo Simple
        private VTA_PresupuestosLineas g_mdl_VTA_PresupuestosLineas = null;
        public VTA_PresupuestosLineas Obtener_Modelo_Por_Id(long _lng_id)
        {
            try
            {
                string str_SQL = Obtener_Consulta_Modelo() +
                                 //WHERE
                                 " WHERE " + nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.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(VTA_PresupuestosLineas_Datos) + "/" + nameof(Obtener_Modelo_Por_Id), true);
            }

            return g_mdl_VTA_PresupuestosLineas;
        }
        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_VTA_PresupuestosLineas = obj_Exferia_Entities.Database.SqlQuery<VTA_PresupuestosLineas>(_str_SQL, _arr_Parametros).FirstOrDefault();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }
        #endregion

        #region Modelo Listado
        private List<VTA_PresupuestosLineas> g_lst_VTA_PresupuestosLineas = null;

        public List<VTA_PresupuestosLineas> Obtener_ModeloListado_Por_PresupuestoCabecera(  long _lng_idPresupuestoCabecera,
                                                                                            bool _bol_Cargar_Articulos,
                                                                                            bool _bol_Cargar_ArticlosComodin,
                                                                                            bool _bol_Cargar_TarifasPromociones,
                                                                                            bool _bol_Cargar_Comentarios)
        {
            try
            {
                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " +
                                        nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.fechaBorrado) + " is null and " +
                                        nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) + "=@idPresupuestoCabecera ";

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

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(   str_SQL,
                                                    arr_Parametros,
                                                    _bol_Cargar_Articulos,
                                                    _bol_Cargar_ArticlosComodin,
                                                    _bol_Cargar_TarifasPromociones,
                                                    _bol_Cargar_Comentarios);

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

            return g_lst_VTA_PresupuestosLineas;
        }

        public List<VTA_PresupuestosLineas> Obtener_ModeloListado_Por_PresupuestoCabeceras(List<long> _lst_idPresupuestoCabecera)
        {
            try
            {
                string str_Filtro_PresupustoCabecera = Funciones.Formar_ContenidoIN_ParaConsultaWhere(nameof(VTA_PresupuestosLineas),
                                                                                                    nameof(VTA_PresupuestosLineas.idPresupuestoCabecera),
                                                                                                    G_ENUM_FORMARCONTENIDOIN_CONDICIONANTES.NADA,
                                                                                                    _lst_idPresupuestoCabecera);

                //Consulta
                string str_SQL = Obtener_Consulta_Modelo() +
                                    //WHERE
                                    " WHERE " +
                                        nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.fechaBorrado) + " is null and " +
                                        str_Filtro_PresupustoCabecera;

                //Ejecutar y rellenar el listado
                Ejecutar_Consulta_Modelo_Listado(str_SQL,
                                                 new object[] { },
                                                 true,
                                                 true,
                                                 false,
                                                 false);

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

            return g_lst_VTA_PresupuestosLineas;
        }

        #region Ejecutar Consulta
        //Listado de modelos Relacionados
        private List<MAE_Articulos> g_lst_MAE_Articulos = null;
        private List<MAE_ArticulosComodin> g_lst_MAE_ArticulosComodin = null;
        private List<VTA_PresupuestosLineas_TarifasPromociones> g_lst_VTA_PresupuestosLineas_TarifasPromociones = null;
        private List<VTA_PresupuestosLineas_Comentarios> g_lst_VTA_PresupuestosLineas_Comentarios = null;

        //Hilos
        private static int g_int_TotalHilos_Modelo_Listado = 4;
        private bool[] g_bol_Hilos_Terminados_Modelo_Listado = new bool[g_int_TotalHilos_Modelo_Listado];

        private void Ejecutar_Consulta_Modelo_Listado(string _str_SQL,
                                                    object[] _arr_Parametros,
                                                    bool _bol_Cargar_Articulos,
                                                    bool _bol_Cargar_ArticlosComodin,
                                                    bool _bol_Cargar_TarifasPromociones,
                                                    bool _bol_Cargar_Comentarios)
        {
            Exferia_Entities obj_Exferia_Entities = null;

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

                //Rellenar el modelo
                g_lst_VTA_PresupuestosLineas = obj_Exferia_Entities.Database.SqlQuery<VTA_PresupuestosLineas>(_str_SQL, _arr_Parametros).ToList();

                #region Rellenar tablas Relacionadas
                if (g_lst_VTA_PresupuestosLineas != null && g_lst_VTA_PresupuestosLineas.Count > 0)
                {
                    if ( _bol_Cargar_Articulos ||
                        _bol_Cargar_ArticlosComodin ||
                        _bol_Cargar_TarifasPromociones ||
                        _bol_Cargar_Comentarios)
                    {
                        #region PRIMERO BUSCO LOS DATOS DE LAS TABLAS RELACIONADAS
                        //reiniciar Valores de los hilos
                        for (int int_Contador = 0; int_Contador < g_int_TotalHilos_Modelo_Listado; int_Contador++)
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[int_Contador] = false;
                        }

                        //MAE_Articulos ############################################# 
                        if (_bol_Cargar_Articulos)
                        {
                            ThreadStart obj_ThreadStart_ARTICULOS = new ThreadStart(Obtener_Articulos_Modelo_Listado);
                            Thread obj_Thread_ARTICULOS = new Thread(obj_ThreadStart_ARTICULOS);
                            obj_Thread_ARTICULOS.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[0] = true;
                        }

                        //MAE_ArticulosComodin ############################################# 
                        if (_bol_Cargar_ArticlosComodin)
                        {
                            ThreadStart obj_ThreadStart_ARTICULOSCOMODIN = new ThreadStart(Obtener_ArticulosComodin_Modelo_Listado);
                            Thread obj_Thread_ARTICULOSCOMODIN = new Thread(obj_ThreadStart_ARTICULOSCOMODIN);
                            obj_Thread_ARTICULOSCOMODIN.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[1] = true;
                        }

                        //VTA_PresupuestosLineas_TarifasPromociones ############################################# 
                        if (_bol_Cargar_TarifasPromociones)
                        {
                            ThreadStart obj_ThreadStart_TARIFAPROMOCION = new ThreadStart(Obtener_TarifaPromocion_Modelo_Listado);
                            Thread obj_Thread_TARIFAPROMOCION = new Thread(obj_ThreadStart_TARIFAPROMOCION);
                            obj_Thread_TARIFAPROMOCION.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[2] = true;
                        }

                        //VTA_PresupuestosLineas_Comentarios ############################################# 
                        if (_bol_Cargar_Comentarios)
                        {
                            ThreadStart obj_ThreadStart_COMENTARIOS = new ThreadStart(Obtener_Comentarios_Modelo_Listado);
                            Thread obj_Thread_COMENTARIOS = new Thread(obj_ThreadStart_COMENTARIOS);
                            obj_Thread_COMENTARIOS.Start();
                        }
                        else
                        {
                            g_bol_Hilos_Terminados_Modelo_Listado[3] = 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_Modelo_Listado)
                            {
                                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 (VTA_PresupuestosLineas mdl_VTA_PresupuestosLineas in g_lst_VTA_PresupuestosLineas)
                        {
                            //MAE_Articulos #############################################
                            if (_bol_Cargar_Articulos &&
                                mdl_VTA_PresupuestosLineas.idArticulo != null &&
                                g_lst_MAE_Articulos != null &&
                                g_lst_MAE_Articulos.Count > 0)
                            {
                                mdl_VTA_PresupuestosLineas.MAE_Articulos = g_lst_MAE_Articulos.Where(m => m.id == mdl_VTA_PresupuestosLineas.idArticulo.Value).FirstOrDefault();
                            }

                            //MAE_ArticulosComodin #############################################
                            if (_bol_Cargar_ArticlosComodin &&
                                mdl_VTA_PresupuestosLineas.idArticuloComodin != null &&
                                g_lst_MAE_ArticulosComodin != null &&
                                g_lst_MAE_ArticulosComodin.Count > 0)
                            {
                                mdl_VTA_PresupuestosLineas.MAE_ArticulosComodin = g_lst_MAE_ArticulosComodin.Where(m => m.id == mdl_VTA_PresupuestosLineas.idArticuloComodin.Value).FirstOrDefault();
                            }

                            //VTA_PresupuestosLineas_TarifasPromociones #############################################
                            if (_bol_Cargar_TarifasPromociones &&
                                g_lst_VTA_PresupuestosLineas_TarifasPromociones != null &&
                                g_lst_VTA_PresupuestosLineas_TarifasPromociones.Count > 0)
                            {
                                mdl_VTA_PresupuestosLineas.VTA_PresupuestosLineas_TarifasPromociones = g_lst_VTA_PresupuestosLineas_TarifasPromociones.Where(m => m.idPresupuestoLinea == mdl_VTA_PresupuestosLineas.id).ToList();
                            }

                            //VTA_PresupuestosLineas_Comentarios #############################################
                            if (_bol_Cargar_Comentarios &&
                                g_lst_VTA_PresupuestosLineas_Comentarios != null &&
                                g_lst_VTA_PresupuestosLineas_Comentarios.Count > 0)
                            {
                                mdl_VTA_PresupuestosLineas.VTA_PresupuestosLineas_Comentarios = g_lst_VTA_PresupuestosLineas_Comentarios.Where(m => m.idPresupuestoLinea == mdl_VTA_PresupuestosLineas.id).ToList();
                            }
                        }
                        #endregion
                    }
                }

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

        #region TablasRelacionadas
        private void Obtener_Articulos_Modelo_Listado()
        {
            try
            {
                List<long> lst_idArticulo = g_lst_VTA_PresupuestosLineas.Where(m => m.idArticulo != null).Select(m => m.idArticulo.Value).ToList();

                if (lst_idArticulo != null && lst_idArticulo.Count > 0)
                {
                    //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_MAEARTICULOS_OBTENERMODELOLISTADO_POR_IDS, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros = { lst_idArticulo };
                    //Pasamos los parametros al metodo y lo ejecutamos
                    g_lst_MAE_Articulos = (List<MAE_Articulos>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                }
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[0] = true;
            }
        }
        private void Obtener_ArticulosComodin_Modelo_Listado()
        {
            try
            {
                List<long> lst_idArticuloComodin = g_lst_VTA_PresupuestosLineas.Where(m => m.idArticuloComodin != null).Select(m => m.idArticuloComodin.Value).ToList();

                if (lst_idArticuloComodin != null && lst_idArticuloComodin.Count > 0)
                {
                    //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_MAEARTICULOSCOMODIN_OBTENERMODELOLISTADO_POR_IDS, BindingFlags.Instance | BindingFlags.NonPublic);

                    //Obtener valores
                    object[] arr_Parametros = { lst_idArticuloComodin };
                    //Pasamos los parametros al metodo y lo ejecutamos
                    g_lst_MAE_ArticulosComodin = (List<MAE_ArticulosComodin>)obj_MethodInfo.Invoke(obj_Clase, arr_Parametros);
                }
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[1] = true;
            }
        }
        private void Obtener_TarifaPromocion_Modelo_Listado()
        {
            try
            {
                VTA_PresupuestosLineas_TarifasPromociones_Datos obj_VTA_PresupuestosLineas_TarifasPromociones_Datos = new VTA_PresupuestosLineas_TarifasPromociones_Datos();
                g_lst_VTA_PresupuestosLineas_TarifasPromociones = obj_VTA_PresupuestosLineas_TarifasPromociones_Datos.Obtener_ModeloListado_Por_PresupuestosLineas(g_lst_VTA_PresupuestosLineas.Select(m => m.id).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[2] = true;
            }
        }
        private void Obtener_Comentarios_Modelo_Listado()
        {
            try
            {
                VTA_PresupuestosLineas_Comentarios_Datos obj_VTA_PresupuestosLineas_Comentarios_Datos = new VTA_PresupuestosLineas_Comentarios_Datos();
                g_lst_VTA_PresupuestosLineas_Comentarios=obj_VTA_PresupuestosLineas_Comentarios_Datos.Obtener_ModeloListado_Por_PresupuestosLineas(g_lst_VTA_PresupuestosLineas.Select(m=>m.id).ToList());
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Modelo_Listado[3] = true;
            }
        }
        #endregion

        #endregion

        #endregion

        private string Obtener_Consulta_Modelo()
        {
            return
               " SELECT " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.id) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticulo) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idArticuloComodin) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.descripcionArticuloComodin) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.numeroLinea) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idAlmacen) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idUbicacion) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.cantidad) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idEmbalaje) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.relacion) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.operacion) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_relacion) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_idEmbalaje) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.segundaUnidad_cantidad) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idNomenclaturaPrecio) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.precio) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.numeroRedondeo) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.descuentoGeneral) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.importe) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idImpuestoTipo) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_idEmbalaje) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_relacion) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_operacion) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_precio) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.fechaBorrado) + " , " +
                    nameof(VTA_PresupuestosLineas) + "." + nameof(VTA_PresupuestosLineas.idTipoCompraVenta) + 
               " FROM " + nameof(VTA_PresupuestosLineas);
        }
        #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();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                VTA_PresupuestosLineas mdl_VTA_PresupuestosLineas_AGrabar = (VTA_PresupuestosLineas)_mdl_obj;
                VTA_PresupuestosLineas mdl_VTA_PresupuestosLineas_DatosViejos = new VTA_PresupuestosLineas();

                // Ver si existe ######################################################################
                VTA_PresupuestosLineas mdl_VTA_PresupuestosLineas_Final = Obtener_Modelo_Por_Id(mdl_VTA_PresupuestosLineas_AGrabar.id);
                //###################################################################################### 

                if (mdl_VTA_PresupuestosLineas_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_VTA_PresupuestosLineas_Final, mdl_VTA_PresupuestosLineas_DatosViejos, false, false);

                    //Cargar los Datos del Modelo
                    Funciones.CopiarPropiedadesObjetos(mdl_VTA_PresupuestosLineas_AGrabar, mdl_VTA_PresupuestosLineas_Final, false, false);

                    #region Update
                    string str_SQL_Update = " UPDATE " + nameof(VTA_PresupuestosLineas) +
                                            " SET " +
                                                nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) + "=@idPresupuestoCabecera," +
                                                nameof(VTA_PresupuestosLineas.idArticulo) + "=@idArticulo," +
                                                nameof(VTA_PresupuestosLineas.idArticuloComodin) + "=@idArticuloComodin," +
                                                nameof(VTA_PresupuestosLineas.descripcionArticuloComodin) + "=@descripcionArticuloComodin," +
                                                nameof(VTA_PresupuestosLineas.numeroLinea) + "=@numeroLinea," +
                                                nameof(VTA_PresupuestosLineas.idAlmacen) + "=@idAlmacen," +
                                                nameof(VTA_PresupuestosLineas.idUbicacion) + "=@idUbicacion," +
                                                nameof(VTA_PresupuestosLineas.cantidad) + "=@cantidad," +
                                                nameof(VTA_PresupuestosLineas.idEmbalaje) + "=@idEmbalaje," +
                                                nameof(VTA_PresupuestosLineas.relacion) + "=@relacion," +
                                                nameof(VTA_PresupuestosLineas.operacion) + "=@operacion," +
                                                nameof(VTA_PresupuestosLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad) + "=@segundaUnidad_Precio_Cantidad_SegundaUnidad," +
                                                nameof(VTA_PresupuestosLineas.segundaUnidad_relacion) + "=@segundaUnidad_relacion," +
                                                nameof(VTA_PresupuestosLineas.segundaUnidad_idEmbalaje) + "=@segundaUnidad_idEmbalaje," +
                                                nameof(VTA_PresupuestosLineas.segundaUnidad_cantidad) + "=@segundaUnidad_cantidad," +
                                                nameof(VTA_PresupuestosLineas.idNomenclaturaPrecio) + "=@idNomenclaturaPrecio," +
                                                nameof(VTA_PresupuestosLineas.precio) + "=@precio," +
                                                nameof(VTA_PresupuestosLineas.numeroRedondeo) + "=@numeroRedondeo," +
                                                nameof(VTA_PresupuestosLineas.descuentoGeneral) + "=@descuentoGeneral," +
                                                nameof(VTA_PresupuestosLineas.importe) + "=@importe," +
                                                nameof(VTA_PresupuestosLineas.idImpuestoTipo) + "=@idImpuestoTipo," +
                                                nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + "=@idPresupuestoLinea_Padre," +
                                                nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_idEmbalaje) + "=@embalajePrincipalDelArticulo_idEmbalaje," +
                                                nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_relacion) + "=@embalajePrincipalDelArticulo_relacion," +
                                                nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_operacion) + "=@embalajePrincipalDelArticulo_operacion," +
                                                nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_precio) + "=@embalajePrincipalDelArticulo_precio," +
                                                nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad) + "=@embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad," +
                                                nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion) + "=@embalajePrincipalDelArticulo_segundaUnidad_relacion," +
                                                nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje) + "=@embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje," +
                                                nameof(VTA_PresupuestosLineas.fechaBorrado) + "=@fechaBorrado," +
                                                nameof(VTA_PresupuestosLineas.idTipoCompraVenta) + "=@idTipoCompraVenta " +
                                            " WHERE " +
                                                nameof(VTA_PresupuestosLineas.id) + "=@id";
                    //Parametros
                    object[] arr_Parametros_Update = new object[]
                    {
                        new SqlParameter("@idPresupuestoCabecera",  mdl_VTA_PresupuestosLineas_Final.idPresupuestoCabecera),
                        mdl_VTA_PresupuestosLineas_Final.idArticulo!=null
                            ?   new SqlParameter("@idArticulo", mdl_VTA_PresupuestosLineas_Final.idArticulo.Value)
                            :   new SqlParameter("@idArticulo",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.idArticuloComodin!=null
                            ?   new SqlParameter("@idArticuloComodin", mdl_VTA_PresupuestosLineas_Final.idArticuloComodin.Value)
                            :   new SqlParameter("@idArticuloComodin",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.descripcionArticuloComodin!=null
                            ?   new SqlParameter("@descripcionArticuloComodin", mdl_VTA_PresupuestosLineas_Final.descripcionArticuloComodin)
                            :   new SqlParameter("@descripcionArticuloComodin",  DBNull.Value),
                        new SqlParameter("@numeroLinea",  mdl_VTA_PresupuestosLineas_Final.numeroLinea),
                        new SqlParameter("@idAlmacen",  mdl_VTA_PresupuestosLineas_Final.idAlmacen),
                        mdl_VTA_PresupuestosLineas_Final.idUbicacion!=null
                            ?   new SqlParameter("@idUbicacion", mdl_VTA_PresupuestosLineas_Final.idUbicacion.Value)
                            :   new SqlParameter("@idUbicacion",  DBNull.Value),
                        new SqlParameter("@cantidad",  mdl_VTA_PresupuestosLineas_Final.cantidad),
                        new SqlParameter("@idEmbalaje",  mdl_VTA_PresupuestosLineas_Final.idEmbalaje),
                        new SqlParameter("@relacion",  mdl_VTA_PresupuestosLineas_Final.relacion),
                        mdl_VTA_PresupuestosLineas_Final.operacion!=null
                            ?   new SqlParameter("@operacion", mdl_VTA_PresupuestosLineas_Final.operacion)
                            :   new SqlParameter("@operacion",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_Precio_Cantidad_SegundaUnidad!=null
                            ?   new SqlParameter("@segundaUnidad_Precio_Cantidad_SegundaUnidad", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_Precio_Cantidad_SegundaUnidad.Value)
                            :   new SqlParameter("@segundaUnidad_Precio_Cantidad_SegundaUnidad",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_relacion!=null
                            ?   new SqlParameter("@segundaUnidad_relacion", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_relacion.Value)
                            :   new SqlParameter("@segundaUnidad_relacion",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_idEmbalaje!=null
                            ?   new SqlParameter("@segundaUnidad_idEmbalaje", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_idEmbalaje.Value)
                            :   new SqlParameter("@segundaUnidad_idEmbalaje",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_cantidad!=null
                            ?   new SqlParameter("@segundaUnidad_cantidad", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_cantidad.Value)
                            :   new SqlParameter("@segundaUnidad_cantidad",  DBNull.Value),
                        new SqlParameter("@idNomenclaturaPrecio",  mdl_VTA_PresupuestosLineas_Final.idNomenclaturaPrecio),
                        new SqlParameter("@precio",  mdl_VTA_PresupuestosLineas_Final.precio),
                        mdl_VTA_PresupuestosLineas_Final.numeroRedondeo!=null
                            ?   new SqlParameter("@numeroRedondeo", mdl_VTA_PresupuestosLineas_Final.numeroRedondeo.Value)
                            :   new SqlParameter("@numeroRedondeo",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.descuentoGeneral!=null
                            ?   new SqlParameter("@descuentoGeneral", mdl_VTA_PresupuestosLineas_Final.descuentoGeneral.Value)
                            :   new SqlParameter("@descuentoGeneral",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.importe!=null
                            ?   new SqlParameter("@importe", mdl_VTA_PresupuestosLineas_Final.importe.Value)
                            :   new SqlParameter("@importe",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.idImpuestoTipo!=null
                            ?   new SqlParameter("@idImpuestoTipo", mdl_VTA_PresupuestosLineas_Final.idImpuestoTipo.Value)
                            :   new SqlParameter("@idImpuestoTipo",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.idPresupuestoLinea_Padre!=null
                            ?   new SqlParameter("@idPresupuestoLinea_Padre", mdl_VTA_PresupuestosLineas_Final.idPresupuestoLinea_Padre.Value)
                            :   new SqlParameter("@idPresupuestoLinea_Padre",  DBNull.Value),
                        new SqlParameter("@embalajePrincipalDelArticulo_idEmbalaje",  mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_idEmbalaje),
                        new SqlParameter("@embalajePrincipalDelArticulo_relacion",  mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_relacion),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_operacion!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_operacion", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_operacion)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_operacion",  DBNull.Value),
                        new SqlParameter("@embalajePrincipalDelArticulo_precio",  mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_precio),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad.Value)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_relacion!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_relacion", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_relacion.Value)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_relacion",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje.Value)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.fechaBorrado!=null
                            ?   new SqlParameter("@fechaBorrado", mdl_VTA_PresupuestosLineas_Final.fechaBorrado.Value)
                            :   new SqlParameter("@fechaBorrado",  DBNull.Value),
                        new SqlParameter("@idTipoCompraVenta",  mdl_VTA_PresupuestosLineas_Final.idTipoCompraVenta),
                        new SqlParameter("@id",  mdl_VTA_PresupuestosLineas_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_VTA_PresupuestosLineas_Final.id;
                }
                else
                {
                    mdl_VTA_PresupuestosLineas_Final = new VTA_PresupuestosLineas();

                    //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_VTA_PresupuestosLineas_AGrabar, mdl_VTA_PresupuestosLineas_Final, false, false);

                    #region INSERT
                    string str_SQL_Insert = " INSERT INTO " + nameof(VTA_PresupuestosLineas) +
                                                " (" +
                                                        nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) + "," +
                                                        nameof(VTA_PresupuestosLineas.idArticulo) + "," +
                                                        nameof(VTA_PresupuestosLineas.idArticuloComodin) + "," +
                                                        nameof(VTA_PresupuestosLineas.descripcionArticuloComodin) + "," +
                                                        nameof(VTA_PresupuestosLineas.numeroLinea) + "," +
                                                        nameof(VTA_PresupuestosLineas.idAlmacen) + "," +
                                                        nameof(VTA_PresupuestosLineas.idUbicacion) + "," +
                                                        nameof(VTA_PresupuestosLineas.cantidad) + "," +
                                                        nameof(VTA_PresupuestosLineas.idEmbalaje) + "," +
                                                        nameof(VTA_PresupuestosLineas.relacion) + "," +
                                                        nameof(VTA_PresupuestosLineas.operacion) + "," +
                                                        nameof(VTA_PresupuestosLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad) + "," +
                                                        nameof(VTA_PresupuestosLineas.segundaUnidad_relacion) + "," +
                                                        nameof(VTA_PresupuestosLineas.segundaUnidad_idEmbalaje) + "," +
                                                        nameof(VTA_PresupuestosLineas.segundaUnidad_cantidad) + "," +
                                                        nameof(VTA_PresupuestosLineas.idNomenclaturaPrecio) + "," +
                                                        nameof(VTA_PresupuestosLineas.precio) + "," +
                                                        nameof(VTA_PresupuestosLineas.numeroRedondeo) + "," +
                                                        nameof(VTA_PresupuestosLineas.descuentoGeneral) + "," +
                                                        nameof(VTA_PresupuestosLineas.importe) + "," +
                                                        nameof(VTA_PresupuestosLineas.idImpuestoTipo) + "," +
                                                        nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + "," +
                                                        nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_idEmbalaje) + "," +
                                                        nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_relacion) + "," +
                                                        nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_operacion) + "," +
                                                        nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_precio) + "," +
                                                        nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad) + "," +
                                                        nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion) + "," +
                                                        nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje) + "," +
                                                        nameof(VTA_PresupuestosLineas.fechaBorrado) + "," +
                                                        nameof(VTA_PresupuestosLineas.idTipoCompraVenta) +
                                                " ) " +
                                                " OUTPUT INSERTED." + nameof(VTA_PresupuestosLineas.id) +
                                                " VALUES " +
                                                " ( " +
                                                    "@idPresupuestoCabecera," +
                                                    "@idArticulo," +
                                                    "@idArticuloComodin," +
                                                    "@descripcionArticuloComodin," +
                                                    "@numeroLinea," +
                                                    "@idAlmacen," +
                                                    "@idUbicacion," +
                                                    "@cantidad," +
                                                    "@idEmbalaje," +
                                                    "@relacion," +
                                                    "@operacion," +
                                                    "@segundaUnidad_Precio_Cantidad_SegundaUnidad," +
                                                    "@segundaUnidad_relacion," +
                                                    "@segundaUnidad_idEmbalaje," +
                                                    "@segundaUnidad_cantidad," +
                                                    "@idNomenclaturaPrecio," +
                                                    "@precio," +
                                                    "@numeroRedondeo," +
                                                    "@descuentoGeneral," +
                                                    "@importe," +
                                                    "@idImpuestoTipo," +
                                                    "@idPresupuestoLinea_Padre," +
                                                    "@embalajePrincipalDelArticulo_idEmbalaje," +
                                                    "@embalajePrincipalDelArticulo_relacion," +
                                                    "@embalajePrincipalDelArticulo_operacion," +
                                                    "@embalajePrincipalDelArticulo_precio," +
                                                    "@embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad," +
                                                    "@embalajePrincipalDelArticulo_segundaUnidad_relacion," +
                                                    "@embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje," +
                                                    "@fechaBorrado," +
                                                    "@idTipoCompraVenta" +
                                                " ) ";
                    //Parametros
                    object[] arr_Parametros_Insert = new object[]
                    {
                      new SqlParameter("@idPresupuestoCabecera",  mdl_VTA_PresupuestosLineas_Final.idPresupuestoCabecera),
                        mdl_VTA_PresupuestosLineas_Final.idArticulo!=null
                            ?   new SqlParameter("@idArticulo", mdl_VTA_PresupuestosLineas_Final.idArticulo.Value)
                            :   new SqlParameter("@idArticulo",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.idArticuloComodin!=null
                            ?   new SqlParameter("@idArticuloComodin", mdl_VTA_PresupuestosLineas_Final.idArticuloComodin.Value)
                            :   new SqlParameter("@idArticuloComodin",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.descripcionArticuloComodin!=null
                            ?   new SqlParameter("@descripcionArticuloComodin", mdl_VTA_PresupuestosLineas_Final.descripcionArticuloComodin)
                            :   new SqlParameter("@descripcionArticuloComodin",  DBNull.Value),
                        new SqlParameter("@numeroLinea",  mdl_VTA_PresupuestosLineas_Final.numeroLinea),
                        new SqlParameter("@idAlmacen",  mdl_VTA_PresupuestosLineas_Final.idAlmacen),
                        mdl_VTA_PresupuestosLineas_Final.idUbicacion!=null
                            ?   new SqlParameter("@idUbicacion", mdl_VTA_PresupuestosLineas_Final.idUbicacion.Value)
                            :   new SqlParameter("@idUbicacion",  DBNull.Value),
                        new SqlParameter("@cantidad",  mdl_VTA_PresupuestosLineas_Final.cantidad),
                        new SqlParameter("@idEmbalaje",  mdl_VTA_PresupuestosLineas_Final.idEmbalaje),
                        new SqlParameter("@relacion",  mdl_VTA_PresupuestosLineas_Final.relacion),
                        mdl_VTA_PresupuestosLineas_Final.operacion!=null
                            ?   new SqlParameter("@operacion", mdl_VTA_PresupuestosLineas_Final.operacion)
                            :   new SqlParameter("@operacion",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_Precio_Cantidad_SegundaUnidad!=null
                            ?   new SqlParameter("@segundaUnidad_Precio_Cantidad_SegundaUnidad", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_Precio_Cantidad_SegundaUnidad.Value)
                            :   new SqlParameter("@segundaUnidad_Precio_Cantidad_SegundaUnidad",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_relacion!=null
                            ?   new SqlParameter("@segundaUnidad_relacion", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_relacion.Value)
                            :   new SqlParameter("@segundaUnidad_relacion",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_idEmbalaje!=null
                            ?   new SqlParameter("@segundaUnidad_idEmbalaje", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_idEmbalaje.Value)
                            :   new SqlParameter("@segundaUnidad_idEmbalaje",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_cantidad!=null
                            ?   new SqlParameter("@segundaUnidad_cantidad", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_cantidad.Value)
                            :   new SqlParameter("@segundaUnidad_cantidad",  DBNull.Value),
                        new SqlParameter("@idNomenclaturaPrecio",  mdl_VTA_PresupuestosLineas_Final.idNomenclaturaPrecio),
                        new SqlParameter("@precio",  mdl_VTA_PresupuestosLineas_Final.precio),
                        mdl_VTA_PresupuestosLineas_Final.numeroRedondeo!=null
                            ?   new SqlParameter("@numeroRedondeo", mdl_VTA_PresupuestosLineas_Final.numeroRedondeo.Value)
                            :   new SqlParameter("@numeroRedondeo",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.descuentoGeneral!=null
                            ?   new SqlParameter("@descuentoGeneral", mdl_VTA_PresupuestosLineas_Final.descuentoGeneral.Value)
                            :   new SqlParameter("@descuentoGeneral",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.importe!=null
                            ?   new SqlParameter("@importe", mdl_VTA_PresupuestosLineas_Final.importe.Value)
                            :   new SqlParameter("@importe",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.idImpuestoTipo!=null
                            ?   new SqlParameter("@idImpuestoTipo", mdl_VTA_PresupuestosLineas_Final.idImpuestoTipo.Value)
                            :   new SqlParameter("@idImpuestoTipo",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.idPresupuestoLinea_Padre!=null
                            ?   new SqlParameter("@idPresupuestoLinea_Padre", mdl_VTA_PresupuestosLineas_Final.idPresupuestoLinea_Padre.Value)
                            :   new SqlParameter("@idPresupuestoLinea_Padre",  DBNull.Value),
                        new SqlParameter("@embalajePrincipalDelArticulo_idEmbalaje",  mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_idEmbalaje),
                        new SqlParameter("@embalajePrincipalDelArticulo_relacion",  mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_relacion),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_operacion!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_operacion", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_operacion)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_operacion",  DBNull.Value),
                        new SqlParameter("@embalajePrincipalDelArticulo_precio",  mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_precio),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad.Value)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_relacion!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_relacion", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_relacion.Value)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_relacion",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje.Value)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.fechaBorrado!=null
                            ?   new SqlParameter("@fechaBorrado", mdl_VTA_PresupuestosLineas_Final.fechaBorrado.Value)
                            :   new SqlParameter("@fechaBorrado",  DBNull.Value),
                        new SqlParameter("@idTipoCompraVenta",  mdl_VTA_PresupuestosLineas_Final.idTipoCompraVenta)

                    };
                    #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(VTA_PresupuestosLineas), mdl_VTA_PresupuestosLineas_DatosViejos, mdl_VTA_PresupuestosLineas_Final, mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion, obj_Exferia_Entities);

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Grabar), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        public INTERNO_ValorDevuelto_Modelo Insertar(VTA_PresupuestosLineas _mdl_VTA_PresupuestosLineas_AGrabar)
        {
            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();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                VTA_PresupuestosLineas mdl_VTA_PresupuestosLineas_DatosViejos = new VTA_PresupuestosLineas();
                VTA_PresupuestosLineas mdl_VTA_PresupuestosLineas_Final = new VTA_PresupuestosLineas();

                //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_VTA_PresupuestosLineas_AGrabar, mdl_VTA_PresupuestosLineas_Final, false, false);

                #region INSERT
                string str_SQL_Insert = " INSERT INTO " + nameof(VTA_PresupuestosLineas) +
                                            " (" +
                                                    nameof(VTA_PresupuestosLineas.idPresupuestoCabecera) + "," +
                                                    nameof(VTA_PresupuestosLineas.idArticulo) + "," +
                                                    nameof(VTA_PresupuestosLineas.idArticuloComodin) + "," +
                                                    nameof(VTA_PresupuestosLineas.descripcionArticuloComodin) + "," +
                                                    nameof(VTA_PresupuestosLineas.numeroLinea) + "," +
                                                    nameof(VTA_PresupuestosLineas.idAlmacen) + "," +
                                                    nameof(VTA_PresupuestosLineas.idUbicacion) + "," +
                                                    nameof(VTA_PresupuestosLineas.cantidad) + "," +
                                                    nameof(VTA_PresupuestosLineas.idEmbalaje) + "," +
                                                    nameof(VTA_PresupuestosLineas.relacion) + "," +
                                                    nameof(VTA_PresupuestosLineas.operacion) + "," +
                                                    nameof(VTA_PresupuestosLineas.segundaUnidad_Precio_Cantidad_SegundaUnidad) + "," +
                                                    nameof(VTA_PresupuestosLineas.segundaUnidad_relacion) + "," +
                                                    nameof(VTA_PresupuestosLineas.segundaUnidad_idEmbalaje) + "," +
                                                    nameof(VTA_PresupuestosLineas.segundaUnidad_cantidad) + "," +
                                                    nameof(VTA_PresupuestosLineas.idNomenclaturaPrecio) + "," +
                                                    nameof(VTA_PresupuestosLineas.precio) + "," +
                                                    nameof(VTA_PresupuestosLineas.numeroRedondeo) + "," +
                                                    nameof(VTA_PresupuestosLineas.descuentoGeneral) + "," +
                                                    nameof(VTA_PresupuestosLineas.importe) + "," +
                                                    nameof(VTA_PresupuestosLineas.idImpuestoTipo) + "," +
                                                    nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + "," +
                                                    nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_idEmbalaje) + "," +
                                                    nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_relacion) + "," +
                                                    nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_operacion) + "," +
                                                    nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_precio) + "," +
                                                    nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad) + "," +
                                                    nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_relacion) + "," +
                                                    nameof(VTA_PresupuestosLineas.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje) + "," +
                                                    nameof(VTA_PresupuestosLineas.fechaBorrado) + "," +
                                                    nameof(VTA_PresupuestosLineas.idTipoCompraVenta) +
                                            " ) " +
                                            " OUTPUT INSERTED." + nameof(VTA_PresupuestosLineas.id) +
                                            " VALUES " +
                                            " ( " +
                                                "@idPresupuestoCabecera," +
                                                "@idArticulo," +
                                                "@idArticuloComodin," +
                                                "@descripcionArticuloComodin," +
                                                "@numeroLinea," +
                                                "@idAlmacen," +
                                                "@idUbicacion," +
                                                "@cantidad," +
                                                "@idEmbalaje," +
                                                "@relacion," +
                                                "@operacion," +
                                                "@segundaUnidad_Precio_Cantidad_SegundaUnidad," +
                                                "@segundaUnidad_relacion," +
                                                "@segundaUnidad_idEmbalaje," +
                                                "@segundaUnidad_cantidad," +
                                                "@idNomenclaturaPrecio," +
                                                "@precio," +
                                                "@numeroRedondeo," +
                                                "@descuentoGeneral," +
                                                "@importe," +
                                                "@idImpuestoTipo," +
                                                "@idPresupuestoLinea_Padre," +
                                                "@embalajePrincipalDelArticulo_idEmbalaje," +
                                                "@embalajePrincipalDelArticulo_relacion," +
                                                "@embalajePrincipalDelArticulo_operacion," +
                                                "@embalajePrincipalDelArticulo_precio," +
                                                "@embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad," +
                                                "@embalajePrincipalDelArticulo_segundaUnidad_relacion," +
                                                "@embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje," +
                                                "@fechaBorrado," +
                                                "@idTipoCompraVenta" +
                                            " ) ";
                //Parametros
                object[] arr_Parametros_Insert = new object[]
                {
                      new SqlParameter("@idPresupuestoCabecera",  mdl_VTA_PresupuestosLineas_Final.idPresupuestoCabecera),
                        mdl_VTA_PresupuestosLineas_Final.idArticulo!=null
                            ?   new SqlParameter("@idArticulo", mdl_VTA_PresupuestosLineas_Final.idArticulo.Value)
                            :   new SqlParameter("@idArticulo",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.idArticuloComodin!=null
                            ?   new SqlParameter("@idArticuloComodin", mdl_VTA_PresupuestosLineas_Final.idArticuloComodin.Value)
                            :   new SqlParameter("@idArticuloComodin",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.descripcionArticuloComodin!=null
                            ?   new SqlParameter("@descripcionArticuloComodin", mdl_VTA_PresupuestosLineas_Final.descripcionArticuloComodin)
                            :   new SqlParameter("@descripcionArticuloComodin",  DBNull.Value),
                        new SqlParameter("@numeroLinea",  mdl_VTA_PresupuestosLineas_Final.numeroLinea),
                        new SqlParameter("@idAlmacen",  mdl_VTA_PresupuestosLineas_Final.idAlmacen),
                        mdl_VTA_PresupuestosLineas_Final.idUbicacion!=null
                            ?   new SqlParameter("@idUbicacion", mdl_VTA_PresupuestosLineas_Final.idUbicacion.Value)
                            :   new SqlParameter("@idUbicacion",  DBNull.Value),
                        new SqlParameter("@cantidad",  mdl_VTA_PresupuestosLineas_Final.cantidad),
                        new SqlParameter("@idEmbalaje",  mdl_VTA_PresupuestosLineas_Final.idEmbalaje),
                        new SqlParameter("@relacion",  mdl_VTA_PresupuestosLineas_Final.relacion),
                        mdl_VTA_PresupuestosLineas_Final.operacion!=null
                            ?   new SqlParameter("@operacion", mdl_VTA_PresupuestosLineas_Final.operacion)
                            :   new SqlParameter("@operacion",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_Precio_Cantidad_SegundaUnidad!=null
                            ?   new SqlParameter("@segundaUnidad_Precio_Cantidad_SegundaUnidad", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_Precio_Cantidad_SegundaUnidad.Value)
                            :   new SqlParameter("@segundaUnidad_Precio_Cantidad_SegundaUnidad",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_relacion!=null
                            ?   new SqlParameter("@segundaUnidad_relacion", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_relacion.Value)
                            :   new SqlParameter("@segundaUnidad_relacion",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_idEmbalaje!=null
                            ?   new SqlParameter("@segundaUnidad_idEmbalaje", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_idEmbalaje.Value)
                            :   new SqlParameter("@segundaUnidad_idEmbalaje",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.segundaUnidad_cantidad!=null
                            ?   new SqlParameter("@segundaUnidad_cantidad", mdl_VTA_PresupuestosLineas_Final.segundaUnidad_cantidad.Value)
                            :   new SqlParameter("@segundaUnidad_cantidad",  DBNull.Value),
                        new SqlParameter("@idNomenclaturaPrecio",  mdl_VTA_PresupuestosLineas_Final.idNomenclaturaPrecio),
                        new SqlParameter("@precio",  mdl_VTA_PresupuestosLineas_Final.precio),
                        mdl_VTA_PresupuestosLineas_Final.numeroRedondeo!=null
                            ?   new SqlParameter("@numeroRedondeo", mdl_VTA_PresupuestosLineas_Final.numeroRedondeo.Value)
                            :   new SqlParameter("@numeroRedondeo",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.descuentoGeneral!=null
                            ?   new SqlParameter("@descuentoGeneral", mdl_VTA_PresupuestosLineas_Final.descuentoGeneral.Value)
                            :   new SqlParameter("@descuentoGeneral",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.importe!=null
                            ?   new SqlParameter("@importe", mdl_VTA_PresupuestosLineas_Final.importe.Value)
                            :   new SqlParameter("@importe",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.idImpuestoTipo!=null
                            ?   new SqlParameter("@idImpuestoTipo", mdl_VTA_PresupuestosLineas_Final.idImpuestoTipo.Value)
                            :   new SqlParameter("@idImpuestoTipo",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.idPresupuestoLinea_Padre!=null
                            ?   new SqlParameter("@idPresupuestoLinea_Padre", mdl_VTA_PresupuestosLineas_Final.idPresupuestoLinea_Padre.Value)
                            :   new SqlParameter("@idPresupuestoLinea_Padre",  DBNull.Value),
                        new SqlParameter("@embalajePrincipalDelArticulo_idEmbalaje",  mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_idEmbalaje),
                        new SqlParameter("@embalajePrincipalDelArticulo_relacion",  mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_relacion),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_operacion!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_operacion", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_operacion)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_operacion",  DBNull.Value),
                        new SqlParameter("@embalajePrincipalDelArticulo_precio",  mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_precio),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad.Value)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_Precio_Cantidad_SegundaUnidad",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_relacion!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_relacion", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_relacion.Value)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_relacion",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje!=null
                            ?   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje", mdl_VTA_PresupuestosLineas_Final.embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje.Value)
                            :   new SqlParameter("@embalajePrincipalDelArticulo_segundaUnidad_idEmbalaje",  DBNull.Value),
                        mdl_VTA_PresupuestosLineas_Final.fechaBorrado!=null
                            ?   new SqlParameter("@fechaBorrado", mdl_VTA_PresupuestosLineas_Final.fechaBorrado.Value)
                            :   new SqlParameter("@fechaBorrado",  DBNull.Value),
                        new SqlParameter("@idTipoCompraVenta",  mdl_VTA_PresupuestosLineas_Final.idTipoCompraVenta)

                };
                #endregion

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

                #region TABLAS RELACIONADAS
                //TARIFAS/PROMOCIONES
                if (_mdl_VTA_PresupuestosLineas_AGrabar.VTA_PresupuestosLineas_TarifasPromociones != null && _mdl_VTA_PresupuestosLineas_AGrabar.VTA_PresupuestosLineas_TarifasPromociones.Count > 0)
                {
                    VTA_PresupuestosLineas_TarifasPromociones_Datos obj_VTA_PresupuestosLineas_TarifasPromociones_Datos = new VTA_PresupuestosLineas_TarifasPromociones_Datos();

                    foreach (VTA_PresupuestosLineas_TarifasPromociones mdl_VTA_PresupuestosLineas_TarifasPromociones in _mdl_VTA_PresupuestosLineas_AGrabar.VTA_PresupuestosLineas_TarifasPromociones)
                    {
                        //Añadir el idPresupuestoLinea
                        mdl_VTA_PresupuestosLineas_TarifasPromociones.idPresupuestoLinea = mdl_INTERNO_ValorDevuelto_Modelo.Id;

                        //Insertar
                        obj_VTA_PresupuestosLineas_TarifasPromociones_Datos.Insertar(mdl_VTA_PresupuestosLineas_TarifasPromociones);
                    }
                }

                //COMENTARIOS
                if (_mdl_VTA_PresupuestosLineas_AGrabar.VTA_PresupuestosLineas_Comentarios != null && _mdl_VTA_PresupuestosLineas_AGrabar.VTA_PresupuestosLineas_Comentarios.Count > 0)
                {
                    VTA_PresupuestosLineas_Comentarios_Datos obj_VTA_PresupuestosLineas_Comentarios_Datos = new VTA_PresupuestosLineas_Comentarios_Datos();

                    foreach (VTA_PresupuestosLineas_Comentarios mdl_VTA_PresupuestosLineas_Comentarios in _mdl_VTA_PresupuestosLineas_AGrabar.VTA_PresupuestosLineas_Comentarios)
                    {
                        //Añadir el idPresupuestoLinea
                        mdl_VTA_PresupuestosLineas_Comentarios.idPresupuestoLinea = mdl_INTERNO_ValorDevuelto_Modelo.Id;

                        //Insertar
                        obj_VTA_PresupuestosLineas_Comentarios_Datos.Insertar(mdl_VTA_PresupuestosLineas_Comentarios);
                    }
                }

                //LINEA EN PROMOCION
                if (_mdl_VTA_PresupuestosLineas_AGrabar.VTA_PresupuestosLineas1 != null && _mdl_VTA_PresupuestosLineas_AGrabar.VTA_PresupuestosLineas1.Count > 0)
                {
                    foreach (VTA_PresupuestosLineas mdl_VTA_PresupuestosLineas_EnPromocion in _mdl_VTA_PresupuestosLineas_AGrabar.VTA_PresupuestosLineas1)
                    {
                        //Añadir el idAlbaranFacturaLinea
                        mdl_VTA_PresupuestosLineas_EnPromocion.idPresupuestoLinea_Padre = mdl_INTERNO_ValorDevuelto_Modelo.Id;

                        //Insertar
                        Insertar(mdl_VTA_PresupuestosLineas_EnPromocion);
                    }
                }
                #endregion

                // Grabar un registro de trazabilidad con los datos de la transaccion realizada.
                Datos_Generales.USR_Trazabilidad_Grabar(typeof(VTA_PresupuestosLineas), mdl_VTA_PresupuestosLineas_DatosViejos, mdl_VTA_PresupuestosLineas_Final, mdl_INTERNO_ValorDevuelto_Modelo.TipoAccion, obj_Exferia_Entities);

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

        public void Actualizar_NumeroLinea(Dictionary<long, int> _dct_IdPresupuestoLinea_NumeroLinea)
        {
            Exferia_Entities obj_Exferia_Entities = null;

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

                string str_Actualizacion_Final = "";
                int int_Contador = 0;
                foreach (KeyValuePair<long, int> kvp_valores in _dct_IdPresupuestoLinea_NumeroLinea)
                {

                    str_Actualizacion_Final += " UPDATE " + nameof(VTA_PresupuestosLineas) +
                                                    " SET " + nameof(VTA_PresupuestosLineas.numeroLinea) + "=" + kvp_valores.Value +
                                                " WHERE " + nameof(VTA_PresupuestosLineas.id) + "=" + kvp_valores.Key + System.Environment.NewLine;

                    if (int_Contador == 20)
                    {
                        //Actualizar
                        obj_Exferia_Entities.Database.ExecuteSqlCommand(str_Actualizacion_Final);

                        //inicializar valores
                        str_Actualizacion_Final = "";
                        int_Contador = 0;
                    }

                    int_Contador += 1;
                }

                if (str_Actualizacion_Final.Trim().Length > 0)
                {
                    //Actualizar
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_Actualizacion_Final);
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Actualizar_NumeroLinea), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
        }
        
        #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;


            bool bol_ActualizarFechaBorrado = false;//Este campo se utiliza por si no se puede borrar, que actualice la fecha de borrado

            // Se utiliza la transaccion por la llamada al procedimiento de almacenado
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    obj_Exferia_Entities = new Exferia_Entities();
                    obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                    // Ver si existe ######################################################################
                    VTA_PresupuestosLineas mdl_VTA_PresupuestosLineas_Final = Obtener_Modelo_Por_Id(_lng_id);
                    //######################################################################################

                    if (mdl_VTA_PresupuestosLineas_Final != null)
                    {
                        //Se intenta borrar, si diera un error porque esta relacaionado se graba la fecha de baja
                        try
                        {
                            //Lineas Asociadas
                            string str_SQL_ASOCIADOS = " DELETE FROM " + nameof(VTA_PresupuestosLineas) +
                                                        " WHERE " + nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + " is not null and " + nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + " = " + _lng_id;
                            obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_ASOCIADOS);

                            //Linea
                            string str_SQL = " DELETE FROM " + nameof(VTA_PresupuestosLineas) +
                                                  " WHERE " + nameof(VTA_PresupuestosLineas.id) + " = " + _lng_id;
                            obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL);

                            // Grabar un registro de trazabilidad con los datos de la transaccion realizada.
                            Datos_Generales.USR_Trazabilidad_Grabar(typeof(VTA_PresupuestosLineas), null, mdl_VTA_PresupuestosLineas_Final, G_ENUM_TIPOACCION.INT_ELIMINAR, obj_Exferia_Entities);
                        }
                        catch (Exception ex)
                        {
                            var sqlException = ex.GetBaseException() as SqlException;
                            if (sqlException != null)
                            {
                                if (sqlException.Errors.Count > 0)
                                {
                                    switch (sqlException.Errors[0].Number)
                                    {
                                        case Control_Errores.G_INT_ERRORCONTROLADO_BORRAR_CONFLICTO_CLAVEFORANEA: // Foreign Key violation
                                            bol_ActualizarFechaBorrado = true;
                                            break;
                                        default:
                                            throw;
                                    }
                                }
                            }
                            else
                            {
                                throw;
                            }
                        }
                    }


                    // Actualizar la fecha de baja , al no poder borrarlo por tener relaciones
                    if (bol_ActualizarFechaBorrado)
                    {
                        #region Update
                        string str_SQL_Update = " UPDATE " + nameof(VTA_PresupuestosLineas) +
                                                    " SET " +
                                                    nameof(VTA_PresupuestosLineas.fechaBorrado) + "=@fechaBorrado " +
                                                " WHERE " +
                                                    nameof(VTA_PresupuestosLineas.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(VTA_PresupuestosLineas), null, mdl_VTA_PresupuestosLineas_Final, G_ENUM_TIPOACCION.INT_ELIMINAR, obj_Exferia_Entities);
                    }

                    // Devolver también el Objeto
                    mdl_ValorDevuelto_Modelo.Id = _lng_id;

                    // Se termina la Transaccion Correctamente
                    transaccion_SQL.Complete();
                }
                catch (Control_Errores)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Borrar), true);
                }
                finally
                {
                    obj_Exferia_Entities.Database.Connection.Close();
                    obj_Exferia_Entities.Dispose();

                    
                    transaccion_SQL.Dispose();
                }
            }

            return mdl_ValorDevuelto_Modelo;
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(long _lng_id, long _lng_idAuxiliar)
        {
            return null;
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(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();
                obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

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

                if (lst_idPresupusto != null & lst_idPresupusto.Count > 0)
                {
                    string str_Filtro_PresupuestoLinea = Funciones.Formar_ContenidoIN_ParaConsultaWhere(lst_idPresupusto);

                    //Lineas Asociadas
                    string str_SQL_ASOCIADOS = " DELETE FROM " + nameof(VTA_PresupuestosLineas) +
                                     " WHERE " + nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + " is not null and " + nameof(VTA_PresupuestosLineas.idPresupuestoLinea_Padre) + " in (" + str_Filtro_PresupuestoLinea + ")";
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_ASOCIADOS);

                    //Lineas
                    string str_SQL = " DELETE FROM " + nameof(VTA_PresupuestosLineas) +
                                     " WHERE " + nameof(VTA_PresupuestosLineas.id) + " in (" + str_Filtro_PresupuestoLinea + ")";
                    obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL);
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VTA_PresupuestosLineas_Datos) + "/" + nameof(Borrar), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion
    }
}
