using Exferia_Aplicacion.Herencia.Capas;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Exferia_Aplicacion.General;
using Exferia_EntityFramework;
using System.Runtime.CompilerServices;
using Exferia_General;
using Exferia_Maestros._0_Modelos;
using Exferia_Aplicacion.Modelos_MantenimientoAgrupacionesCabecera;
using System.Data.SqlClient;
using System.Transactions;
using static Exferia_Aplicacion.General.Enumerados;
using Exferia_Aplicacion.Calculos.VentasCompras;
using System.Threading;

namespace Exferia_Maestros._1_Datos
{
    public class MAE_Clientes_Articulos_Datos : ABS_Datos
    {
        #region Listado
        private List<INTERNO_MAE_Clientes_Articulos_Listado_Modelo> g_lst_INTERNO_MAE_Clientes_Articulos_Listado_Modelo = null;

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

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

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

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

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

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

                if ((g_lst_INTERNO_MAE_Clientes_Articulos_Listado_Modelo != null) && (g_lst_INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Count() > 0))
                {
                    dnm_MAE = g_lst_INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Cast<dynamic>().ToList();
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(MAE_Clientes_Articulos_Datos) + "/" + nameof(Obtener_RegistroListado), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return dnm_MAE;
        }
        protected override void ConsultaRellenar_Listado(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
            {
                List<SqlParameter> lst_Parametros = new List<SqlParameter>();

                string str_Filtros_Empresas = Funciones.Formar_ContenidoIN_ParaConsultaWhere(_lst_idEmpresasRelacionadas);

                string str_SQL =
                      " SELECT " +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.id) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.id) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.orden) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.orden) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.desactivada) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.desactivada) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.mostrarWeb) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.mostrarWeb) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.libreObligatorio) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.libreObligatorio) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.fechaDesde) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaDesde) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.fechaHasta) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaHasta) + "," +
                          //ids
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idAgrupacionClienteLinea) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idAgrupacionArticuloLinea) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idCliente) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idTarifaPromocion) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idEmpresa) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idEmpresa) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idPromocionEsquemaCabecera) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + "," +
                          //Cliente
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Cliente_Codigo) + " = " + nameof(MAE_Clientes) + "." + nameof(MAE_Clientes.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Cliente_Descripcion) + " =" + nameof(MAE_Clientes) + "." + nameof(MAE_Clientes.razonSocial) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Cliente_FechaBorrado) + " =" + nameof(MAE_Clientes) + "." + nameof(MAE_Clientes.fechaBorrado) + "," +
                          //AsociacionCliente
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionCliente_Codigo) + " = " + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionCliente_Descripcion) + " =" + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionCliente_FechaBorrado) + " =" + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.fechaBorrado) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionCliente_IdsClientesAgrupados) + " =    (SELECT TOP 1 " + nameof(MAE_Clientes_AgrupacionesClientesLineas) + "." + nameof(MAE_Clientes_AgrupacionesClientesLineas.idCliente) +
                                                                                                                                " FROM " + nameof(MAE_Clientes_AgrupacionesClientesLineas) +
                                                                                                                                " WHERE " + nameof(MAE_Clientes_AgrupacionesClientesLineas) + "." + nameof(MAE_Clientes_AgrupacionesClientesLineas.idAgrupacionClienteLinea) + " = " + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.id) +
                                                                                                                                " )," +
                          //Articulo
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Articulo_Codigo) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Articulo_Descripcion) + " =" + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Articulo_FechaBorrado) + " =" + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.fechaBorrado) + "," +
                          //AsociacionArticulo
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionArticulo_Codigo) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionArticulo_Descripcion) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionArticulo_FechaBorrado) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.fechaBorrado) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionArticulo_IdsArticulosAgrupados) + " = (SELECT TOP 1 " + nameof(MAE_Articulos_AgrupacionesArticulosLineas) + "." + nameof(MAE_Articulos_AgrupacionesArticulosLineas.idArticulo) +
                                                                                                                                    " FROM " + nameof(MAE_Articulos_AgrupacionesArticulosLineas) +
                                                                                                                                    " WHERE " + nameof(MAE_Articulos_AgrupacionesArticulosLineas) + "." + nameof(MAE_Articulos_AgrupacionesArticulosLineas.idAgrupacionArticuloLinea) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.id) +
                                                                                                                                    " )," +
                          //Empresa
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Empresa_Codigo) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Empresa_Descripcion) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Empresa_FechaBorrado) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.fechaBorrado) + "," +
                          //TarifaPromocion
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.TarifaPromocion_Codigo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.TarifaPromocion_Descripcion) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.TarifaPromocion_FechaBorrado) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.fechaBorrado) + "," +
                          //PromocionesEsquema_Cabecera
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.PromocionEsquema_Codigo) + " = " + nameof(MAE_PromocionesEsquema_Cabecera) + "." + nameof(MAE_PromocionesEsquema_Cabecera.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.PromocionEsquema_Descripcion) + " = " + nameof(MAE_PromocionesEsquema_Cabecera) + "." + nameof(MAE_PromocionesEsquema_Cabecera.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.PromocionEsquema_FechaBorrado) + " = " + nameof(MAE_PromocionesEsquema_Cabecera) + "." + nameof(MAE_PromocionesEsquema_Cabecera.fechaBorrado) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.PromocionEsquema_IdsPromocionesAgrupados) + " = (SELECT TOP 1 " + nameof(MAE_PromocionesEsquema_Lineas) + "." + nameof(MAE_PromocionesEsquema_Lineas.idTarifaPromocion) +
                                                                                                                                    " FROM " + nameof(MAE_PromocionesEsquema_Lineas) +
                                                                                                                                    " WHERE NOT " + nameof(MAE_PromocionesEsquema_Lineas) + "." + nameof(MAE_PromocionesEsquema_Lineas.idTarifaPromocion) + " IS NULL AND "
                                                                                                                                                  + nameof(MAE_PromocionesEsquema_Lineas) + "." + nameof(MAE_PromocionesEsquema_Lineas.tipo) + "=@tipo" +
                                                                                                                                    " )" +
                      " FROM " + nameof(MAE_Clientes_Articulos) +
                      //Cliente
                      " LEFT JOIN " + nameof(MAE_Clientes) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " = " + nameof(MAE_Clientes) + "." + nameof(MAE_Clientes.id) +
                      //AsociacionCliente
                      " LEFT JOIN " + nameof(MAE_AgrupacionesClientesLineas) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " = " + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.id) +
                      //Articulo
                      " LEFT JOIN " + nameof(MAE_Articulos) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.id) +
                      //AsociacionArticulo
                      " LEFT JOIN " + nameof(MAE_AgrupacionesArticulosLineas) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.id) +
                      //Empresa
                      " LEFT JOIN " + nameof(GEN_Empresas) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idEmpresa) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.id) +
                      //TarifaPromocion
                      " LEFT JOIN " + nameof(MAE_TarifasPromociones) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.id) +
                      //PromocionesEsquema_Cabecera
                      " LEFT JOIN " + nameof(MAE_PromocionesEsquema_Cabecera) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + " = " + nameof(MAE_PromocionesEsquema_Cabecera) + "." + nameof(MAE_PromocionesEsquema_Cabecera.id) +
                      " WHERE ( " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idEmpresa) + "=@idEmpresa" +
                                        (
                                            (_lst_idEmpresasRelacionadas != null && _lst_idEmpresasRelacionadas.Count > 0)
                                                ? (" OR " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idEmpresa) + " in (" + str_Filtros_Empresas + ") ")
                                                : " "
                                        ) +
                                " ) AND " +
                                (
                                        (_lng_id > -1)
                                        ?
                                        (nameof(MAE_Clientes_Articulos) + "." + (nameof(MAE_Clientes_Articulos.id) + "=@id"))
                                        : ("1 = 1")
                                );

                //Parametros
                lst_Parametros.Add(new SqlParameter("@id", _lng_id));
                lst_Parametros.Add(new SqlParameter("@idEmpresa", _lng_idEmpresaSeleccionada));
                lst_Parametros.Add(new SqlParameter("@tipo", Variables.G_INT_TIPO_TARIFAPROMOCION_PROMOCIONES_CODIGO));

                object[] arr_Parametros = lst_Parametros.ToArray();

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

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

        #region Listado Secundario
        public override List<dynamic> Obtener_Listado_Secundario(long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<string> _lst_CamposConRelacionABuscar, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        {
            return null;
        }
        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)
        {
            return null;
        }
        protected override void ConsultaRellenar_Listado_Secundario(Exferia_Entities _obj_Exferia_Entities, long _lng_idEmpresaSeleccionada, long _lng_idEjercicioActual, List<long> _lst_idEmpresasRelacionadas, List<string> _lst_CamposConRelacionABuscar, long _lng_id, List<long> _lst_ids, List<INTERNO_Filtro_OpcionPadre_Modelo> _lst_INTERNO_Filtro_OpcionPadre_Modelo, List<INTERNO_Filtro_Modelo> _lst_INTERNO_Filtro_Modelo)
        { }
        #endregion

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

        #region Obtener

        #region Obtener Simple
        private dynamic g_dnm_Modelo_Obtener = null;

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

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

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

                string str_SQL =
               " SELECT " +
                        nameof(MAE_Clientes_Articulos.id) + "," +
                        nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + "," +
                        nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + "," +
                        nameof(MAE_Clientes_Articulos.idCliente) + "," +
                        nameof(MAE_Clientes_Articulos.idArticulo) + "," +
                        nameof(MAE_Clientes_Articulos.orden) + "," +
                        nameof(MAE_Clientes_Articulos.desactivada) + "," +
                        nameof(MAE_Clientes_Articulos.mostrarWeb) + "," +
                        nameof(MAE_Clientes_Articulos.libreObligatorio) + "," +
                        nameof(MAE_Clientes_Articulos.idEmpresa) + "," +
                        nameof(MAE_Clientes_Articulos.idTarifaPromocion) + "," +
                        nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + "," +
                        nameof(MAE_Clientes_Articulos.fechaDesde) + "," +
                        nameof(MAE_Clientes_Articulos.fechaHasta) +
               " FROM " + nameof(MAE_Clientes_Articulos) +
               " WHERE " + nameof(MAE_Clientes_Articulos.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<MAE_Clientes_Articulos>(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_AgrupacionesArticulosLineas ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idAgrupacionArticuloLinea != null)
                    {
                        ThreadStart obj_ThreadStart_AGRUAPCIONARTICULOLINEA = new ThreadStart(Obtener_AgrupacionArticuloLinea_Modelo_Obtener);
                        Thread obj_Thread_AGRUAPCIONARTICULOLINEA = new Thread(obj_ThreadStart_AGRUAPCIONARTICULOLINEA);
                        obj_Thread_AGRUAPCIONARTICULOLINEA.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[0] = true;
                    }

                    //MAE_AgrupacionesClientesLineas ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idAgrupacionClienteLinea != null)
                    {
                        ThreadStart obj_ThreadStart_AGRUAPCIONCLIENTELINEA = new ThreadStart(Obtener_AgrupacionClienteLinea_Modelo_Obtener);
                        Thread obj_Thread_AGRUAPCIONCLIENTELINEA = new Thread(obj_ThreadStart_AGRUAPCIONCLIENTELINEA);
                        obj_Thread_AGRUAPCIONCLIENTELINEA.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[1] = true;
                    }

                    //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[2] = true;
                    }

                    //MAE_Clientes ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idCliente != null)
                    {
                        ThreadStart obj_ThreadStart_CLIENTE = new ThreadStart(Obtener_Cliente_Modelo_Obtener);
                        Thread obj_Thread_CLIENTE = new Thread(obj_ThreadStart_CLIENTE);
                        obj_Thread_CLIENTE.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[3] = true;
                    }

                    //MAE_TarifasPromociones ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idTarifaPromocion != null)
                    {
                        ThreadStart obj_ThreadStart_TARIFAPROMOCION = new ThreadStart(Obtener_TarifaPromocion_Modelo_Obtener);
                        Thread obj_Thread_TARIFAPROMOCION = new Thread(obj_ThreadStart_TARIFAPROMOCION);
                        obj_Thread_TARIFAPROMOCION.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[4] = true;
                    }

                    //MAE_PromocionesEsquema_Cabecera ##########################################################################################
                    if (g_dnm_Modelo_Obtener.idPromocionEsquemaCabecera != null)
                    {
                        ThreadStart obj_ThreadStart_PROMOCIONESQUEMACABECERA = new ThreadStart(Obtener_PromocionEsquemaCabecera_Modelo_Obtener);
                        Thread obj_Thread_PROMOCIONESQUEMACABECERA = new Thread(obj_ThreadStart_PROMOCIONESQUEMACABECERA);
                        obj_Thread_PROMOCIONESQUEMACABECERA.Start();
                    }
                    else
                    {
                        g_bol_Hilos_Terminados_Obtener[5] = true;
                    }

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

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

                }
                #endregion
                
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(MAE_Clientes_Articulos_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_AgrupacionArticuloLinea_Modelo_Obtener()
        {
            try
            {
                MAE_AgrupacionesArticulosLineas_Datos obj_MAE_AgrupacionesArticulosLineas_Datos = new MAE_AgrupacionesArticulosLineas_Datos();
                g_dnm_Modelo_Obtener.MAE_AgrupacionesArticulosLineas = obj_MAE_AgrupacionesArticulosLineas_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idAgrupacionArticuloLinea);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[0] = true;
            }
        }
        private void Obtener_AgrupacionClienteLinea_Modelo_Obtener()
        {
            try
            {
                MAE_AgrupacionesClientesLineas_Datos obj_MAE_AgrupacionesClientesLineas_Datos = new MAE_AgrupacionesClientesLineas_Datos();
                g_dnm_Modelo_Obtener.MAE_AgrupacionesClientesLineas = obj_MAE_AgrupacionesClientesLineas_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idAgrupacionClienteLinea);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[1] = true;
            }
        }
        private void Obtener_Articulo_Modelo_Obtener()
        {
            try
            {
                MAE_Articulos_Datos obj_MAE_Articulos_Datos = new MAE_Articulos_Datos();
                g_dnm_Modelo_Obtener.MAE_Articulos = obj_MAE_Articulos_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idArticulo,
                                                                                                   false,
                                                                                                   false,
                                                                                                   false,
                                                                                                   false,
                                                                                                   false,
                                                                                                   false,
                                                                                                   false);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[2] = true;
            }
        }
        private void Obtener_Cliente_Modelo_Obtener()
        {
            try
            {
                MAE_Clientes_Datos obj_MAE_Clientes_Datos = new MAE_Clientes_Datos();
                g_dnm_Modelo_Obtener.MAE_Clientes = obj_MAE_Clientes_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idCliente, false, false, false, false, false, false, false, false);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[3] = true;
            }
        }
        private void Obtener_TarifaPromocion_Modelo_Obtener()
        {
            try
            {
                MAE_TarifasPromociones_Datos obj_MAE_TarifasPromociones_Datos = new MAE_TarifasPromociones_Datos();
                g_dnm_Modelo_Obtener.MAE_TarifasPromociones = obj_MAE_TarifasPromociones_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idTarifaPromocion);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[4] = true;
            }
        }
        private void Obtener_PromocionEsquemaCabecera_Modelo_Obtener()
        {
            try
            {
                MAE_PromocionesEsquema_Cabecera_Datos obj_MAE_PromocionesEsquema_Cabecera_Datos = new MAE_PromocionesEsquema_Cabecera_Datos();
                g_dnm_Modelo_Obtener.MAE_PromocionesEsquema_Cabecera = obj_MAE_PromocionesEsquema_Cabecera_Datos.Obtener_Modelo_Por_Id(g_dnm_Modelo_Obtener.idPromocionEsquemaCabecera);
            }
            catch (Control_Errores)
            { }
            finally
            {
                g_bol_Hilos_Terminados_Obtener[5] = true;
            }
        }
        #endregion
        #endregion

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

        public List<INTERNO_TarifaPromocion_VentasCompras_Modelo> Obtener_PorArticuloCliente(long _lng_idArticulo, long _lng_idCliente, DateTime _dtt_Fecha, long _lng_idEmpresa)
        {
            Exferia_Entities dbcontext = null;

            List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = new List<INTERNO_TarifaPromocion_VentasCompras_Modelo>();

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

                //Obtener las AgrupacionesLineas donde esta este cliente ...............
                MAE_AgrupacionesClientesLineas_Datos obj_MAE_AgrupacionesClientesLineas_Datos = new MAE_AgrupacionesClientesLineas_Datos();
                List<long> lst_idAgrupacionesLinea_Clientes = obj_MAE_AgrupacionesClientesLineas_Datos.Obtener_PorCliente(_lng_idCliente, _lng_idEmpresa, dbcontext);
                string str_idAgrupaciones_Clientes = string.Join(",", lst_idAgrupacionesLinea_Clientes.ToArray());
                //..................................................................

                //Obtener las AgrupacionesLineas donde este este articulo ................
                MAE_AgrupacionesArticulosLineas_Datos obj_MAE_AgrupacionesArticulosLineas_Datos = new MAE_AgrupacionesArticulosLineas_Datos();
                List<long> lst_idAgrupacionesLinea_Articulos = obj_MAE_AgrupacionesArticulosLineas_Datos.Obtener_PorArticulo(_lng_idArticulo, _lng_idEmpresa, dbcontext);
                string str_idAgrupaciones_Articulos = string.Join(",", lst_idAgrupacionesLinea_Articulos.ToArray());
                //.................................................................

                DateTime dtt_Fecha_Desde = new DateTime(_dtt_Fecha.Year, _dtt_Fecha.Month, _dtt_Fecha.Day, 0, 0, 0);
                DateTime dtt_Fecha_Hasta = new DateTime(_dtt_Fecha.Year, _dtt_Fecha.Month, _dtt_Fecha.Day, 23, 59, 59);

                #region Buscar Tarifa
                string str_SQL_Tarifa =
                                " SELECT  " +
                                    //TarifasPromociones
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Id) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.id) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Codigo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.codigo) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descripcion) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descripcion) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_1) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_1) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_2) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_2) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_3) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_3) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_4) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_4) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_5) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_5) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Incremento) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.incremento) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NumeroRedondeo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.numeroRedondeo) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_FechaBorrado) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.fechaBorrado) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_ClienteProveedor) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.clienteProveedor) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AportacionProveedor_Tipo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.aportacionProveedor_Tipo) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AportacionProveedor_Porcentaje) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.aportacionProveedor_Porcentaje) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_IdEmpresa) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.idEmpresa) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.tipo) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.precioFijoDinamico) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.precio) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.idNomenclaturaPrecio) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_DescuentoMoneda) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuentoMoneda) + ", " +
                                    //Promocion Por unidad
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_Cantidad_A) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_Cantidad_B) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_Porcentaje) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_idArticulo) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_idEmbalaje) + ", " +
                                    //Otros
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.orden) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.LibreObligatorio) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.libreObligatorio) + ", " +
                                    //Auxiliares
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.AUXILIAR_idClienteProveedor) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.AUXILIAR_idArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.AUXILIAR_idAgrupacionClienteProveedor) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.AUXILIAR_idAgrupacionArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + ", " +
                                    //Articulo
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_Codigo) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.codigo) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_Descripcion) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.descripcion) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_FechaBorrado) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.fechaBorrado) + ", " +
                                    //Embalaje
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_Codigo) + " = " + nameof(MAE_Embalajes) + "." + nameof(MAE_Embalajes.codigo) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_Descripcion) + " = " + nameof(MAE_Embalajes) + "." + nameof(MAE_Embalajes.descripcion) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_FechaBorrado) + " = " + nameof(MAE_Embalajes) + "." + nameof(MAE_Embalajes.fechaBorrado) + ", " +
                                    //NomenclaturaPrecio
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Codigo) + " = " + nameof(MAE_NomenclaturasPrecios) + "." + nameof(MAE_NomenclaturasPrecios.codigo) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Descripcion) + " = " + nameof(MAE_NomenclaturasPrecios) + "." + nameof(MAE_NomenclaturasPrecios.descripcion) + ", " +
                                    nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_FechaBorrado) + " = " + nameof(MAE_NomenclaturasPrecios) + "." + nameof(MAE_NomenclaturasPrecios.fechaBorrado) + " " +
                                " FROM " + nameof(MAE_Clientes_Articulos) +
                                " INNER JOIN " + nameof(MAE_TarifasPromociones) + " on " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.id) + " " +
                                " LEFT JOIN " + nameof(MAE_Articulos) + " on " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_idArticulo) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.id) +
                                " LEFT JOIN " + nameof(MAE_Embalajes) + " on " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_idEmbalaje) + " = " + nameof(MAE_Embalajes) + "." + nameof(MAE_Embalajes.id) +
                                " LEFT JOIN " + nameof(MAE_NomenclaturasPrecios) + " on " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.idNomenclaturaPrecio) + " = " + nameof(MAE_NomenclaturasPrecios) + "." + nameof(MAE_NomenclaturasPrecios.id) +
                                " WHERE " +
                                    " " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.fechaBorrado) + " is null AND " +
                                    " " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.desactivada) + " is null AND " +
                                    " " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.tipo) + " = " + Variables.G_INT_TIPO_TARIFAPROMOCION_TARIFA_CODIGO + " AND " +
                                    //Fecha
                                    " (" + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaDesde) + " is null OR " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaDesde) + "<='" + dtt_Fecha_Desde.ToString() + "') AND " +
                                    " (" + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaHasta) + " is null OR " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaHasta) + ">='" + dtt_Fecha_Hasta.ToString() + "') AND " +
                                    " (" +
                                        //CLIENTE Y ARTICULO..............
                                        " ( " +
                                            //Clientes
                                            " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " =" + _lng_idCliente + " AND " +
                                            //Articulo
                                            " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " =" + _lng_idArticulo +
                                        " ) " +
                                        " OR " +
                                        //CLIENTE Y AGRUPACION DE ARTICULOS..............
                                        " ( " +
                                            //Clientes
                                            " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " = " + _lng_idCliente + " AND " +
                                           //Agrupacion de Articulos
                                           (str_idAgrupaciones_Articulos.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " IN(" + str_idAgrupaciones_Articulos + ") " : "1<>1") +
                                        " ) " +
                                        " OR " +
                                        //AGRUPACION DE CLIENTE Y ARTICULOS..............
                                        " ( " +
                                            //Agrupacion de Clientes
                                            (str_idAgrupaciones_Clientes.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " IN(" + str_idAgrupaciones_Clientes + ")" : "1<>1") + " AND " +
                                            //Articulo
                                            " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " =" + _lng_idArticulo +
                                        " ) " +
                                        " OR " +
                                        //AGRUPACION DE CLIENTE Y AGRUPACION DE ARTICULOS..............
                                        " ( " +
                                             //Agrupacion de Clientes
                                             (str_idAgrupaciones_Clientes.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " IN(" + str_idAgrupaciones_Clientes + ")" : "1<>1") + " AND " +
                                             //Agrupacion de Articulos " +
                                             (str_idAgrupaciones_Articulos.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " IN(" + str_idAgrupaciones_Articulos + ") " : "1<>1") +
                                        " ) " +
                                    " )" +
                                //ORDENAR
                                " ORDER BY " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.orden) + " asc";


                List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS = dbcontext.Database.SqlQuery<INTERNO_TarifaPromocion_VentasCompras_Modelo>(str_SQL_Tarifa).ToList();
                if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS != null &&
                    lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS.Count > 0)
                {
                    //Se coje el orden del primer registro y se busca si hubiera mas registros para aplicarles el criterio de busqueda
                    int int_Orden = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS.FirstOrDefault().Orden;

                    List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS_FINAL = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS.Where(m => m.Orden.Equals(int_Orden)).ToList();
                    //Si tiene mas de un registro con ese orden se aplicara el cirterior de busqueda
                    // --> Cliente                    - Articulo
                    // --> Cliente                    - Agrupaciones de articulos
                    // --> Agrupaciones de Clientes  - Articulo
                    // --> Agrupaciones de Clientes  - Agrupaciones de articulos
                    if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS_FINAL.Count > 1)
                    {
                        INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL = null;

                        // CLIENTE - ARTICULO
                        mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS_FINAL.Where(m => m.AUXILIAR_idClienteProveedor != null && m.AUXILIAR_idArticulo != null).FirstOrDefault();
                        if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL != null)
                        {
                            lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL);
                        }
                        else
                        {
                            // CLIENTE - AGRUPACIONES DE ARTICULOS
                            mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS_FINAL.Where(m => m.AUXILIAR_idClienteProveedor != null && m.AUXILIAR_idAgrupacionArticulo != null).FirstOrDefault();
                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL != null)
                            {
                                lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL);
                            }
                            else
                            {
                                // AGRUPACIONES DE CLIENTES - ARTICULO
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS_FINAL.Where(m => m.AUXILIAR_idAgrupacionClienteProveedor != null && m.AUXILIAR_idArticulo != null).FirstOrDefault();
                                if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL != null)
                                {
                                    lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL);
                                }
                                else
                                {
                                    // AGRUPACIONES DE CLIENTES - AGRUPACIONES DE ARTICULOS
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS_FINAL.Where(m => m.AUXILIAR_idAgrupacionClienteProveedor != null && m.AUXILIAR_idAgrupacionArticulo != null).FirstOrDefault();
                                    if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL != null)
                                    {
                                        lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA_FINAL);
                                    }
                                }
                            }
                        }
                    }
                    //Solo hay una tarifa
                    else
                    {
                        lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Add(lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFAS_FINAL.FirstOrDefault());
                    }
                }
                #endregion

                #region Buscar Promociones
                string str_SQL_Promociones =
                                " SELECT  " +
                                    nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.id) + " = obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.id) + ", " +
                                    nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idTarifaPromocion) + " = obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idTarifaPromocion) + ", " +
                                    nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idPromocionEsquema) + " = obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idPromocionEsquema) + ", " +
                                    nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idArticulo) + " = obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idArticulo) + ", " +
                                    nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idAgrupacionArticulo) + " = obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idAgrupacionArticulo) + ", " +
                                    nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idClienteProveedor) + " = obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idClienteProveedor) + ", " +
                                    nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idAgrupacionClienteProveedor) + " = obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idAgrupacionClienteProveedor) + ", " +
                                    nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.libreObligatorio) + " = obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.libreObligatorio) + ", " +
                                    nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.orden) + " = obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.orden) + " " +
                                " FROM " +
                                " (" +
                                    //CONSULTA LAS PROMCIONES POR ESQUEMA DE PROMOCION
                                    " SELECT  " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.id) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.id) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idTarifaPromocion) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idPromocionEsquema) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idAgrupacionArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idClienteProveedor) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idAgrupacionClienteProveedor) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.libreObligatorio) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.libreObligatorio) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.orden) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.orden) + " " +
                                    " FROM " + nameof(MAE_Clientes_Articulos) +
                                    " WHERE " +
                                        " " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + " is null AND " +
                                        " " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.desactivada) + " is null AND " +
                                        //Fecha
                                        " (" + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaDesde) + " is null OR " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaDesde) + "<='" + dtt_Fecha_Desde.ToString() + "') AND " +
                                        " (" + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaHasta) + " is null OR " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaHasta) + ">='" + dtt_Fecha_Hasta.ToString() + "') AND " +
                                        " (" +
                                            //CLIENTE Y ARTICULO..............
                                            " ( " +
                                                //Cliente
                                                " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " =" + _lng_idCliente + " AND " +
                                                //Articulo
                                                " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " =" + _lng_idArticulo +
                                            " ) " +
                                            " OR " +
                                            //CLIENTE Y AGRUPACION DE ARTICULOS..............
                                            " ( " +
                                                //Cliente
                                                " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " = " + _lng_idCliente + " AND " +
                                               //Agrupacion de Articulos
                                               (str_idAgrupaciones_Articulos.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " IN(" + str_idAgrupaciones_Articulos + ") " : "1<>1") +
                                            " ) " +
                                            " OR " +
                                            //AGRUPACION DE CLIENTE Y ARTICULOS..............
                                            " ( " +
                                                //Agrupacion de Cliente
                                                (str_idAgrupaciones_Clientes.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " IN(" + str_idAgrupaciones_Clientes + ")" : "1<>1") + " AND " +
                                                //Articulo
                                                " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " =" + _lng_idArticulo +
                                            " ) " +
                                            " OR " +
                                            //AGRUPACION DE CLIENTE Y AGRUPACION DE ARTICULOS..............
                                            " ( " +
                                                 //Agrupacion de Cliente
                                                 (str_idAgrupaciones_Clientes.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " IN(" + str_idAgrupaciones_Clientes + ")" : "1<>1") + " AND " +
                                                 //Agrupacion de Articulos " +
                                                 (str_idAgrupaciones_Articulos.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " IN(" + str_idAgrupaciones_Articulos + ") " : "1<>1") +
                                            " ) " +
                                        " )" +
                                "UNION ALL " +
                                    //CONSULTA POR TARIFAPROMOCION
                                    " SELECT  " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.id) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.id) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idTarifaPromocion) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idPromocionEsquema) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idAgrupacionArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idClienteProveedor) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.idAgrupacionClienteProveedor) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.libreObligatorio) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.libreObligatorio) + ", " +
                                        nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.orden) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.orden) + " " +
                                    " FROM " + nameof(MAE_Clientes_Articulos) +
                                    " INNER JOIN " + nameof(MAE_TarifasPromociones) + " on " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.id) + " " +
                                    " WHERE " +
                                        " " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.fechaBorrado) + " is null AND " +
                                        " " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.desactivada) + " is null AND " +
                                        " " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.tipo) + " = " + Variables.G_INT_TIPO_TARIFAPROMOCION_PROMOCIONES_CODIGO + " AND " +
                                        //Fecha
                                        " (" + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaDesde) + " is null OR " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaDesde) + "<='" + dtt_Fecha_Desde.ToString() + "') AND " +
                                        " (" + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaHasta) + " is null OR " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaHasta) + ">='" + dtt_Fecha_Hasta.ToString() + "') AND " +
                                        " (" +
                                            //CLIENTE Y ARTICULO..............
                                            " ( " +
                                                //Cliente
                                                " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " =" + _lng_idCliente + " AND " +
                                                //Articulo
                                                " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " =" + _lng_idArticulo +
                                            " ) " +
                                            " OR " +
                                            //CLIENTE Y AGRUPACION DE ARTICULOS..............
                                            " ( " +
                                                //Cliente
                                                " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " = " + _lng_idCliente + " AND " +
                                               //Agrupacion de Articulos
                                               (str_idAgrupaciones_Articulos.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " IN(" + str_idAgrupaciones_Articulos + ") " : "1<>1") +
                                            " ) " +
                                            " OR " +
                                            //AGRUPACION DE CLIENTE Y ARTICULOS..............
                                            " ( " +
                                                //Agrupacion de Cliente
                                                (str_idAgrupaciones_Clientes.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " IN(" + str_idAgrupaciones_Clientes + ")" : "1<>1") + " AND " +
                                                //Articulo
                                                " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " =" + _lng_idArticulo +
                                            " ) " +
                                            " OR " +
                                            //AGRUPACION DE CLIENTE Y AGRUPACION DE ARTICULOS..............
                                            " ( " +
                                                 //Agrupacion de Cliente
                                                 (str_idAgrupaciones_Clientes.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " IN(" + str_idAgrupaciones_Clientes + ")" : "1<>1") + " AND " +
                                                 //Agrupacion de Articulos " +
                                                 (str_idAgrupaciones_Articulos.Length > 0 ? " (not " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " is null) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " IN(" + str_idAgrupaciones_Articulos + ") " : "1<>1") +
                                            " ) " +
                                        " )" +
                                ") AS obj_Final " +
                                //ORDENAR
                                " ORDER BY obj_Final." + nameof(INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.orden) + " asc";


                List<INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo> lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo = dbcontext.Database.SqlQuery<INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo>(str_SQL_Promociones).ToList();
                if (lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo != null &&
                    lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.Count > 0)
                {
                    INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL = null;

                    //Se coje el orden del primer registro y se busca si hubiera mas registros para aplicarles el criterio de busqueda
                    int int_Orden = lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.FirstOrDefault().orden;

                    List<INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo> lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL = lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo.Where(m => m.orden.Equals(int_Orden)).ToList();
                    //Si tiene mas de un registro con ese orden se aplicara el criterior de busqueda
                    // --> Cliente                    - Articulo
                    // --> Cliente                    - Agrupaciones de articulos
                    // --> Agrupaciones de Clientes  - Articulo
                    // --> Agrupaciones de Clientes  - Agrupaciones de articulos
                    if (lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL.Count > 1)
                    {
                        // CLIENTE - ARTICULO
                        mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL = lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL.Where(m => m.idClienteProveedor != null && m.idArticulo != null).FirstOrDefault();
                        if (mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL == null)
                        {
                            // CLIENTE - AGRUPACIONES DE ARTICULOS
                            mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL = lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL.Where(m => m.idClienteProveedor != null && m.idAgrupacionArticulo != null).FirstOrDefault();
                            if (mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL == null)
                            {
                                // AGRUPACIONES DE CLIENTES - ARTICULO
                                mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL = lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL.Where(m => m.idAgrupacionClienteProveedor != null && m.idArticulo != null).FirstOrDefault();
                                if (mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL == null)
                                {
                                    // AGRUPACIONES DE CLIENTES - AGRUPACIONES DE ARTICULOS
                                    mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL = lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL.Where(m => m.idAgrupacionClienteProveedor != null && m.idAgrupacionArticulo != null).FirstOrDefault();
                                }
                            }
                        }
                    }
                    //Solo hay una Promocion
                    else
                    {
                        mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL = lst_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL.FirstOrDefault();
                    }

                    //Tiene algun registro
                    if (mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL != null)
                    {
                        //Si es una promocion la busco y la agrego
                        if (mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL.idTarifaPromocion != null)
                        {
                            string str_SQL_Promocion_Simple =
                                        " SELECT  " +
                                        //TarifasPromociones
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Id) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.id) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Codigo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.codigo) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descripcion) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descripcion) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_1) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_1) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_2) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_2) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_3) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_3) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_4) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_4) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_5) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuento_5) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Incremento) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.incremento) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NumeroRedondeo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.numeroRedondeo) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_FechaBorrado) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.fechaBorrado) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_ClienteProveedor) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.clienteProveedor) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AportacionProveedor_Tipo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.aportacionProveedor_Tipo) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AportacionProveedor_Porcentaje) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.aportacionProveedor_Porcentaje) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_IdEmpresa) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.idEmpresa) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.tipo) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.precioFijoDinamico) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.precio) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.idNomenclaturaPrecio) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_DescuentoMoneda) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descuentoMoneda) + ", " +
                                        //Promocion Por unidad
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_Cantidad_A) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_Cantidad_B) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_Porcentaje) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_idArticulo) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_idEmbalaje) + ", " +
                                        //Otros
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.orden) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.LibreObligatorio) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.libreObligatorio) + ", " +
                                        //Auxiliares
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.AUXILIAR_idClienteProveedor) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.AUXILIAR_idArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.AUXILIAR_idAgrupacionClienteProveedor) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.AUXILIAR_idAgrupacionArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + ", " +
                                        //Articulo
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_Codigo) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.codigo) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_Descripcion) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.descripcion) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_FechaBorrado) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.fechaBorrado) + ", " +
                                        //Embalaje
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_Codigo) + " = " + nameof(MAE_Embalajes) + "." + nameof(MAE_Embalajes.codigo) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_Descripcion) + " = " + nameof(MAE_Embalajes) + "." + nameof(MAE_Embalajes.descripcion) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_FechaBorrado) + " = " + nameof(MAE_Embalajes) + "." + nameof(MAE_Embalajes.fechaBorrado) + ", " +
                                        //NomenclaturaPrecio
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Codigo) + " = " + nameof(MAE_NomenclaturasPrecios) + "." + nameof(MAE_NomenclaturasPrecios.codigo) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Descripcion) + " = " + nameof(MAE_NomenclaturasPrecios) + "." + nameof(MAE_NomenclaturasPrecios.descripcion) + ", " +
                                        nameof(INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_FechaBorrado) + " = " + nameof(MAE_NomenclaturasPrecios) + "." + nameof(MAE_NomenclaturasPrecios.fechaBorrado) + " " +
                                        " FROM " + nameof(MAE_Clientes_Articulos) +
                                        " INNER JOIN " + nameof(MAE_TarifasPromociones) + " on " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.id) + " " +
                                        " LEFT JOIN " + nameof(MAE_Articulos) + " on " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_idArticulo) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.id) +
                                        " LEFT JOIN " + nameof(MAE_Embalajes) + " on " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.AB_idEmbalaje) + " = " + nameof(MAE_Embalajes) + "." + nameof(MAE_Embalajes.id) +
                                        " LEFT JOIN " + nameof(MAE_NomenclaturasPrecios) + " on " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.idNomenclaturaPrecio) + " = " + nameof(MAE_NomenclaturasPrecios) + "." + nameof(MAE_NomenclaturasPrecios.id) +
                                        " WHERE " +
                                            " " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.id) + " = " + mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL.id;

                            INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCION_SIMPLE = dbcontext.Database.SqlQuery<INTERNO_TarifaPromocion_VentasCompras_Modelo>(str_SQL_Promocion_Simple).FirstOrDefault();
                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCION_SIMPLE != null)
                            {
                                lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCION_SIMPLE);
                            }
                        }
                        //Sino tendria que tratar el esquema y agregar las promociones
                        else
                        {
                            MAE_PromocionesEsquema_Cabecera_Datos obj_MAE_PromocionesEsquema_Cabecera_Datos = new MAE_PromocionesEsquema_Cabecera_Datos();
                            List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCIONESDELESQUEMA = obj_MAE_PromocionesEsquema_Cabecera_Datos.Obtener_Promociones_PorEsquema(mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL.idPromocionEsquema.Value, mdl_INTERNO_ValoresAuxiliaresParaConsultas_Promociones_Modelo_FINAL);

                            if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCIONESDELESQUEMA != null &&
                                lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCIONESDELESQUEMA.Count > 0)
                            {
                                lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.AddRange(lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCIONESDELESQUEMA);
                            }
                        }
                    }
                }
                #endregion

            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(MAE_Clientes_Articulos_Datos) + "/" + nameof(Obtener_PorArticuloCliente), true);
            }
            finally
            {
                dbcontext.Database.Connection.Close();
                dbcontext.Dispose();
            }
            return lst_INTERNO_TarifaPromocion_VentasCompras_Modelo;
        }


        public List<dynamic> Obtener_Listado_PorArticuloCliente(long _lng_idClienteArticulo,
                                                                long _lng_idArticulo,
                                                                long _lng_idAgrupacionArticulo,
                                                                long _lng_idCliente,
                                                                long _lng_idAgrupacionCliente,
                                                                long _lng_idEmpresa)
        {
            Exferia_Entities obj_Exferia_Entities = null;

            List<dynamic> lst_INTERNO_MAE_Clientes_Articulos_Listado_Modelo = null; ;

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

                //Obtener las AgrupacionesLineas donde esta este Cliente ...............
                MAE_AgrupacionesClientesLineas_Datos obj_MAE_AgrupacionesClientesLineas_Datos = new MAE_AgrupacionesClientesLineas_Datos();
                List<long> lst_idAgrupacionesLinea_Clientes = obj_MAE_AgrupacionesClientesLineas_Datos.Obtener_PorCliente(_lng_idCliente, _lng_idEmpresa, obj_Exferia_Entities);
                //..................................................................

                //Obtener las AgrupacionesLineas donde este este articulo ................
                MAE_AgrupacionesArticulosLineas_Datos obj_MAE_AgrupacionesArticulosLineas_Datos = new MAE_AgrupacionesArticulosLineas_Datos();
                List<long> lst_idAgrupacionesLinea_Articulos = obj_MAE_AgrupacionesArticulosLineas_Datos.Obtener_PorArticulo(_lng_idArticulo, _lng_idEmpresa, obj_Exferia_Entities);
                //.................................................................

                //Empresas
                List<long> lst_idEmpresasRelacionadas = Datos_Generales.GEN_Empresas_Devolver_EmpresasCompartidas_SegunFichero(_lng_idEmpresa, typeof(MAE_Clientes_Articulos).Name).ToList();

                List<SqlParameter> lst_Parametros = new List<SqlParameter>();
                string str_Filtro_Empresa = Funciones.Formar_ContenidoIN_ParaConsultaWhere(lst_idEmpresasRelacionadas);
                string str_Filtro_idAgrupacionesArticulosLineas = Funciones.Formar_ContenidoIN_ParaConsultaWhere(lst_idAgrupacionesLinea_Articulos);
                string str_Filtro_idAgruapcionesClientesLineas = Funciones.Formar_ContenidoIN_ParaConsultaWhere(lst_idAgrupacionesLinea_Clientes);

                string str_SQL =
                      " SELECT " +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.id) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.id) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.orden) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.orden) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.desactivada) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.desactivada) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.mostrarWeb) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.mostrarWeb) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.libreObligatorio) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.libreObligatorio) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.fechaDesde) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaDesde) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.fechaHasta) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.fechaHasta) + "," +
                          //ids
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idAgrupacionClienteLinea) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idAgrupacionArticuloLinea) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idCliente) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idArticulo) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idTarifaPromocion) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idEmpresa) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idEmpresa) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.idPromocionEsquemaCabecera) + " = " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + "," +
                          //Cliente
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Cliente_Codigo) + " = " + nameof(MAE_Clientes) + "." + nameof(MAE_Clientes.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Cliente_Descripcion) + " =" + nameof(MAE_Clientes) + "." + nameof(MAE_Clientes.razonSocial) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Cliente_FechaBorrado) + " =" + nameof(MAE_Clientes) + "." + nameof(MAE_Clientes.fechaBorrado) + "," +
                          //AsociacionCliente
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionCliente_Codigo) + " = " + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionCliente_Descripcion) + " =" + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionCliente_FechaBorrado) + " =" + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.fechaBorrado) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionCliente_IdsClientesAgrupados) + " =    (SELECT TOP 1 " + nameof(MAE_Clientes_AgrupacionesClientesLineas) + "." + nameof(MAE_Clientes_AgrupacionesClientesLineas.idCliente) +
                                                                                                                                " FROM " + nameof(MAE_Clientes_AgrupacionesClientesLineas) +
                                                                                                                                " WHERE " + nameof(MAE_Clientes_AgrupacionesClientesLineas) + "." + nameof(MAE_Clientes_AgrupacionesClientesLineas.idAgrupacionClienteLinea) + " = " + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.id) +
                                                                                                                                " )," +
                          //Articulo
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Articulo_Codigo) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Articulo_Descripcion) + " =" + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Articulo_FechaBorrado) + " =" + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.fechaBorrado) + "," +
                          //AsociacionArticulo
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionArticulo_Codigo) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionArticulo_Descripcion) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionArticulo_FechaBorrado) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.fechaBorrado) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.AgrupacionArticulo_IdsArticulosAgrupados) + " = (SELECT TOP 1 " + nameof(MAE_Articulos_AgrupacionesArticulosLineas) + "." + nameof(MAE_Articulos_AgrupacionesArticulosLineas.idArticulo) +
                                                                                                                                    " FROM " + nameof(MAE_Articulos_AgrupacionesArticulosLineas) +
                                                                                                                                    " WHERE " + nameof(MAE_Articulos_AgrupacionesArticulosLineas) + "." + nameof(MAE_Articulos_AgrupacionesArticulosLineas.idAgrupacionArticuloLinea) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.id) +
                                                                                                                                    " )," +
                          //Empresa
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Empresa_Codigo) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Empresa_Descripcion) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.Empresa_FechaBorrado) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.fechaBorrado) + "," +
                          //TarifaPromocion
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.TarifaPromocion_Codigo) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.TarifaPromocion_Descripcion) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.TarifaPromocion_FechaBorrado) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.fechaBorrado) + "," +
                          //PromocionesEsquema_Cabecera
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.PromocionEsquema_Codigo) + " = " + nameof(MAE_PromocionesEsquema_Cabecera) + "." + nameof(MAE_PromocionesEsquema_Cabecera.codigo) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.PromocionEsquema_Descripcion) + " = " + nameof(MAE_PromocionesEsquema_Cabecera) + "." + nameof(MAE_PromocionesEsquema_Cabecera.descripcion) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.PromocionEsquema_FechaBorrado) + " = " + nameof(MAE_PromocionesEsquema_Cabecera) + "." + nameof(MAE_PromocionesEsquema_Cabecera.fechaBorrado) + "," +
                          nameof(INTERNO_MAE_Clientes_Articulos_Listado_Modelo.PromocionEsquema_IdsPromocionesAgrupados) + " = (SELECT TOP 1 " + nameof(MAE_PromocionesEsquema_Lineas) + "." + nameof(MAE_PromocionesEsquema_Lineas.idTarifaPromocion) +
                                                                                                                                    " FROM " + nameof(MAE_PromocionesEsquema_Lineas) +
                                                                                                                                    " WHERE NOT " + nameof(MAE_PromocionesEsquema_Lineas) + "." + nameof(MAE_PromocionesEsquema_Lineas.idTarifaPromocion) + " IS NULL AND "
                                                                                                                                                  + nameof(MAE_PromocionesEsquema_Lineas) + "." + nameof(MAE_PromocionesEsquema_Lineas.tipo) + "=@tipo" +
                                                                                                                                    " )" +
                      " FROM " + nameof(MAE_Clientes_Articulos) +
                      //Cliente
                      " LEFT JOIN " + nameof(MAE_Clientes) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " = " + nameof(MAE_Clientes) + "." + nameof(MAE_Clientes.id) +
                      //AsociacionCliente
                      " LEFT JOIN " + nameof(MAE_AgrupacionesClientesLineas) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " = " + nameof(MAE_AgrupacionesClientesLineas) + "." + nameof(MAE_AgrupacionesClientesLineas.id) +
                      //Articulo
                      " LEFT JOIN " + nameof(MAE_Articulos) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " = " + nameof(MAE_Articulos) + "." + nameof(MAE_Articulos.id) +
                      //AsociacionArticulo
                      " LEFT JOIN " + nameof(MAE_AgrupacionesArticulosLineas) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " = " + nameof(MAE_AgrupacionesArticulosLineas) + "." + nameof(MAE_AgrupacionesArticulosLineas.id) +
                      //Empresa
                      " LEFT JOIN " + nameof(GEN_Empresas) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idEmpresa) + " = " + nameof(GEN_Empresas) + "." + nameof(GEN_Empresas.id) +
                      //TarifaPromocion
                      " LEFT JOIN " + nameof(MAE_TarifasPromociones) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idTarifaPromocion) + " = " + nameof(MAE_TarifasPromociones) + "." + nameof(MAE_TarifasPromociones.id) +
                      //PromocionesEsquema_Cabecera
                      " LEFT JOIN " + nameof(MAE_PromocionesEsquema_Cabecera) + " ON " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + " = " + nameof(MAE_PromocionesEsquema_Cabecera) + "." + nameof(MAE_PromocionesEsquema_Cabecera.id) +
                      " WHERE ( " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idEmpresa) + "=@idEmpresa" +
                                        (
                                            (lst_idEmpresasRelacionadas != null && lst_idEmpresasRelacionadas.Count > 0)
                                                ? (" OR " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idEmpresa) + " in (" + str_Filtro_Empresa + ") ")
                                                : " "
                                        ) +
                                " ) AND " +
                                " ( " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.desactivada) + " IS NULL ) AND " +
                                (
                                        // SI TIENE ARTICULO,AGRUPACION DE ARTICULO,CLIENTE O AGRUPACION DE CLIENTE
                                        (_lng_idArticulo > -1 || _lng_idAgrupacionArticulo > -1 ||
                                        _lng_idCliente > -1 || _lng_idAgrupacionCliente > -1)
                                        ?
                                        (
                                            // SI TIENE ARTICULO O AGRUPACION DE ARTICULO
                                            " ( " +
                                            (
                                                (_lng_idArticulo > -1 || _lng_idAgrupacionArticulo > -1)
                                                ?
                                                    (
                                                        //SI TIENE UN ARTICULO SELECCIONADO
                                                        (
                                                            _lng_idArticulo > -1
                                                            ? (
                                                                    (
                                                                        " ( ( NOT " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + " IS NULL ) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idArticulo) + "=@lng_idArticulo ) " +
                                                                        " OR " + (lst_idAgrupacionesLinea_Articulos.Count > 0
                                                                                        ?
                                                                                        (" ( (NOT " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " IS NULL ) AND " +
                                                                                        nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " in (" + str_Filtro_idAgrupacionesArticulosLineas + ") )"
                                                                                        )
                                                                                        : ("1!=1")
                                                                                )
                                                                    )
                                                                )
                                                            : ("1!=1")
                                                        )
                                                        + " OR " +
                                                        //SI TIENE UNA AGRUPACION DE ARTICULO SELECCIONADO
                                                        (
                                                                    (_lng_idAgrupacionArticulo > -1)
                                                                    ?
                                                                    (" ( ( NOT " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " IS NULL ) AND " +
                                                                    nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + "=@lng_idAgrupacionArticulo )")
                                                                    : ("1!=1")
                                                        )
                                                    )
                                                    : ("1=1")
                                            )
                                            + " ) AND  ( " +
                                            // SI TIENE CLIENTE O AGRUPACION DE CLIENTE
                                            (
                                                (_lng_idCliente > -1 || _lng_idAgrupacionCliente > -1)
                                                ?
                                                    (
                                                        //SI TIENE UN CLIENTE SELECCIONADO
                                                        (
                                                            _lng_idCliente > -1
                                                            ? (
                                                                    (
                                                                        " ( (NOT " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + " IS NULL) AND " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idCliente) + "=@lng_idCliente ) " +
                                                                        " OR  " + (lst_idAgrupacionesLinea_Clientes.Count > 0
                                                                                        ?
                                                                                        (" ( (NOT " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " IS NULL) AND " +
                                                                                        nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " in (" + str_Filtro_idAgruapcionesClientesLineas + ") ) "
                                                                                        )
                                                                                        : (" 1!=1 ")
                                                                                )
                                                                    )
                                                                )
                                                            : (" 1!=1 ")
                                                        )
                                                        + " OR " +
                                                        //SI TIENE UNA AGRUPACION DE CLIENTE SELECCIONADO
                                                        (
                                                                    _lng_idAgrupacionCliente > -1
                                                                    ?
                                                                    (" ( ( NOT " + nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " IS NULL ) AND " +
                                                                    nameof(MAE_Clientes_Articulos) + "." + nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + "=@lng_idAgrupacionCliente) ")
                                                                    : (" 1!=1 ")
                                                        )
                                                    )
                                                    : (" 1=1 ")
                                            )
                                            + " ) "
                                        )
                                        : ("1!=1")//No tiene ni articulo,ni agrupacion de articulos,ni Cliente,ni agrupacion de Cliente
                                );

                //Parametros
                lst_Parametros.Add(new SqlParameter("@lng_idArticulo", _lng_idArticulo));
                lst_Parametros.Add(new SqlParameter("@lng_idAgrupacionArticulo", _lng_idAgrupacionArticulo));
                lst_Parametros.Add(new SqlParameter("@lng_idCliente", _lng_idCliente));
                lst_Parametros.Add(new SqlParameter("@lng_idAgrupacionCliente", _lng_idAgrupacionCliente));
                lst_Parametros.Add(new SqlParameter("@idEmpresa", _lng_idEmpresa));
                lst_Parametros.Add(new SqlParameter("@tipo", Variables.G_INT_TIPO_TARIFAPROMOCION_PROMOCIONES_CODIGO));

                object[] arr_Parametros = lst_Parametros.ToArray();

                lst_INTERNO_MAE_Clientes_Articulos_Listado_Modelo = obj_Exferia_Entities.Database.SqlQuery<INTERNO_MAE_Clientes_Articulos_Listado_Modelo>(str_SQL, arr_Parametros).ToList().Cast<dynamic>().ToList();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(MAE_Clientes_Articulos_Datos) + "/" + nameof(Obtener_Listado_PorArticuloCliente), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();
            }
            return lst_INTERNO_MAE_Clientes_Articulos_Listado_Modelo;
        }
        #endregion

        #region MODELOS

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

            return g_mdl_MAE_Clientes_Articulos;
        }
        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_MAE_Clientes_Articulos = obj_Exferia_Entities.Database.SqlQuery<MAE_Clientes_Articulos>(_str_SQL, _arr_Parametros).FirstOrDefault();
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(MAE_Clientes_Articulos_Datos) + "/" + nameof(Ejecutar_Consulta_Modelo), true);
            }
            finally
            {
                obj_Exferia_Entities.Database.Connection.Close();
                obj_Exferia_Entities.Dispose();

            }
        }
        #endregion

        private string Obtener_Consulta_Modelo()
        {
            return
               " SELECT " +
                   nameof(MAE_Clientes_Articulos.id) + " , " +
                   nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " , " +
                   nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " , " +
                   nameof(MAE_Clientes_Articulos.idCliente) + " , " +
                   nameof(MAE_Clientes_Articulos.idArticulo) + " , " +
                   nameof(MAE_Clientes_Articulos.orden) + " , " +
                   nameof(MAE_Clientes_Articulos.desactivada) + " , " +
                   nameof(MAE_Clientes_Articulos.mostrarWeb) + " , " +
                   nameof(MAE_Clientes_Articulos.libreObligatorio) + " , " +
                   nameof(MAE_Clientes_Articulos.idEmpresa) + " , " +
                   nameof(MAE_Clientes_Articulos.idTarifaPromocion) + " , " +
                   nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + " , " +
                   nameof(MAE_Clientes_Articulos.fechaDesde) + " , " +
                   nameof(MAE_Clientes_Articulos.fechaHasta) +
               " FROM " + nameof(MAE_Clientes_Articulos);
        }
        #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;

                MAE_Clientes_Articulos mdl_MAE_Clientes_Articulos_AGrabar = (MAE_Clientes_Articulos)_mdl_obj;
                MAE_Clientes_Articulos mdl_MAE_Clientes_Articulos_DatosViejos = new MAE_Clientes_Articulos();

                // Ver si existe ######################################################################
                MAE_Clientes_Articulos mdl_MAE_Clientes_Articulos_Final = Obtener_Modelo_Por_Id(mdl_MAE_Clientes_Articulos_AGrabar.id);
                //#####################################################################################

                //UPDATE
                if (mdl_MAE_Clientes_Articulos_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_MAE_Clientes_Articulos_Final, mdl_MAE_Clientes_Articulos_DatosViejos, false, false);

                    // Cargar los Datos Nuevos del Modelo
                    Funciones.CopiarPropiedadesObjetos(mdl_MAE_Clientes_Articulos_AGrabar, mdl_MAE_Clientes_Articulos_Final, false, false);

                    #region Update
                    string str_SQL_Update = " UPDATE " + nameof(MAE_Clientes_Articulos) +
                                            " SET " +
                                                 nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + "=@idAgrupacionClienteLinea, " +
                                                 nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + "=@idAgrupacionArticuloLinea, " +
                                                 nameof(MAE_Clientes_Articulos.idCliente) + "=@idCliente, " +
                                                 nameof(MAE_Clientes_Articulos.idArticulo) + "=@idArticulo, " +
                                                 nameof(MAE_Clientes_Articulos.orden) + "=@orden, " +
                                                 nameof(MAE_Clientes_Articulos.desactivada) + "=@desactivada, " +
                                                 nameof(MAE_Clientes_Articulos.mostrarWeb) + "=@mostrarWeb, " +
                                                 nameof(MAE_Clientes_Articulos.libreObligatorio) + "=@libreObligatorio, " +
                                                 nameof(MAE_Clientes_Articulos.idEmpresa) + "=@idEmpresa, " +
                                                 nameof(MAE_Clientes_Articulos.idTarifaPromocion) + "=@idTarifaPromocion, " +
                                                 nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + "=@idPromocionEsquemaCabecera, " +
                                                 nameof(MAE_Clientes_Articulos.fechaDesde) + "=@fechaDesde, " +
                                                 nameof(MAE_Clientes_Articulos.fechaHasta) + "=@fechaHasta" +
                                            " WHERE " +
                                                nameof(MAE_Clientes_Articulos.id) + "=@id";
                    //Parametros
                    object[] arr_Parametros_Update = new object[]
                    {
                        mdl_MAE_Clientes_Articulos_Final.idAgrupacionClienteLinea != null
                            ?   new SqlParameter("@idAgrupacionClienteLinea", mdl_MAE_Clientes_Articulos_Final.idAgrupacionClienteLinea.Value)
                            :   new SqlParameter("@idAgrupacionClienteLinea",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.idAgrupacionArticuloLinea != null
                            ?   new SqlParameter("@idAgrupacionArticuloLinea", mdl_MAE_Clientes_Articulos_Final.idAgrupacionArticuloLinea.Value)
                            :   new SqlParameter("@idAgrupacionArticuloLinea",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.idCliente != null
                            ?   new SqlParameter("@idCliente", mdl_MAE_Clientes_Articulos_Final.idCliente.Value)
                            :   new SqlParameter("@idCliente",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.idArticulo != null
                            ?   new SqlParameter("@idArticulo", mdl_MAE_Clientes_Articulos_Final.idArticulo.Value)
                            :   new SqlParameter("@idArticulo",  DBNull.Value),
                        new SqlParameter("@orden",  mdl_MAE_Clientes_Articulos_Final.orden),
                        mdl_MAE_Clientes_Articulos_Final.desactivada != null
                            ?   new SqlParameter("@desactivada", mdl_MAE_Clientes_Articulos_Final.desactivada.Value)
                            :   new SqlParameter("@desactivada",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.mostrarWeb != null
                            ?   new SqlParameter("@mostrarWeb", mdl_MAE_Clientes_Articulos_Final.mostrarWeb.Value)
                            :   new SqlParameter("@mostrarWeb",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.libreObligatorio != null
                            ?   new SqlParameter("@libreObligatorio", mdl_MAE_Clientes_Articulos_Final.libreObligatorio.Value)
                            :   new SqlParameter("@libreObligatorio",  DBNull.Value),
                        new SqlParameter("@idEmpresa",  mdl_MAE_Clientes_Articulos_Final.idEmpresa),
                        mdl_MAE_Clientes_Articulos_Final.idTarifaPromocion != null
                            ?   new SqlParameter("@idTarifaPromocion", mdl_MAE_Clientes_Articulos_Final.idTarifaPromocion.Value)
                            :   new SqlParameter("@idTarifaPromocion",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.idPromocionEsquemaCabecera != null
                            ?   new SqlParameter("@idPromocionEsquemaCabecera", mdl_MAE_Clientes_Articulos_Final.idPromocionEsquemaCabecera.Value)
                            :   new SqlParameter("@idPromocionEsquemaCabecera",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.fechaDesde != null
                            ?   new SqlParameter("@fechaDesde", mdl_MAE_Clientes_Articulos_Final.fechaDesde.Value)
                            :   new SqlParameter("@fechaDesde",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.fechaHasta != null
                            ?   new SqlParameter("@fechaHasta", mdl_MAE_Clientes_Articulos_Final.fechaHasta.Value)
                            :   new SqlParameter("@fechaHasta",  DBNull.Value),
                        new SqlParameter("@id", mdl_MAE_Clientes_Articulos_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_MAE_Clientes_Articulos_Final.id;
                }
                //INSERT
                else
                {
                    mdl_MAE_Clientes_Articulos_Final = new MAE_Clientes_Articulos();

                    //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_MAE_Clientes_Articulos_AGrabar, mdl_MAE_Clientes_Articulos_Final, false, false);

                    #region INSERT
                    string str_SQL_Insert = " INSERT INTO " + nameof(MAE_Clientes_Articulos) +
                                                " (" +
                                                         nameof(MAE_Clientes_Articulos.idAgrupacionClienteLinea) + " , " +
                                                         nameof(MAE_Clientes_Articulos.idAgrupacionArticuloLinea) + " , " +
                                                         nameof(MAE_Clientes_Articulos.idCliente) + " , " +
                                                         nameof(MAE_Clientes_Articulos.idArticulo) + " , " +
                                                         nameof(MAE_Clientes_Articulos.orden) + " , " +
                                                         nameof(MAE_Clientes_Articulos.desactivada) + " , " +
                                                         nameof(MAE_Clientes_Articulos.mostrarWeb) + " , " +
                                                         nameof(MAE_Clientes_Articulos.libreObligatorio) + " , " +
                                                         nameof(MAE_Clientes_Articulos.idEmpresa) + " , " +
                                                         nameof(MAE_Clientes_Articulos.idTarifaPromocion) + " , " +
                                                         nameof(MAE_Clientes_Articulos.idPromocionEsquemaCabecera) + " , " +
                                                         nameof(MAE_Clientes_Articulos.fechaDesde) + " , " +
                                                         nameof(MAE_Clientes_Articulos.fechaHasta) +
                                                " ) " +
                                                " OUTPUT INSERTED." + nameof(MAE_Clientes_Articulos.id) +
                                                " VALUES " +
                                                " ( " +
                                                    "@idAgrupacionClienteLinea," +
                                                    "@idAgrupacionArticuloLinea," +
                                                    "@idCliente," +
                                                    "@idArticulo," +
                                                    "@orden," +
                                                    "@desactivada," +
                                                    "@mostrarWeb," +
                                                    "@libreObligatorio," +
                                                    "@idEmpresa," +
                                                    "@idTarifaPromocion," +
                                                    "@idPromocionEsquemaCabecera," +
                                                    "@fechaDesde," +
                                                    "@fechaHasta" +
                                                " ) ";
                    //Parametros
                    object[] arr_Parametros_Insert = new object[]
                    {
                        mdl_MAE_Clientes_Articulos_Final.idAgrupacionClienteLinea != null
                            ?   new SqlParameter("@idAgrupacionClienteLinea", mdl_MAE_Clientes_Articulos_Final.idAgrupacionClienteLinea.Value)
                            :   new SqlParameter("@idAgrupacionClienteLinea",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.idAgrupacionArticuloLinea != null
                            ?   new SqlParameter("@idAgrupacionArticuloLinea", mdl_MAE_Clientes_Articulos_Final.idAgrupacionArticuloLinea.Value)
                            :   new SqlParameter("@idAgrupacionArticuloLinea",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.idCliente != null
                            ?   new SqlParameter("@idCliente", mdl_MAE_Clientes_Articulos_Final.idCliente.Value)
                            :   new SqlParameter("@idCliente",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.idArticulo != null
                            ?   new SqlParameter("@idArticulo", mdl_MAE_Clientes_Articulos_Final.idArticulo.Value)
                            :   new SqlParameter("@idArticulo",  DBNull.Value),
                        new SqlParameter("@orden",  mdl_MAE_Clientes_Articulos_Final.orden),
                        mdl_MAE_Clientes_Articulos_Final.desactivada != null
                            ?   new SqlParameter("@desactivada", mdl_MAE_Clientes_Articulos_Final.desactivada.Value)
                            :   new SqlParameter("@desactivada",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.mostrarWeb != null
                            ?   new SqlParameter("@mostrarWeb", mdl_MAE_Clientes_Articulos_Final.mostrarWeb.Value)
                            :   new SqlParameter("@mostrarWeb",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.libreObligatorio != null
                            ?   new SqlParameter("@libreObligatorio", mdl_MAE_Clientes_Articulos_Final.libreObligatorio.Value)
                            :   new SqlParameter("@libreObligatorio",  DBNull.Value),
                        new SqlParameter("@idEmpresa",  mdl_MAE_Clientes_Articulos_Final.idEmpresa),
                        mdl_MAE_Clientes_Articulos_Final.idTarifaPromocion != null
                            ?   new SqlParameter("@idTarifaPromocion", mdl_MAE_Clientes_Articulos_Final.idTarifaPromocion.Value)
                            :   new SqlParameter("@idTarifaPromocion",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.idPromocionEsquemaCabecera != null
                            ?   new SqlParameter("@idPromocionEsquemaCabecera", mdl_MAE_Clientes_Articulos_Final.idPromocionEsquemaCabecera.Value)
                            :   new SqlParameter("@idPromocionEsquemaCabecera",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.fechaDesde != null
                            ?   new SqlParameter("@fechaDesde", mdl_MAE_Clientes_Articulos_Final.fechaDesde.Value)
                            :   new SqlParameter("@fechaDesde",  DBNull.Value),
                        mdl_MAE_Clientes_Articulos_Final.fechaHasta != null
                            ?   new SqlParameter("@fechaHasta", mdl_MAE_Clientes_Articulos_Final.fechaHasta.Value)
                            :   new SqlParameter("@fechaHasta",  DBNull.Value)
                    };
                    #endregion

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

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

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        #endregion

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

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

            //Tipo de Accion que se va a realizar
            mdl_ValorDevuelto_Modelo.TipoAccion = G_ENUM_TIPOACCION.INT_ELIMINAR;
            
            using (TransactionScope transaccion_SQL = new TransactionScope(TransactionScopeOption.Required))
            {
                try
                {
                    obj_Exferia_Entities = new Exferia_Entities();
                    obj_Exferia_Entities.Configuration.LazyLoadingEnabled = false;

                    // Ver si existe ######################################################################
                    MAE_Clientes_Articulos mdl_MAE_Clientes_Articulos_Final = Obtener_Modelo_Por_Id(_lng_id);
                    //######################################################################################

                    if (mdl_MAE_Clientes_Articulos_Final != null)
                    {

                        #region Delete
                        string str_SQL_Delete = " DELETE FROM  " + nameof(MAE_Clientes_Articulos) +
                                                " WHERE " +
                                                    nameof(MAE_Clientes_Articulos.id) + "=@id";
                        //Parametros
                        object[] arr_Parametros_Delete = new object[]
                        {
                        new SqlParameter("@id", _lng_id)
                        };
                        #endregion

                        //Delete
                        obj_Exferia_Entities.Database.ExecuteSqlCommand(str_SQL_Delete, arr_Parametros_Delete);

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

                    }


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

                    // Se termina la Transaccion Correctamente
                    transaccion_SQL.Complete();
                }
                catch (Control_Errores)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    throw new Control_Errores("", ex, nameof(MAE_Clientes_Articulos_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)
        {
            throw new NotImplementedException();
        }
        public override INTERNO_ValorDevuelto_Modelo Borrar(object _mdl_obj)
        {
            Exferia_Entities obj_Exferia_Entities = null;

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

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

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

                if (lst_ids != null && lst_ids.Count > 0)
                {
                    //Coger los ids y ponerlos de forma que sirva para la consulta
                    string str_Filtros_IDS = Funciones.Formar_ContenidoIN_ParaConsultaWhere(lst_ids);

                    string str_SQL = " DELETE FROM " + nameof(MAE_Clientes_Articulos) +
                                     " WHERE " + nameof(MAE_Clientes_Articulos.id) + " in (" + str_Filtros_IDS + ")";

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

            return mdl_ValorDevuelto_Modelo;
        }
        #endregion
    }
}
