using Exferia_Aplicacion.General;
using Exferia_Aplicacion.Modelos_Generales;
using Exferia_Aplicacion.Calculos;
using Exferia_EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Exferia_Aplicacion.Calculos.VentasCompras
{
    public class VentasCompras_Calculos
    {
        #region Variables Privadas
        private int g_int_Tipo_ClienteProveedor = 0;
        private long g_lng_idEmpresa = -1;
        private long g_lng_idClienteProveedor = -1;
        private DateTime g_dtt_Fecha = DateTime.Now;
        private List<MAE_Embalajes> g_lst_MAE_Embalajes=null;

        //Listado de Tarifas/Promociones
        private List<INTERNO_TarifaPromocion_VentasCompras_Modelo> g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = null;
        private List<INTERNO_TarifaPromocion_VentasCompras_Modelo> g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = null;

        //Modelo Linea 
        private INTERNO_VentasCompras_Calculos_Modelo g_mdl_INTERNO_VentasCompras_Calculos_Modelo = new INTERNO_VentasCompras_Calculos_Modelo();

        //Modelo Linea Promocion por unidad
        private INTERNO_VentasCompras_Calculos_Modelo g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD = new INTERNO_VentasCompras_Calculos_Modelo();

        #endregion

        #region Propiedades Publicas
        //Articulo
        public string PROPIEDAD_Articulo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id > -1)
                {
                    str_ValorDevuelto = "(" + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo + ") " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion;
                }

                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_Articulo_Codigo
        {
            get
            {
                string str_ValorDevuelto = "";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id > -1)
                {
                    str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo;
                }

                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_Articulo_Descripcion
        {
            get
            {
                string str_ValorDevuelto = "";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id > -1)
                {
                    str_ValorDevuelto =g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion;
                }

                return str_ValorDevuelto;
            }
        }
        public long PROPIEDAD_Articulo_Id
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id;
            }
        }
        public string PROPIEDAD_Articulo_TipoTrazabilidad
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad;
            }
        }
        public string PROPIEDAD_Articulo_TipoTrazabilidad_Texto
        {
            get
            {
                string str_ValorDevuelto = Variables.G_MDL_TIPOSTRAZABILIDAD_SINTRAZABILIDAD.Descripcion;

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad!=null)
                {

                    //Opcional
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OPCIONAL.Codigo))
                    {
                        str_ValorDevuelto = Variables.G_MDL_TIPOSTRAZABILIDAD_OPCIONAL.Descripcion;
                    }
                    //Obligatoria
                    else if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Codigo))
                    {
                        str_ValorDevuelto = Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Descripcion;
                    }
                }

                return str_ValorDevuelto;
            }
        }

        //ArticuloComodin
        public string PROPIEDAD_ArticuloComodin_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id > -1)
                {
                    str_ValorDevuelto = "(" + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo + ") " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion;
                }

                return str_ValorDevuelto;
            }
        }
        public long PROPIEDAD_ArticuloComodin_Id
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id;
            }
        }
        public bool PROPIEDAD_ArticuloComodin_Es
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es;
            }
        }

        //ProveedorCodigos
        public List<MAE_Proveedores_CodigosArticuloProveedor> PROPIEDAD_CodigosArticuloProveedor_Listado
        {
            get
            {
                List<MAE_Proveedores_CodigosArticuloProveedor> lst_MAE_Proveedores_CodigosArticuloProveedor = null;

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_CodigosArticuloProveedor != null &&
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_CodigosArticuloProveedor.Count>0)
                {
                    lst_MAE_Proveedores_CodigosArticuloProveedor = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_CodigosArticuloProveedor.ToList();
                }

                return lst_MAE_Proveedores_CodigosArticuloProveedor;
            }
        }

        //Cantidad
        public decimal PROPIEDAD_Cantidad_Principal
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal;
            }
        }
        public string PROPIEDAD_Cantidad_Principal_Texto
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal.ToString();
            }
        }
        public decimal PROPIEDAD_Cantidad_Principal_Relacion
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion;
            }
        }
        public string PROPIEDAD_Cantidad_Principal_Relacion_Texto
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion.ToString();
            }
        }
        public string PROPIEDAD_Cantidad_Principal_Relacion_Calculo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                try
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion != null)
                    {
                        //Tipo Operacion Dividir
                        if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_DIVIDIR.Codigo))
                        {
                            str_ValorDevuelto = "(" + string.Format("{0:0.000}", Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal / g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion), 3)) + " " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto + ")";
                        }
                        //Tipo Operacion Multiplicar
                        else
                        {
                            str_ValorDevuelto = "(" + string.Format("{0:0.000}", Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion), 3)) + " " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto + ")";
                        }
                    }
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(PROPIEDAD_Cantidad_Principal_Relacion_Calculo_Texto));
                }

                return str_ValorDevuelto;
            }
        }
        public decimal PROPIEDAD_Cantidad_Principal_Relacion_Calculo
        {
            get
            {
                decimal dcm_ValorDevuelto = 0m;

                try
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion != null)
                    {
                        //Tipo Operacion Dividir
                        if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_DIVIDIR.Codigo))
                        {
                            dcm_ValorDevuelto = Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal / g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion), 3) ;
                        }
                        //Tipo Operacion Multiplicar
                        else
                        {
                            dcm_ValorDevuelto = Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion), 3);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(PROPIEDAD_Cantidad_Principal_Relacion_Calculo));
                }

                return dcm_ValorDevuelto;
            }
        }

        //Embalaje
        public List<INTERNO_ComboBox_Modelo> PROPIEDAD_Embalajes_Listado
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo;
            }
        }
        public long PROPIEDAD_Embalaje_Id
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id;
            }
        }
        public bool PROPIEDAD_Embalaje_EsRelacional
        {
            get
            {
                bool bol_Valordevuelto = false;

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id != null)
                {
                    bol_Valordevuelto = true;
                }

                return bol_Valordevuelto;
            }
        }
        public string PROPIEDAD_Embalaje_Operacion
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion;
            }
        }

        //Embalaje relacionado
        public string PROPIEDAD_EmbalajeRelacionado_Tipo_Texto
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto;
            }
        }
        public long? PROPIEDAD_EmbalajeRelacionado_Id
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id;
            }
        }
        public decimal PROPIEDAD_EmbalajeRelacionado_Relacion
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion;
            }
        }

        //Cantidad Relacional
        public decimal PROPIEDAD_Cantidad_Relacional
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria;
            }
        }
        public string PROPIEDAD_Cantidad_Relacional_Texto
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria.ToString();
            }
        }
        public string PROPIEDAD_Cantidad_Relacional_Relacion
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion.ToString();
            }
        }
        public string PROPIEDAD_Cantidad_Relacional_Relacion_Calculo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                try
                {
                    //Tipo Operacion Dividir
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_DIVIDIR.Codigo))
                    {
                        str_ValorDevuelto = "(" + string.Format("{0:0.000}", Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal / g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion), 3)) + " " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto + ")";
                    }
                    //Tipo Operacion Multiplicar
                    else
                    {
                        str_ValorDevuelto = "(" + string.Format("{0:0.000}", Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion), 3)) + " " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto + ")";
                    }
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(PROPIEDAD_Cantidad_Relacional_Relacion_Calculo_Texto));
                }

                return str_ValorDevuelto;
            }
        }
        public decimal PROPIEDAD_Cantidad_Relacional_Relacion_Calculo
        {
            get
            {
                decimal dcm_ValorDevuelto = 0m;

                try
                {
                    //Tipo Operacion Dividir
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_DIVIDIR.Codigo))
                    {
                        dcm_ValorDevuelto = Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal / g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion), 3);
                    }
                    //Tipo Operacion Multiplicar
                    else
                    {
                        dcm_ValorDevuelto = Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion), 3);
                    }
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(PROPIEDAD_Cantidad_Relacional_Relacion_Calculo));
                }

                return dcm_ValorDevuelto;
            }
        }

        //Precio por 
        public string PROPIEDAD_PrecioPor
        {
            get
            {
                string str_ValorDevuelto = "";

                //2º unidad
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad.Equals(1))
                {
                    str_ValorDevuelto = Variables.G_STR_PRECIOPOR_SEGUNDAUNIDAD_DESCRIPCION;
                }
                //Por Cantidad
                else
                {
                    str_ValorDevuelto = Variables.G_STR_PRECIOPOR_CANTIDAD_DESCRIPCION;
                }

                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PrecioPor_TAG
        {
            get
            {
                string str_ValorDevuelto = "";

                //2º unidad
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad.Equals(1))
                {
                    str_ValorDevuelto = Variables.G_STR_PRECIOPOR_SEGUNDAUNIDAD_CODIGO;
                }
                //Por Cantidad
                else
                {
                    str_ValorDevuelto = Variables.G_STR_PRECIOPOR_CANTIDAD_CODIGO;
                }

                return str_ValorDevuelto;
            }
        }
        public bool PROPIEDAD_PrecioPor_SegundaUnidad
        {
            get
            {
                bool bol_ValorDevuelto = false;

                //2º unidad
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad.Equals(1))
                {
                    bol_ValorDevuelto = true;
                }

                return bol_ValorDevuelto;
            }
        }
        public int PROPIEDAD_PrecioPor_SegundaUnidad_Entero
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad;
            }
        }

        public int PROPIEDAD_NumeroRedondeo
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo;
            }
        }

        //NomenclaturaPrecio
        public string PROPIEDAD_NomenclaturaPrecio
        {
            get
            {
                string str_ValorDevuelto = "";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio != null)
                {
                    str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio.descripcion;
                }

                return str_ValorDevuelto;
            }
        }
        public bool PROPIEDAD_NomenclaturaPrecio_Existe
        {
            get
            {
                bool bol_ValorDevuelto= false;

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio != null)
                {
                    bol_ValorDevuelto = true;
                }

                return bol_ValorDevuelto;
            }
        }
        public long PROPIEDAD_NomenclaturaPrecio_Id
        {
            get
            {
                long lng_idValorDevuelto = -1;

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio != null)
                {
                    lng_idValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio.id;
                }

                return lng_idValorDevuelto;
            }
        }

        //Precio
        public decimal PROPIEDAD_Precio
        {
            get
            {
                decimal dcm_ValorDevuelto = 0m;

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final != null)
                {
                    dcm_ValorDevuelto=Funciones.RedondearDecimal(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final.Value, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo);
                }

                return dcm_ValorDevuelto;
            }
        }
        public string PROPIEDAD_Precio_Texto
        {
            get
            {
                string str_ValorDevuelto = "0.000";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final != null)
                {
                    str_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final.Value.ToString();
                }

                return str_ValorDevuelto;
            }
        }

        //DescuentoGeneral
        public decimal PROPIEDAD_DescuentoGeneral
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral;
            }
        }
        public string PROPIEDAD_DescuentoGeneral_Texto
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral.ToString();
            }
        }

        //Importe
        public decimal PROPIEDAD_Importe
        {
            get
            {
                return Calcular_Importe();
            }
        }
        public string PROPIEDAD_Importe_Texto
        {
            get
            {
                return Calcular_Importe().ToString();
            }
        }

        //Impuesto Tipo
        public string PROPIEDAD_ImpuestoTipo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id != null)
                {
                    str_ValorDevuelto="(" + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo + ") " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion;
                }

                return str_ValorDevuelto;
            }
        }
        public long PROPIEDAD_ImpuestoTipo_Id
        {
            get
            {
                long lng_ValorDevuelto = -1;

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id != null)
                {
                    lng_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id.Value;
                }

                return lng_ValorDevuelto;
            }
        }

        //Retencion Tipo
        public string PROPIEDAD_RetencionTipo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id != null)
                {
                    str_ValorDevuelto = "(" + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Codigo + ") " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion;
                }

                return str_ValorDevuelto;
            }
        }
        public long PROPIEDAD_RetencionTipo_Id
        {
            get
            {
                long lng_ValorDevuelto = -1;

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id != null)
                {
                    lng_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id.Value;
                }

                return lng_ValorDevuelto;
            }
        }

        //Albaranes_Asociados
        public string PROPIEDAD_Albaranes_Asociados
        {
            get
            {
                string str_ValorDevuelto = "";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Albaranes_Asociados != null)
                {
                    str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Albaranes_Asociados;
                }

                return str_ValorDevuelto;
            }
        }

        //Facturas_Asociados
        public string PROPIEDAD_Facturas_Asociados
        {
            get
            {
                string str_ValorDevuelto = "";

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Facturas_Asociados != null)
                {
                    str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Facturas_Asociados;
                }

                return str_ValorDevuelto;
            }
        }

        //Tipo de Compraventa Id
        public long PROPIEDAD_TipoCompraVenta_Id
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id;
            }
        }
        public string PROPIEDAD_TipoCompraVenta_Opcion
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion;
            }
        }

        //Listado de Tarifa y promociones
        public List<INTERNO_TarifaPromocion_VentasCompras_Modelo> PROPIEDAD_TarifaPromocion_Listado
        {
            get
            {
                return g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS;
            }
        }

        //Listado de tarifas y promociones a Grabar
        public List<INTERNO_TarifaPromocion_VentasCompras_Modelo> PROPIEDAD_TarifaPromocion_Listado_AGRABAR
        {
            get
            {
                if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo!=null &&
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count>0)
                {
                    foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo)
                    {

                        //marcar cuales de las tarifas promociones estoy utilizando
                        if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS!=null &&
                            g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Count>0)
                        {
                            INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_UTILIZADA=  g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Where(m => (m.Desactivado==null || m.Desactivado.Value==false) && m.Id.Equals(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id)).FirstOrDefault();
                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_UTILIZADA != null)
                            {
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.AplicadaEnLinea = true;
                            }
                            else
                            {
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.AplicadaEnLinea = false;
                            }
                        }
                    }
                }

                return g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo;
            }
        }

        #region Embalaje Principal del Articulo
        //Embalaje Principal
        public long PROPIEDAD_EmbalajePrincipalDelArticulo_IdEmbalaje
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id;
            }
        }
        public string PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion;
            }
        }

        //Embalaje relacionado
        public long? PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id;
            }
        }
        public decimal PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion;
            }
        }

        //Cantidad Principal
        public decimal PROPIEDAD_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion;
            }
        }

        //Precio
        public decimal PROPIEDAD_EmbalajePrincipalDelArticulo_Precio
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio;
            }
        }

        //Precio por Segunda Unidad
        public int PROPIEDAD_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero
        {
            get
            {
                return g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad;
            }
        }

        #endregion

        #region Promocion por Unidad
        public bool PROPIEDAD_PromocionPorUnidad_Existe
        {
            get
            {
                bool bol_ValorDevuelto = false;

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD != null &&
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id >-1)
                {
                    bol_ValorDevuelto = true;
                }

                return bol_ValorDevuelto;
            }
        }

        //Articulo
        public string PROPIEDAD_PromocionPorUnidad_Articulo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id > -1)
                    {
                        str_ValorDevuelto = "(" + g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Codigo + ") " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Descripcion;
                    }
                }

                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Articulo_Codigo
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id > -1)
                    {
                        str_ValorDevuelto =  g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Codigo;
                    }
                }

                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Articulo_Descripcion
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id > -1)
                    {
                        str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Descripcion;
                    }
                }

                return str_ValorDevuelto;
            }
        }
        public long PROPIEDAD_PromocionPorUnidad_Articulo_Id
        {
            get
            {
                long lng_ValorDevuelto = -1;
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    lng_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id;
                }
                return lng_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Articulo_TipoTrazabilidad
        {
            get
            {
                string str_ValorDevuelto = "0";
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_TipoTrazabilidad;
                }
                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Articulo_TipoTrazabilidad_Texto
        {
            get
            {
                string str_ValorDevuelto = Variables.G_MDL_TIPOSTRAZABILIDAD_SINTRAZABILIDAD.Descripcion;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_TipoTrazabilidad != null)
                    {
                        //Opcional
                        if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OPCIONAL.Codigo))
                        {
                            str_ValorDevuelto = Variables.G_MDL_TIPOSTRAZABILIDAD_OPCIONAL.Descripcion;
                        }
                        //Obligatoria
                        else if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_TipoTrazabilidad.Equals(Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Codigo))
                        {
                            str_ValorDevuelto = Variables.G_MDL_TIPOSTRAZABILIDAD_OBLIGATORIA.Descripcion;
                        }
                    }
                }

                return str_ValorDevuelto;
            }
        }

        //ProveedorCodigos
        public List<MAE_Proveedores_CodigosArticuloProveedor> PROPIEDAD_PromocionPorUnidad_CodigosArticuloProveedor_Listado
        {
            get
            {
                List<MAE_Proveedores_CodigosArticuloProveedor> lst_MAE_Proveedores_CodigosArticuloProveedor = null;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_CodigosArticuloProveedor != null &&
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_CodigosArticuloProveedor.Count > 0)
                    {
                        lst_MAE_Proveedores_CodigosArticuloProveedor = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_CodigosArticuloProveedor.ToList();
                    }
                }

                return lst_MAE_Proveedores_CodigosArticuloProveedor;
            }
        }

        //Cantidad
        public decimal PROPIEDAD_PromocionPorUnidad_Cantidad_Principal
        {
            get
            {
                decimal dcm_ValorDevuelto = 0m;
                
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    dcm_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal;
                }
                return dcm_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal.ToString();
                }

                return str_ValorDevuelto;
            }
        }
        public decimal PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion
        {
            get
            {
                decimal dcm_ValorDevuelto = 1m;
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    dcm_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Relacion;
                }
                return dcm_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion_Texto
        {
            get
            {
                string str_ValorDevuelto = "1.00";
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Relacion.ToString();
                }
                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion_Calculo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                try
                {
                    if (PROPIEDAD_PromocionPorUnidad_Existe)
                    {
                        //Tipo Operacion Dividir
                        if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_DIVIDIR.Codigo))
                        {
                            str_ValorDevuelto = "(" + string.Format("{0:0.000}", Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal / g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Relacion), 3)) + " " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto + ")";
                        }
                        //Tipo Operacion Multiplicar
                        else
                        {
                            str_ValorDevuelto = "(" + string.Format("{0:0.000}", Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal * g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Relacion), 3)) + " " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto + ")";
                        }
                    }
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(PROPIEDAD_PromocionPorUnidad_Cantidad_Principal_Relacion_Calculo_Texto));
                }

                return str_ValorDevuelto;
            }
        }

        //Embalaje
        public long PROPIEDAD_PromocionPorUnidad_Embalaje_Id
        {
            get
            {
                long lng_Valordevuelto = -1;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    lng_Valordevuelto=g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Id;
                }

                return lng_Valordevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Embalaje_Tipo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Texto;
                }

                return str_ValorDevuelto;
            }
        }
        public bool PROPIEDAD_PromocionPorUnidad_Embalaje_EsRelacional
        {
            get
            {
                bool bol_Valordevuelto = false;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Id != null)
                    {
                        bol_Valordevuelto = true;
                    }
                }

                return bol_Valordevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Embalaje_Operacion
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Operacion;
                }

                return str_ValorDevuelto;
            }
        }

        //Embalaje relacionado
        public string PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Tipo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Texto;
                }

                return str_ValorDevuelto;
            }
        }
        public long? PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Id
        {
            get
            {
                long? lng_ValorDevuelto = null;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    lng_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Id;
                }

                return lng_ValorDevuelto;
            }
        }
        public decimal PROPIEDAD_PromocionPorUnidad_EmbalajeRelacionado_Relacion
        {
            get
            {
                decimal dcm_ValorDevuelto = 1m;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    dcm_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Relacion;
                }

                return dcm_ValorDevuelto;
            }
        }

        //Cantidad Relacional
        public decimal PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional
        {
            get
            {
                decimal dcm_ValorDevuelto = 0m;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    dcm_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria;
                }

                return dcm_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional_Texto
        {
            get
            {
                string str_ValorDevuelto = "";
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria.ToString();
                }

                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional_Relacion
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Relacion.ToString();
                }

                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional_Relacion_Calculo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                try
                {
                    if (PROPIEDAD_PromocionPorUnidad_Existe)
                    {
                        //Tipo Operacion Dividir
                        if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_DIVIDIR.Codigo))
                        {
                            str_ValorDevuelto = "(" + string.Format("{0:0.000}", Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal / g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Relacion), 3)) + " " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto + ")";
                        }
                        //Tipo Operacion Multiplicar
                        else
                        {
                            str_ValorDevuelto = "(" + string.Format("{0:0.000}", Funciones.RedondearDecimal((g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal * g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Relacion), 3)) + " " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto + ")";
                        }
                    }
                }
                catch (Exception ex)
                {
                    Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(PROPIEDAD_PromocionPorUnidad_Cantidad_Relacional_Relacion_Calculo_Texto));
                }

                return str_ValorDevuelto;
            }
        }

        //Precio por 
        public string PROPIEDAD_PromocionPorUnidad_PrecioPor
        {
            get
            {
                string str_ValorDevuelto = "";
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    //2º unidad
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad.Equals(1))
                    {
                        str_ValorDevuelto = Variables.G_STR_PRECIOPOR_SEGUNDAUNIDAD_DESCRIPCION;
                    }
                    //Por Cantidad
                    else
                    {
                        str_ValorDevuelto = Variables.G_STR_PRECIOPOR_CANTIDAD_DESCRIPCION;
                    }
                }

                return str_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_PrecioPor_TAG
        {
            get
            {
                string str_ValorDevuelto = "";
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    //2º unidad
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad.Equals(1))
                    {
                        str_ValorDevuelto = Variables.G_STR_PRECIOPOR_SEGUNDAUNIDAD_CODIGO;
                    }
                    //Por Cantidad
                    else
                    {
                        str_ValorDevuelto = Variables.G_STR_PRECIOPOR_CANTIDAD_CODIGO;
                    }
                }

                return str_ValorDevuelto;
            }
        }
        public bool PROPIEDAD_PromocionPorUnidad_PrecioPor_SegundaUnidad
        {
            get
            {
                bool bol_ValorDevuelto = false;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    //2º unidad
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad.Equals(1))
                    {
                        bol_ValorDevuelto = true;
                    }
                }

                return bol_ValorDevuelto;
            }
        }
        public int PROPIEDAD_PromocionPorUnidad_PrecioPor_SegundaUnidad_Entero
        {
            get
            {
                int int_ValorDevuelto = 0;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    int_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad;
                }

                return int_ValorDevuelto;
            }
        }

        public int PROPIEDAD_PromocionPorUnidad_NumeroRedondeo
        {
            get
            {
                int int_ValorDevuelto = 0;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    int_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NumeroRedondeo;
                }

                return int_ValorDevuelto;
            }
        }

        //NomenclaturaPrecio
        public string PROPIEDAD_PromocionPorUnidad_NomenclaturaPrecio
        {
            get
            {
                string str_ValorDevuelto = "";
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio != null)
                    {
                        str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio.descripcion;
                    }
                }

                return str_ValorDevuelto;
            }
        }
        public bool PROPIEDAD_PromocionPorUnidad_NomenclaturaPrecio_Existe
        {
            get
            {
                bool bol_ValorDevuelto = false;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio != null)
                    {
                        bol_ValorDevuelto = true;
                    }
                }

                return bol_ValorDevuelto;
            }
        }
        public long PROPIEDAD_PromocionPorUnidad_NomenclaturaPrecio_Id
        {
            get
            {
                long lng_idValorDevuelto = -1;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio != null)
                    {
                        lng_idValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio.id;
                    }
                }

                return lng_idValorDevuelto;
            }
        }

        //Precio
        public decimal PROPIEDAD_PromocionPorUnidad_Precio
        {
            get
            {
                decimal dcm_ValorDevuelto = 0m;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Precio_Final != null)
                    {
                        dcm_ValorDevuelto = Funciones.RedondearDecimal(g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Precio_Final.Value, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo);
                    }
                }

                return dcm_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Precio_Texto
        {
            get
            {
                string str_ValorDevuelto = "0.000";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Precio_Final != null)
                    {
                        str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Precio_Final.Value.ToString();
                    }
                }

                return str_ValorDevuelto;
            }
        }

        //DescuentoGeneral
        public decimal PROPIEDAD_PromocionPorUnidad_DescuentoGeneral
        {
            get
            {
                decimal dcm_ValorDevuelto=0m;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    dcm_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_DescuentoGeneral;
                }

                return dcm_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_DescuentoGeneral_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_DescuentoGeneral.ToString(); ;
                }

                return str_ValorDevuelto;
            }
        }

        //Importe
        public decimal PROPIEDAD_PromocionPorUnidad_Importe
        {
            get
            {
                decimal dcm_ValorDevuelto = 0m;
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    dcm_ValorDevuelto = Calcular_Importe_PromocionesPorUnidad();
                }

                return dcm_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_Importe_Texto
        {
            get
            {
                string str_ValorDevuelto = "";
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto = Calcular_Importe_PromocionesPorUnidad().ToString();
                }

                return str_ValorDevuelto;
            }
        }

        //Impuesto Tipo
        public string PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Id != null)
                    {
                        str_ValorDevuelto = "(" + g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Codigo + ") " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion;
                    }
                }

                return str_ValorDevuelto;
            }
        }
        public long PROPIEDAD_PromocionPorUnidad_ImpuestoTipo_Id
        {
            get
            {
                long lng_ValorDevuelto = -1;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Id != null)
                    {
                        lng_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Id.Value;
                    }
                }

                return lng_ValorDevuelto;
            }
        }

        //Retencion Tipo
        public string PROPIEDAD_PromocionPorUnidad_RetencionTipo_Texto
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Id != null)
                    {
                        str_ValorDevuelto = "(" + g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Codigo + ") " + g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion;
                    }
                }

                return str_ValorDevuelto;
            }
        }
        public long PROPIEDAD_PromocionPorUnidad_RetencionTipo_Id
        {
            get
            {
                long lng_ValorDevuelto = -1;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Id != null)
                    {
                        lng_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Id.Value;
                    }
                }

                return lng_ValorDevuelto;
            }
        }

        //Albaranes_Asociados
        public string PROPIEDAD_PromocionPorUnidad_Albaranes_Asociados
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Albaranes_Asociados != null)
                    {
                        str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Albaranes_Asociados;
                    }
                }

                return str_ValorDevuelto;
            }
        }

        //Facturas_Asociadas
        public string PROPIEDAD_PromocionPorUnidad_Facturas_Asociadas
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Facturas_Asociados != null)
                    {
                        str_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Facturas_Asociados;
                    }
                }

                return str_ValorDevuelto;
            }
        }

        //Tipo de Compraventa Id
        public long PROPIEDAD_PromocionPorUnidad_TipoCompraVenta_Id
        {
            get
            {
                long lng_ValorDevuelto = -1;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    lng_ValorDevuelto = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_TipoCompraVenta_Id;
                }

                return lng_ValorDevuelto;
            }
        }

        #region Embalaje Principal del Articulo
        //Embalaje Principal
        public long PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_IdEmbalaje
        {
            get
            {
                long lng_ValorDevuelto = -1;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    lng_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id;
                }
                return lng_ValorDevuelto;
            }
        }
        public string PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Embalaje_Operacion
        {
            get
            {
                string str_ValorDevuelto = "";

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    str_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion;
                }
                return str_ValorDevuelto;
            }
        }

        //Embalaje relacionado
        public long? PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Id
        {
            get
            {
                long? lng_ValorDevuelto = null;
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    lng_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id; 
                }
                return lng_ValorDevuelto;
            }
        }
        public decimal PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_EmbalajeRelacionado_Relacion
        {
            get
            {
                decimal dcm_ValorDevuelto = 1m;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    dcm_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion;
                }
                return dcm_ValorDevuelto;
            }
        }

        //Cantidad Principal
        public decimal PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Cantidad_Principal_Relacion
        {
            get
            {
                decimal dcm_ValorDevuelto = 1m;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    dcm_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion;
                }
                return dcm_ValorDevuelto;
            }
        }

        //Precio
        public decimal PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_Precio
        {
            get
            {
                decimal dcm_ValorDevuelto = 0m;

                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    dcm_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_precio;
                }
                return dcm_ValorDevuelto;
            }
        }

        //Precio por Segunda Unidad
        public int PROPIEDAD_PromocionPorUnidad_EmbalajePrincipalDelArticulo_PrecioPor_SegundaUnidad_Entero
        {
            get
            {
                int int_ValorDevuelto = 0;
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    int_ValorDevuelto= g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad;
                }
                return int_ValorDevuelto;
            }
        }

        #endregion
        #endregion

        #endregion

        #region Constructor
        public VentasCompras_Calculos(int _int_Tipo_ClienteProveedor, 
                                      long _lng_idClienteProveedor, 
                                      DateTime _dtt_Fecha, 
                                      long _lng_idEmpresa,
                                      decimal _dcm_DescuentoGeneral)
        {
            g_int_Tipo_ClienteProveedor = _int_Tipo_ClienteProveedor;
            g_lng_idClienteProveedor = _lng_idClienteProveedor;
            g_lng_idEmpresa = _lng_idEmpresa;
            g_dtt_Fecha = _dtt_Fecha;
            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral = _dcm_DescuentoGeneral;

            //Buscar Todos los Embalajes
            g_lst_MAE_Embalajes = Embalajes_Obtener();
        }
        #endregion

        #region Cambios de datos

        public void Cambio_ClienteProveedorFecha(long _lng_idArticulo_ArticuloComodin,
                                                bool _bol_EsArticuloComodin,
                                                decimal? _dcm_Precio,
                                                long _lng_idEmbalaje,
                                                string _str_TipoCompraVenta_Opcion,
                                                long _lng_TipoCompraVenta_Id,
                                                decimal _dcm_Cantidad,
                                                decimal? _dcm_CantidadSegundaUnidad)
        {
            try
            {
                #region  Vaciar Variables
                //Tipo CompraVenta
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = -1;

                //Articulo
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = "";

                //ArticuloComodin
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = "";

                //Codigos Articos proveedor
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_CodigosArticuloProveedor = null;

                //Articulos_Embalajes
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes = null;

                //Impuesto Tipo
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = "";

                //Retencion Tipo
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Codigo = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion = "";

                //precio Final
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = _dcm_Precio;
                
                //NumeroRedondeo
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = 3;

                //cantidad principal
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = 0m;

                //cantidad secundaria
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;

                //Nomenclatura precio
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = null;

                //Listado de embalajes
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();

                //Embalaje 
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = "";

                //Embalaje segunda unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                //Embalaje Principal
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = 0m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                //Listado de Tarifas/Promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = null;
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = null;

                //Promocion por Unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Articulo_Id = -1;
                #endregion

                //Tipo CompraVenta
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = _str_TipoCompraVenta_Opcion;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = _lng_TipoCompraVenta_Id;

                //EsArticuloComodin
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es = _bol_EsArticuloComodin;

                bool bol_EncontroArticulo = false;
                //## ARTICULO #######################################
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                {
                    #region MAE_ARTICULOS
                    MAE_Articulos mdl_MAE_Articulos = Articulo_Obtener(_lng_idArticulo_ArticuloComodin);

                    //Si hay algo en el modelo de Articulo sigo buscando datos
                    if (mdl_MAE_Articulos != null)
                    {
                        bol_EncontroArticulo = true;

                        //Articulo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = mdl_MAE_Articulos.id;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = mdl_MAE_Articulos.codigo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = mdl_MAE_Articulos.descripcion;

                        //Cliente(Venta)
                        if (g_int_Tipo_ClienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO))
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = mdl_MAE_Articulos.tipoTrazabilidad_Salidas;
                        }
                        //Proveedor(Compra)
                        else
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = mdl_MAE_Articulos.tipoTrazabilidad_Entradas;
                        }

                        //Codigos Articulo proveedor
                        if (mdl_MAE_Articulos.MAE_Proveedores_CodigosArticuloProveedor != null &&
                            mdl_MAE_Articulos.MAE_Proveedores_CodigosArticuloProveedor.Count > 0)
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_CodigosArticuloProveedor = mdl_MAE_Articulos.MAE_Proveedores_CodigosArticuloProveedor.ToList();
                        }

                        //Impuesto Tipo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = mdl_MAE_Articulos.idImpuestoTipo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = mdl_MAE_Articulos.GEN_ImpuestosTipos.codigo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = mdl_MAE_Articulos.GEN_ImpuestosTipos.descripcion;

                        //Retencion Tipo
                        if (mdl_MAE_Articulos.idRetencionTipo_Venta != null)
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id = mdl_MAE_Articulos.idRetencionTipo_Venta;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Codigo = mdl_MAE_Articulos.GEN_RetencionesTipos.codigo;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion = mdl_MAE_Articulos.GEN_RetencionesTipos.descripcion;
                        }

                        //Seleccionamos la Nomenclatura precio  ##############################################################################################################
                        //Compra (Proveedor)
                        if (g_int_Tipo_ClienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_PROVEEDOR_CODIGO))
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_Articulos.MAE_NomenclaturasPrecios;
                        }
                        //Ventas (Cliente)
                        else
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_Articulos.MAE_NomenclaturasPrecios1;
                        }

                        // Buscamos el Embalaje principal del Articulo ##############################################################################################################
                        if (mdl_MAE_Articulos.MAE_Articulos_Embalajes != null &&
                            mdl_MAE_Articulos.MAE_Articulos_Embalajes.Count > 0)
                        {
                            //Todos los MAE_Articulos_Embalajes del articulo
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes = mdl_MAE_Articulos.MAE_Articulos_Embalajes.ToList();

                            //Rellenar el listado de Embalajes
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();
                            foreach (MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes in mdl_MAE_Articulos.MAE_Articulos_Embalajes)
                            {
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Articulos_Embalajes.MAE_Embalajes.id.ToString(), mdl_MAE_Articulos_Embalajes.MAE_Embalajes.descripcion, null));
                            }

                            //BUSCAR EL EMBALAJE PRINCIPAL
                            MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes_PRINCIPAL = mdl_MAE_Articulos.MAE_Articulos_Embalajes.Where(x => x.fechaBorrado == null && x.esPrincipal).FirstOrDefault();
                            if (mdl_MAE_Articulos_Embalajes_PRINCIPAL != null)
                            {
                                //Embalaje
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = mdl_MAE_Articulos_Embalajes_PRINCIPAL.idEmbalajePrincipal;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes.descripcion;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajePrincipal;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.operacion;

                                if (mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios != null &&
                                    mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios.Count > 0)
                                {
                                    //Listado de los precios de todas las nomenclaturas del embalaje principal del articulo
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios.ToList();

                                    //Primero miro en el Historico de precios
                                    decimal? dcm_Precio_SegunEmbalajePrincipal = PrecioHistorico_Obtener(_lng_idArticulo_ArticuloComodin, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio.id, g_dtt_Fecha);
                                    if (dcm_Precio_SegunEmbalajePrincipal != null)
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = dcm_Precio_SegunEmbalajePrincipal.Value;
                                    }
                                    //Sino en los datos del articulo
                                    else
                                    {
                                        //precio por defecto de la nomenclatura por defecto
                                        MAE_Articulos_EmbalajesPrincipal_Precios mdl_MAE_Articulos_EmbalajesPrincipal_Precios = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios.Where(m => m.idNomenclaturaPrecio.Equals(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio.id)).FirstOrDefault();
                                        if (mdl_MAE_Articulos_EmbalajesPrincipal_Precios != null)
                                        {
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = mdl_MAE_Articulos_EmbalajesPrincipal_Precios.precio;
                                        }
                                    }
                                }

                                //Embalaje Segunda unidad
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = mdl_MAE_Articulos_Embalajes_PRINCIPAL.idEmbalajeRelacional;
                                if (mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes1 != null)
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes1.descripcion;
                                }
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajeRelacional != null ? mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajeRelacional.Value : 1m;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_MAE_Articulos_Embalajes_PRINCIPAL.precio_Cantidad_SegundaUnidad != null ? mdl_MAE_Articulos_Embalajes_PRINCIPAL.precio_Cantidad_SegundaUnidad.Value : 0;
                            }

                            //Es el Embalaje Seleccionado
                            MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes_SELECCIONADO = mdl_MAE_Articulos.MAE_Articulos_Embalajes.Where(x => x.idEmbalajePrincipal.Equals(_lng_idEmbalaje)).FirstOrDefault();

                            //por defecto
                            if (mdl_MAE_Articulos_Embalajes_SELECCIONADO == null)
                            {
                                mdl_MAE_Articulos_Embalajes_SELECCIONADO = mdl_MAE_Articulos.MAE_Articulos_Embalajes.Where(x => x.fechaBorrado == null && x.esPrincipal).FirstOrDefault();
                            }

                            if (mdl_MAE_Articulos_Embalajes_SELECCIONADO != null)
                            {
                                //idEmbalajePrincipal
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = mdl_MAE_Articulos_Embalajes_SELECCIONADO.idEmbalajePrincipal;

                                //Embalaje texto
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = mdl_MAE_Articulos_Embalajes_SELECCIONADO.MAE_Embalajes.descripcion;

                                // Cantidad principal
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = Calculo_Segun_TipoCompraVenta(_dcm_Cantidad, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);

                                //relacion
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = mdl_MAE_Articulos_Embalajes_SELECCIONADO.cantidadEmbalajePrincipal;

                                //Operacion
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = mdl_MAE_Articulos_Embalajes_SELECCIONADO.operacion;

                                //precio_Cantidad_SegundaUnidad
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_MAE_Articulos_Embalajes_SELECCIONADO.precio_Cantidad_SegundaUnidad != null ? mdl_MAE_Articulos_Embalajes_SELECCIONADO.precio_Cantidad_SegundaUnidad.Value : 0;

                                //idEmbalajeRelacional
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = mdl_MAE_Articulos_Embalajes_SELECCIONADO.idEmbalajeRelacional;

                                //Descripcion el embalaje relacional
                                if (mdl_MAE_Articulos_Embalajes_SELECCIONADO.MAE_Embalajes1 != null)
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = mdl_MAE_Articulos_Embalajes_SELECCIONADO.MAE_Embalajes1.descripcion;
                                }

                                //relacion embalaje segunda unidad
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = mdl_MAE_Articulos_Embalajes_SELECCIONADO.cantidadEmbalajeRelacional != null ? mdl_MAE_Articulos_Embalajes_SELECCIONADO.cantidadEmbalajeRelacional.Value : 1m;

                                // Cantidad Secundaria
                                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id != null &&
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id.Value > -1)
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = Calculo_Segun_TipoCompraVenta((_dcm_CantidadSegundaUnidad != null ? _dcm_CantidadSegundaUnidad.Value : 0m), g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);
                                }
                                else
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;
                                }
                            }
                        }
                    }
                    #endregion
                }
                //## ARTICULO COMODIN ###############################
                else
                {
                    #region MAE_ARTICULOSCOMODIN
                    MAE_ArticulosComodin mdl_MAE_ArticulosComodin = ArticuloComodin_Obtener(_lng_idArticulo_ArticuloComodin);

                    //Si hay algo en el modelo de Articulo sigo buscando datos
                    if (mdl_MAE_ArticulosComodin != null)
                    {
                        bol_EncontroArticulo = true;

                        //Articulo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = mdl_MAE_ArticulosComodin.id;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = mdl_MAE_ArticulosComodin.codigo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = mdl_MAE_ArticulosComodin.descripcion;

                        //Sin Trazabilidad
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = Variables.G_MDL_TIPOSTRAZABILIDAD_SINTRAZABILIDAD.Codigo;

                        //Codigos Articulo proveedor
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_CodigosArticuloProveedor = null;

                        //Impuesto Tipo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = mdl_MAE_ArticulosComodin.idImpuestoTipo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = mdl_MAE_ArticulosComodin.GEN_ImpuestosTipos.codigo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = mdl_MAE_ArticulosComodin.GEN_ImpuestosTipos.descripcion;

                        //Retencion Tipo
                        if (mdl_MAE_ArticulosComodin.idRetencionTipo_Venta != null)
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id = mdl_MAE_ArticulosComodin.idRetencionTipo_Venta;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Codigo = mdl_MAE_ArticulosComodin.GEN_RetencionesTipos.codigo;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion = mdl_MAE_ArticulosComodin.GEN_RetencionesTipos.descripcion;
                        }

                        //Seleccionamos la Nomenclatura precio  ##############################################################################################################
                        //Compra (Proveedor)
                        if (g_int_Tipo_ClienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_PROVEEDOR_CODIGO))
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_ArticulosComodin.MAE_NomenclaturasPrecios1;
                        }
                        //Ventas (Cliente)
                        else
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_ArticulosComodin.MAE_NomenclaturasPrecios;
                        }

                        //Todos los MAE_Articulos_Embalajes del articulo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes = null;

                        //Rellenar el listado de Embalajes
                        MAE_Embalajes mdl_MAE_Embalajes_SELECCIONADO = null;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();
                        if (g_lst_MAE_Embalajes != null)
                        {
                            //Listado de Embalajes
                            foreach (MAE_Embalajes mdl_MAE_Embalajes in g_lst_MAE_Embalajes)
                            {
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Embalajes.id.ToString(), mdl_MAE_Embalajes.descripcion, null));
                            }

                            //BUSCAR EL EMBALAJE PRINCIPAL
                            MAE_Embalajes mdl_MAE_Embalajes_PRINCIPAL = g_lst_MAE_Embalajes.FirstOrDefault();
                            if (mdl_MAE_Embalajes_PRINCIPAL != null)
                            {
                                //Embalaje
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = mdl_MAE_Embalajes_PRINCIPAL.id;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = mdl_MAE_Embalajes_PRINCIPAL.descripcion;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = 1;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Codigo;

                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = 0m;
                                    
                                //Embalaje Segunda unidad
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = null;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = "";
                                
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion =  1m;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;
                            }

                            //Es el Embalaje Seleccionado
                            mdl_MAE_Embalajes_SELECCIONADO = g_lst_MAE_Embalajes.FirstOrDefault();

                        }

                        if (mdl_MAE_Embalajes_SELECCIONADO != null)
                        {
                            //idEmbalajePrincipal
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = mdl_MAE_Embalajes_SELECCIONADO.id;

                            //Embalaje texto
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = mdl_MAE_Embalajes_SELECCIONADO.descripcion;

                            // Cantidad principal
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = Calculo_Segun_TipoCompraVenta(_dcm_Cantidad, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);

                            //relacion
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = 1;

                            //Operacion
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Codigo;

                            //precio_Cantidad_SegundaUnidad
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                            //idEmbalajeRelacional
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id =null;

                            //Descripcion el embalaje relacional
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = "";
                            
                            //relacion embalaje segunda unidad
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = 1m;

                            // Cantidad Secundaria
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;
                        }
                    }
                    #endregion
                }

                if (bol_EncontroArticulo)
                {
                    //## Cargar Promociones y Tarifas del articulo ##############################################################################################################
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                    {
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = TarifasPromociones_Obtener_Desde_BaseDatos(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id);
                    }

                    //## Order Listado  ##########################################################################################################################################
                    Actualizar_Orden_TarifasPromociones(-1, -1, ref g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo);

                    //## Cargar Promociones y Tarifas Filtradas #################################################################################################################
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();

                    //## Calcular el Precio Final ###############################################################################################################################
                    AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio();
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;

                    //## Calcular las promocionesPorUnidad ######################################################################################################################
                    Calcular_PromocionesPorUnidad();
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_ClienteProveedorFecha));
            }
        }

        public void Cambio_Articulo(long _lng_idArticulo_ArticuloComodin,
                                    bool _bol_EsArticuloComodin,
                                    long? _lng_idEmbalaje,
                                    string _str_TipoCompraVenta_Opcion,
                                    long _lng_TipoCompraVenta_Id)
        {
            try
            {
                #region  Vaciar Variables
                //Tipo CompraVenta
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = -1;

                //Articulo
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = "";

                //ArticuloComodin
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = "";

                //Codigos Articos proveedor
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_CodigosArticuloProveedor = null;

                //Articulos_Embalajes
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes = null;

                //Impuesto Tipo
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = "";

                //Retencion Tipo
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Codigo = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion = "";

                //precio Final
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = null;

                //NumeroRedondeo
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = 3;

                //cantidad principal
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = 0m;

                //cantidad secundaria
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;

                //Nomenclatura precio
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = null;

                //Listado de embalajes
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();

                //Embalaje 
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = "";

                //Embalaje segunda unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                //Embalaje Principal
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = 0m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                //Listado de Tarifas/Promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = null;
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = null;

                //Promocion por Unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Articulo_Id = -1;
                #endregion

                //Tipo CompraVenta
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = _str_TipoCompraVenta_Opcion;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = _lng_TipoCompraVenta_Id;

                //EsArticuloComodin
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es = _bol_EsArticuloComodin;

                bool bol_EncontroArticulo = false;

                //## ARTICULO #######################################
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                {
                    #region MAE_ARTICULOS
                    MAE_Articulos mdl_MAE_Articulos = Articulo_Obtener(_lng_idArticulo_ArticuloComodin);

                    //Si hay algo en el modelo de Articulo sigo buscando datos
                    if (mdl_MAE_Articulos != null)
                    {
                        bol_EncontroArticulo = true;

                        //Articulo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id = mdl_MAE_Articulos.id;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Codigo = mdl_MAE_Articulos.codigo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Descripcion = mdl_MAE_Articulos.descripcion;

                        //Tipo trazabilidad
                        //Cliente(Venta)
                        if (g_int_Tipo_ClienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO))
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = mdl_MAE_Articulos.tipoTrazabilidad_Salidas;
                        }
                        //Proveedor(Compra)
                        else
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = mdl_MAE_Articulos.tipoTrazabilidad_Entradas;
                        }

                        //Codigos Articulo proveedor
                        if (mdl_MAE_Articulos.MAE_Proveedores_CodigosArticuloProveedor != null &&
                            mdl_MAE_Articulos.MAE_Proveedores_CodigosArticuloProveedor.Count > 0)
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_CodigosArticuloProveedor = mdl_MAE_Articulos.MAE_Proveedores_CodigosArticuloProveedor.ToList();
                        }

                        //Impuesto Tipo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = mdl_MAE_Articulos.idImpuestoTipo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = mdl_MAE_Articulos.GEN_ImpuestosTipos.codigo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = mdl_MAE_Articulos.GEN_ImpuestosTipos.descripcion;

                        //Retencion Tipo
                        if (mdl_MAE_Articulos.idRetencionTipo_Venta != null)
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id = mdl_MAE_Articulos.idRetencionTipo_Venta;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Codigo = mdl_MAE_Articulos.GEN_RetencionesTipos.codigo;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion = mdl_MAE_Articulos.GEN_RetencionesTipos.descripcion;
                        }

                        //Seleccionamos la Nomenclatura precio  ##############################################################################################################
                        //Compra (Proveedor)
                        if (g_int_Tipo_ClienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_PROVEEDOR_CODIGO))
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_Articulos.MAE_NomenclaturasPrecios;
                        }
                        //Ventas (Cliente)
                        else
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_Articulos.MAE_NomenclaturasPrecios1;
                        }

                        // Buscamos el Embalaje principal del Articulo ##############################################################################################################
                        if (mdl_MAE_Articulos.MAE_Articulos_Embalajes != null &&
                            mdl_MAE_Articulos.MAE_Articulos_Embalajes.Count > 0)
                        {
                            //Todos los MAE_Articulos_Embalajes del articulo
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes = mdl_MAE_Articulos.MAE_Articulos_Embalajes.ToList();

                            //Rellenar el listado de Embalajes
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();
                            foreach (MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes in mdl_MAE_Articulos.MAE_Articulos_Embalajes)
                            {
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Articulos_Embalajes.MAE_Embalajes.id.ToString(), mdl_MAE_Articulos_Embalajes.MAE_Embalajes.descripcion, null));
                            }

                            //BUSCAR EL EMBALAJE PRINCIPAL
                            MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes_PRINCIPAL = mdl_MAE_Articulos.MAE_Articulos_Embalajes.Where(x => x.fechaBorrado == null && x.esPrincipal).FirstOrDefault();
                            if (mdl_MAE_Articulos_Embalajes_PRINCIPAL != null)
                            {
                                //Embalaje
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = mdl_MAE_Articulos_Embalajes_PRINCIPAL.idEmbalajePrincipal;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes.descripcion;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajePrincipal;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.operacion;

                                if (mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios != null &&
                                    mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios.Count > 0)
                                {
                                    //Listado de los precios de todas las nomenclaturas del embalaje principal del articulo
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios.ToList();

                                    //Primero miro en el Historico de precios
                                    decimal? dcm_Precio_SegunEmbalajePrincipal = PrecioHistorico_Obtener(_lng_idArticulo_ArticuloComodin, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio.id, g_dtt_Fecha);
                                    if (dcm_Precio_SegunEmbalajePrincipal != null)
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = dcm_Precio_SegunEmbalajePrincipal.Value;
                                    }
                                    else
                                    {
                                        //precio por defecto de la nomenclatura por defecto
                                        MAE_Articulos_EmbalajesPrincipal_Precios mdl_MAE_Articulos_EmbalajesPrincipal_Precios = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios.Where(m => m.idNomenclaturaPrecio.Equals(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio.id)).FirstOrDefault();
                                        if (mdl_MAE_Articulos_EmbalajesPrincipal_Precios != null)
                                        {
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = mdl_MAE_Articulos_EmbalajesPrincipal_Precios.precio;
                                        }
                                    }
                                }

                                //Embalaje Segunda unidad
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = mdl_MAE_Articulos_Embalajes_PRINCIPAL.idEmbalajeRelacional;
                                if (mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes1 != null)
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes1.descripcion;
                                }
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajeRelacional != null ? mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajeRelacional.Value : 1m;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_MAE_Articulos_Embalajes_PRINCIPAL.precio_Cantidad_SegundaUnidad != null ? mdl_MAE_Articulos_Embalajes_PRINCIPAL.precio_Cantidad_SegundaUnidad.Value : 0;
                            }

                            //1º Si la variable de idembalaje no esta a nula se busca ese embalaje
                            MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes_PORDEFECTO = null;
                            if (_lng_idEmbalaje != null)
                            {
                                mdl_MAE_Articulos_Embalajes_PORDEFECTO = mdl_MAE_Articulos.MAE_Articulos_Embalajes.Where(x => x.idEmbalajePrincipal.Equals(_lng_idEmbalaje.Value)).FirstOrDefault();
                            }

                            //Si la variable de embalaje es nula se busca el que este por defecto
                            if (mdl_MAE_Articulos_Embalajes_PORDEFECTO == null)
                            {
                                mdl_MAE_Articulos_Embalajes_PORDEFECTO = mdl_MAE_Articulos.MAE_Articulos_Embalajes.Where(x => x.fechaBorrado == null && x.esPrincipal).FirstOrDefault();
                            }

                            if (mdl_MAE_Articulos_Embalajes_PORDEFECTO != null)
                            {
                                //idEmbalajePrincipal
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = mdl_MAE_Articulos_Embalajes_PORDEFECTO.idEmbalajePrincipal;

                                //Embalaje texto
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = mdl_MAE_Articulos_Embalajes_PORDEFECTO.MAE_Embalajes.descripcion;

                                // Cantidad principal
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = Calculo_Segun_TipoCompraVenta(1m, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);

                                //relacion
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = mdl_MAE_Articulos_Embalajes_PORDEFECTO.cantidadEmbalajePrincipal;

                                //Operacion
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = mdl_MAE_Articulos_Embalajes_PORDEFECTO.operacion;

                                //precio_Cantidad_SegundaUnidad
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_MAE_Articulos_Embalajes_PORDEFECTO.precio_Cantidad_SegundaUnidad != null ? mdl_MAE_Articulos_Embalajes_PORDEFECTO.precio_Cantidad_SegundaUnidad.Value : 0;

                                //idEmbalajeRelacional
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = mdl_MAE_Articulos_Embalajes_PORDEFECTO.idEmbalajeRelacional;

                                //Descripcion el embalaje relacional
                                if (mdl_MAE_Articulos_Embalajes_PORDEFECTO.MAE_Embalajes1 != null)
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = mdl_MAE_Articulos_Embalajes_PORDEFECTO.MAE_Embalajes1.descripcion;
                                }

                                //relacion embalaje segunda unidad
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = mdl_MAE_Articulos_Embalajes_PORDEFECTO.cantidadEmbalajeRelacional != null ? mdl_MAE_Articulos_Embalajes_PORDEFECTO.cantidadEmbalajeRelacional.Value : 1m;

                                // Cantidad Secundaria
                                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id != null &&
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id.Value > -1)
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = Calculo_Segun_TipoCompraVenta((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal), g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);
                                }
                                else
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;
                                }
                            }
                        }
                    }
                    #endregion
                }
                //## ARTICULO COMODIN ###############################
                else
                {
                    #region MAE_ARTICULOSCOMODIN
                    MAE_ArticulosComodin mdl_MAE_ArticulosComodin = ArticuloComodin_Obtener(_lng_idArticulo_ArticuloComodin);

                    //Si hay algo en el modelo de Articulo sigo buscando datos
                    if (mdl_MAE_ArticulosComodin != null)
                    {
                        bol_EncontroArticulo = true;

                        //Articulo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Id = mdl_MAE_ArticulosComodin.id;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Codigo = mdl_MAE_ArticulosComodin.codigo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Descripcion = mdl_MAE_ArticulosComodin.descripcion;

                        //Sin Trazabilidad
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_TipoTrazabilidad = Variables.G_MDL_TIPOSTRAZABILIDAD_SINTRAZABILIDAD.Codigo;

                        //Codigos Articulo proveedor
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_CodigosArticuloProveedor = null;

                        //Impuesto Tipo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Id = mdl_MAE_ArticulosComodin.idImpuestoTipo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Codigo = mdl_MAE_ArticulosComodin.GEN_ImpuestosTipos.codigo;
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ImpuestoTipo_Descripcion = mdl_MAE_ArticulosComodin.GEN_ImpuestosTipos.descripcion;

                        //Retencion Tipo
                        if (mdl_MAE_ArticulosComodin.idRetencionTipo_Venta != null)
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Id = mdl_MAE_ArticulosComodin.idRetencionTipo_Venta;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Codigo = mdl_MAE_ArticulosComodin.GEN_RetencionesTipos.codigo;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_RetencionTipo_Descripcion = mdl_MAE_ArticulosComodin.GEN_RetencionesTipos.descripcion;
                        }

                        //Seleccionamos la Nomenclatura precio  ##############################################################################################################
                        //Compra (Proveedor)
                        if (g_int_Tipo_ClienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_PROVEEDOR_CODIGO))
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_ArticulosComodin.MAE_NomenclaturasPrecios1;
                        }
                        //Ventas (Cliente)
                        else
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_ArticulosComodin.MAE_NomenclaturasPrecios;
                        }

                        //Todos los MAE_Articulos_Embalajes del articulo
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes = null;

                        //Rellenar el listado de Embalajes
                        MAE_Embalajes mdl_MAE_Embalajes_SELECCIONADO = null;

                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();
                        if (g_lst_MAE_Embalajes != null)
                        {
                            //Listado de Embalajes
                            foreach (MAE_Embalajes mdl_MAE_Embalajes in g_lst_MAE_Embalajes)
                            {
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Embalajes.id.ToString(), mdl_MAE_Embalajes.descripcion, null));
                            }

                            //BUSCAR EL EMBALAJE PRINCIPAL
                            MAE_Embalajes mdl_MAE_Embalajes_PRINCIPAL = g_lst_MAE_Embalajes.FirstOrDefault();
                            if (mdl_MAE_Embalajes_PRINCIPAL != null)
                            {
                                //Embalaje
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = mdl_MAE_Embalajes_PRINCIPAL.id;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = mdl_MAE_Embalajes_PRINCIPAL.descripcion;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = 1;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Codigo;

                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = 0m;

                                //Embalaje Segunda unidad
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = null;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = "";

                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = 1m;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;
                            }

                            //Es el Embalaje Seleccionado
                            mdl_MAE_Embalajes_SELECCIONADO = g_lst_MAE_Embalajes.FirstOrDefault();

                        }

                        if (mdl_MAE_Embalajes_SELECCIONADO != null)
                        {
                            //idEmbalajePrincipal
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = mdl_MAE_Embalajes_SELECCIONADO.id;

                            //Embalaje texto
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = mdl_MAE_Embalajes_SELECCIONADO.descripcion;

                            // Cantidad principal
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = Calculo_Segun_TipoCompraVenta(1m, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);

                            //relacion
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = 1;

                            //Operacion
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Codigo;

                            //precio_Cantidad_SegundaUnidad
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                            //idEmbalajeRelacional
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = null;

                            //Descripcion el embalaje relacional
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = "";

                            //relacion embalaje segunda unidad
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = 1m;

                            // Cantidad Secundaria
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;
                        }
                    }
                    #endregion
                }

                if (bol_EncontroArticulo)
                {
                    //## Cargar Promociones y Tarifas del articulo ###########################################################################################################
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                    {
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = TarifasPromociones_Obtener_Desde_BaseDatos(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id);
                    }

                    //## Order Listado ########################################################################################################################################
                    Actualizar_Orden_TarifasPromociones(-1, -1, ref g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo);

                    //## Cargar Promociones y Tarifas Filtradas ##############################################################################################################
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();

                    //## Calcular el Precio Final ############################################################################################################################
                    AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio();
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;

                    //## Calcular las promocionesPorUnidad ####################################################################################################################
                    Calcular_PromocionesPorUnidad();
                }
                
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_Articulo));
            }
        }

        public void Cambio_CantidadPrincipal(decimal? _dcm_CantidadPrincipal)
        {
            try
            {
                #region  Vaciar Variables

                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = 0m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;

                //Listado de Tarifas/Promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = null;

                //Promocion por Unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                #endregion

                if (_dcm_CantidadPrincipal!=null)
                {
                    //Actualiar la cantidad principal
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = Calculo_Segun_TipoCompraVenta(_dcm_CantidadPrincipal.Value,g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);

                    // Actualizo la Cantidad Secundaria
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id != null &&
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id.Value > -1)
                    {
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = Calculo_Segun_TipoCompraVenta((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal), g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);
                    }
                    else
                    {
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;
                    }

                    // Cargar Promociones y Tarifas Filtradas
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();

                    // Calcular el Precio Final ##############################################################################################
                    AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio();
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;

                    // Calcular las promocionesPorUnidad ##############################################################################################
                    Calcular_PromocionesPorUnidad();
                }   
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_CantidadPrincipal));
            }
        }

        public void Cambio_CantidadSecundaria(decimal? _dcm_CantidadSecundaria)
        {
            try
            {
                #region  Vaciar Variables

                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;

                //Listado de Tarifas/Promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = null;

                //Promocion por Unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                #endregion

                if (_dcm_CantidadSecundaria != null)
                {
                    //Actualiar la cantidad secundaria
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = Calculo_Segun_TipoCompraVenta(_dcm_CantidadSecundaria.Value,g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);

                    // Cargar Promociones y Tarifas Filtradas
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();

                    // Calcular el Precio Final ##############################################################################################
                    AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio();
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;

                    // Calcular las promocionesPorUnidad ##############################################################################################
                    Calcular_PromocionesPorUnidad();
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_CantidadSecundaria));
            }
        }

        public void Cambio_Precio(decimal? _dcm_Precio)
        {
            try
            {
                #region  Vaciar Variables

                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = null;
                #endregion

                if (_dcm_Precio != null)
                {
                    //Actualizar la precio
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = _dcm_Precio.Value;
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_Precio));
            }
        }

        public void Cambio_DescuentoGeneral(decimal? _dcm_DescuentoGeneral)
        {
            try
            {
                #region  Vaciar Variables

                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral = 0m;
                #endregion

                if (_dcm_DescuentoGeneral != null)
                {
                    //Actualizar la descuento general
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral = _dcm_DescuentoGeneral.Value;
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_DescuentoGeneral));
            }
        }

        public void Cambio_Embalaje(long _lng_idEmbalaje)
        {
            try
            {
                #region  Vaciar Variables

                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es==false)
                {
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = null;
                }

                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = 3;

                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;

                //Embalaje Seleccionado
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = "";

                //Embalaje selccionado segunda unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = null;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = 1m;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                //Listado de Tarifas/Promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = null;

                //Promocion por Unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                #endregion

                //## ARTICULO #######################################
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                {
                    MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes_SELECCIONADO = null;

                    //Si ya tengo un listado de MAE_Articulos_Embalajes busco ahi
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes != null)
                    {
                        mdl_MAE_Articulos_Embalajes_SELECCIONADO = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes.Where(x => x.idEmbalajePrincipal.Equals(_lng_idEmbalaje)).FirstOrDefault();
                    }
                    //Sino busco el articulo y sus embalajes en BD
                    else
                    {
                        //Busco el Articulo primero
                        MAE_Articulos mdl_MAE_Articulos = Articulo_Obtener(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id);

                        if (mdl_MAE_Articulos != null &&
                            mdl_MAE_Articulos.MAE_Articulos_Embalajes != null &&
                            mdl_MAE_Articulos.MAE_Articulos_Embalajes.Count > 0)
                        {
                            //Actualizo el listado
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes = mdl_MAE_Articulos.MAE_Articulos_Embalajes.ToList();


                            mdl_MAE_Articulos_Embalajes_SELECCIONADO = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes.Where(x => x.idEmbalajePrincipal.Equals(_lng_idEmbalaje)).FirstOrDefault();
                        }
                    }

                    if (mdl_MAE_Articulos_Embalajes_SELECCIONADO != null)
                    {
                        //idEmbalajePrincipal
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = _lng_idEmbalaje;

                        //Embalaje texto
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = mdl_MAE_Articulos_Embalajes_SELECCIONADO.MAE_Embalajes.descripcion;

                        //relacion
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = mdl_MAE_Articulos_Embalajes_SELECCIONADO.cantidadEmbalajePrincipal;

                        //Operacion
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = mdl_MAE_Articulos_Embalajes_SELECCIONADO.operacion;

                        //precio_Cantidad_SegundaUnidad
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_MAE_Articulos_Embalajes_SELECCIONADO.precio_Cantidad_SegundaUnidad != null ? mdl_MAE_Articulos_Embalajes_SELECCIONADO.precio_Cantidad_SegundaUnidad.Value : 0;

                        //idEmbalajeRelacional
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = mdl_MAE_Articulos_Embalajes_SELECCIONADO.idEmbalajeRelacional;

                        //Descripcion el embalaje relacional
                        if (mdl_MAE_Articulos_Embalajes_SELECCIONADO.MAE_Embalajes1 != null)
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = mdl_MAE_Articulos_Embalajes_SELECCIONADO.MAE_Embalajes1.descripcion;
                        }

                        //relacion embalaje segunda unidad
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = mdl_MAE_Articulos_Embalajes_SELECCIONADO.cantidadEmbalajeRelacional != null ? mdl_MAE_Articulos_Embalajes_SELECCIONADO.cantidadEmbalajeRelacional.Value : 1m;

                        // Cantidad Secundaria
                        if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id != null &&
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id.Value > -1)
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = Calculo_Segun_TipoCompraVenta((g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal), g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, false);
                        }
                        else
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;
                        }
                    }
                }
                //## ARTICULO COMODIN ###############################
                else
                {
                    MAE_Embalajes mdl_MAE_Embalajes = null;
                    if (g_lst_MAE_Embalajes!=null)
                    {
                        mdl_MAE_Embalajes= g_lst_MAE_Embalajes.Where(m => m.id.Equals(_lng_idEmbalaje)).FirstOrDefault();
                    }
                    if (mdl_MAE_Embalajes != null)
                    {
                        //idEmbalajePrincipal
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id = _lng_idEmbalaje;

                        //Embalaje texto
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Texto = mdl_MAE_Embalajes.descripcion;

                        //relacion
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion = 1m;

                        //Operacion
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion = Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Codigo;

                        //precio_Cantidad_SegundaUnidad
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                        //idEmbalajeRelacional
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id = null;

                        //Descripcion el embalaje relacional
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Texto = "";

                        //relacion embalaje segunda unidad
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = 1m;

                        // Cantidad Secundaria
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = 0m;
                    }
                }


                // Cargar Promociones y Tarifas Filtradas ##############################################################################################################
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();

                // Calcular el Precio Final ##############################################################################################
                AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio();
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;
                

                // Calcular las promocionesPorUnidad ##############################################################################################
                Calcular_PromocionesPorUnidad();
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_Embalaje));
            }
        }

        public void Cambio_PromocionPorUnidad_CantidadSecundaria(decimal? _dcm_CantidadSecundaria)
        {
            try
            {
                #region  Vaciar Variables

                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria = 0m;
                
                #endregion

                if (_dcm_CantidadSecundaria != null)
                {
                    //Actualizar la cantidad relacional
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria = Calculo_Segun_TipoCompraVenta(_dcm_CantidadSecundaria.Value,g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_TipoCompraVenta_Opcion, false);
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_PromocionPorUnidad_CantidadSecundaria));
            }
        }

        public void Cambio_PromocionPorUnidad_Desactivar()
        {
            try
            {
                if (PROPIEDAD_PromocionPorUnidad_Existe)
                {
                    //Buscar en el listado de g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo el que tiene promocion por unidad y desactivarlo
                    if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo != null &&
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count > 0)
                    {
                        INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo=g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => m.Id.Equals(g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Id_TarifaPromocion_VentasCompras)).FirstOrDefault();
                        if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo != null)
                        {
                            mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cancelado = true;
                        }
                    }

                    //Buscar en el listado de g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS el que tiene promocion por unidad y desactivarlo
                    if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS != null &&
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Count > 0)
                    {
                        INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo = g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Where(m => m.Id.Equals(g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Id_TarifaPromocion_VentasCompras)).FirstOrDefault();
                        if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo != null)
                        {
                            mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cancelado = true;
                        }
                    }

                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_PromocionPorUnidad_Desactivar));
            }
        }

        public void Cambio_TipoCompraVenta(string _str_TipoCompraVenta_Opcion,
                                           long _lng_TipoCompraVenta_Id)
        {
            try
            {
                #region  Vaciar Variables
                //Tipo CompraVenta
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = "";
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = -1;

                //precio Final
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es==false)
                {
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = null;
                }

                //NumeroRedondeo
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = 3;

                //Listado de Tarifas/Promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = null;

                //Promocion por Unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Articulo_Id = -1;
                #endregion

                //Tipo CompraVenta
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion = _str_TipoCompraVenta_Opcion;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id = _lng_TipoCompraVenta_Id;

                //cantidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal = Calculo_Segun_TipoCompraVenta(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion,true);

                // Cantidad Secundaria
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id != null &&
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id.Value > -1)
                {
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria = Calculo_Segun_TipoCompraVenta(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion, true);
                }

                // Cargar Promociones y Tarifas Filtradas #########################################################################################
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();


                // Calcular el Precio Final #######################################################################################################
                AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio();
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;

                // Calcular las promocionesPorUnidad ##############################################################################################
                Calcular_PromocionesPorUnidad();
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_TipoCompraVenta));
            }
        }

        public void Cambio_TarifaPromocion(INTERNO_TarifaPromocion_VentasCompras_Modelo _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo)
        {
            try
            {
                #region  Vaciar Variables
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                {
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = null;
                }
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = 3;

                //Listado de Tarifas/Promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = null;

                //Promocion por Unidad
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                #endregion

                //cambio la NomenclaturaPrecio
                bool bol_CambioNomenclaturaPrecio = false;

                //Añadir o modificar tarifa y promociones
                if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo != null &&
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count > 0)
                {
                    INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA = g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => m.Id.Equals(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id)).FirstOrDefault();
                    if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA != null)
                    {
                        //Ver si cambio la NomenclaturaPrecio
                        if (
                                (
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA.TarifaPromocion_NomenclaturaPrecio_Id==null &&
                                    _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id!=null
                                ) 
                                ||
                                (
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA.TarifaPromocion_NomenclaturaPrecio_Id != null &&
                                    _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id == null
                                )
                                ||
                                (
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA.TarifaPromocion_NomenclaturaPrecio_Id != null &&
                                    _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id != null &&
                                    (!mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA.TarifaPromocion_NomenclaturaPrecio_Id.Value.Equals(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id.Value))
                                )
                            )
                        {
                            bol_CambioNomenclaturaPrecio = true;
                        }

                        //Actualizar el Listado
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo[g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.FindIndex(m => m.Id.Equals(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id))] = _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo;
                    }
                    else
                    {
                        //Añadir al Listado
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Add(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo);
                    }
                }
                else
                {
                    if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo == null)
                    {
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = new List<INTERNO_TarifaPromocion_VentasCompras_Modelo>();
                    }

                    //Añadir al Listado
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Add(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo);
                }

                //Order Listado
                Actualizar_Orden_TarifasPromociones(_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id, _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden,ref g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo);

                //Si cambio la Nomenclatura precio Actualizo los datos del embalaje principal
                if (bol_CambioNomenclaturaPrecio &&
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios == null)
                {
                    MAE_Articulos mdl_MAE_Articulos = Articulo_Obtener(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id);
                    if (mdl_MAE_Articulos != null)
                    {
                        MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes_PRINCIPAL = mdl_MAE_Articulos.MAE_Articulos_Embalajes.Where(x => x.fechaBorrado == null && x.esPrincipal).FirstOrDefault();
                        if (mdl_MAE_Articulos_Embalajes_PRINCIPAL != null)
                        {
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = mdl_MAE_Articulos_Embalajes_PRINCIPAL.idEmbalajePrincipal;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes.descripcion;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajePrincipal;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.operacion;

                            if (mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios != null &&
                                mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios.Count > 0)
                            {
                                //Listado de los precios de todas las nomenclaturas del embalaje principal del articulo
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios.ToList();

                                //Primero miro en el Historico de precios
                                decimal? dcm_Precio_SegunEmbalajePrincipal = PrecioHistorico_Obtener(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id, g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio.id, g_dtt_Fecha);
                                if (dcm_Precio_SegunEmbalajePrincipal != null)
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = dcm_Precio_SegunEmbalajePrincipal.Value;
                                }
                                else
                                {
                                    //precio por defecto de la nomenclatura por defecto
                                    MAE_Articulos_EmbalajesPrincipal_Precios mdl_MAE_Articulos_EmbalajesPrincipal_Precios = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios.Where(m => m.idNomenclaturaPrecio.Equals(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NomenclaturaPrecio.id)).FirstOrDefault();
                                    if (mdl_MAE_Articulos_EmbalajesPrincipal_Precios != null)
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = mdl_MAE_Articulos_EmbalajesPrincipal_Precios.precio;
                                    }
                                }
                            }

                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = mdl_MAE_Articulos_Embalajes_PRINCIPAL.idEmbalajeRelacional;
                            if (mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes1 != null)
                            {
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes1.descripcion;
                            }
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajeRelacional != null ? mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajeRelacional.Value : 1m;
                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_MAE_Articulos_Embalajes_PRINCIPAL.precio_Cantidad_SegundaUnidad != null ? mdl_MAE_Articulos_Embalajes_PRINCIPAL.precio_Cantidad_SegundaUnidad.Value : 0;
                        }
                    }
                }

                //Filtrado de tarifas y promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();

                // Calcular el Precio Final ##############################################################################################
                AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio();
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;

                // Calcular las promocionesPorUnidad ##############################################################################################
                Calcular_PromocionesPorUnidad();
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_TarifaPromocion));
            }
        }

        public void Cambio_TarifaPromocion_Borrar(List<long> _lst_id)
        {
            try
            {
                if (_lst_id != null)
                {
                    #region  Vaciar Variables
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                    {
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = null;
                    }
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = 3;

                    //Listado de Tarifas/Promociones
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = null;

                    //Promocion por Unidad
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                    #endregion

                    //Borrar registros del listado general
                    if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo != null &&
                       g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count > 0)
                    {
                        List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA = g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => _lst_id.Contains(m.Id)).ToList();
                        if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA != null && 
                            lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA.Count > 0)
                        {
                            foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_BUSQUEDA)
                            {
                                //Si tiene idTarifaPromocion o Id, no se borra se marca como desactivado
                                if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id>-1 ||
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Id>-1)
                                {
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Desactivado = true;
                                }
                                //Sino se borra
                                else
                                {
                                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Remove(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo);
                                }
                            }
                        }
                    }

                    //Order Listado
                    Actualizar_Orden_TarifasPromociones(-1, -1, ref g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo);

                    //Filtrado de taifas y promociones
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();

                    // Calcular el Precio Final ##############################################################################################
                    AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio();
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;

                    // Calcular las promocionesPorUnidad ##############################################################################################
                    Calcular_PromocionesPorUnidad();
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log(ex.Message, ex, nameof(VentasCompras_Calculos) + "/" + nameof(Cambio_TarifaPromocion_Borrar));
            }
        }

        #endregion

        #region Funciones Publicas
        public bool Codigo_Existe(string _str_Codigo,long? _lng_Id)
        {
            bool bol_CodigoRepetido = false; ;

            try
            {
                if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS != null)
                {
                    int int_Total = (from obj_INTERNO_TarifaPromocion_VentasCompras_Modelo in g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS
                                     where obj_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Codigo.Equals(_str_Codigo) &&
                                           (_lng_Id != null ? (!obj_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id.Equals(_lng_Id.Value)) : 1 == 1)
                                     select obj_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Codigo).Count();

                    if (int_Total > 0)
                    {
                        bol_CodigoRepetido = true;
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Codigo_Existe), true);
            }

            return bol_CodigoRepetido;
        }
        public INTERNO_ValorDevuelto_Modelo Codigo_BuscarSiguiente()
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                string str_CodigoSiguiente = "1";
                if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS != null &&
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Count > 0)
                {
                    int int_Codigo;

                    int int_Valor = (from obj_INTERNO_TarifasPromociones_Listado_Modelo in g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS
                                     where int.TryParse(obj_INTERNO_TarifasPromociones_Listado_Modelo.TarifaPromocion_Codigo, out int_Codigo)
                                     select Convert.ToInt32(obj_INTERNO_TarifasPromociones_Listado_Modelo.TarifaPromocion_Codigo)).Max();

                    str_CodigoSiguiente = (int_Valor + 1).ToString();
                }

                if (str_CodigoSiguiente.Length <= 10)
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.Objeto = str_CodigoSiguiente;
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_GENERAL_VALIDACIONES_CODIGOSIGUIENTE_LIMITEALCANZADO("Código");
                }
            }
            catch (Control_Errores ex)
            {
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = ex.g_str_MensajeError;
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Codigo_BuscarSiguiente));
                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_ERROR_BUSCARCODIGOSIGUIENTE();
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }
        
        public bool Validacion_ExisteYaTarifa(long? _lng_id)
        {
            bool bol_ValorDevuelto = false;

            if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS != null &&
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Count > 0)
            {
                if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Where(m => (m.Desactivado==null || m.Desactivado.Value==false) && m.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_TARIFA_CODIGO) && (_lng_id != null ? (!m.Id.Equals(_lng_id.Value)) : 1 == 1)).Count() > 0)
                {
                    bol_ValorDevuelto = true;
                }
            }

            return bol_ValorDevuelto;
        }

        public bool Validacion_ExistePrecio(long? _lng_id)
        {
            bool bol_ValorDevuelto = false;

            if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS != null &&
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Count > 0)
            {
                if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Where(m => (m.Desactivado == null || m.Desactivado.Value == false) &&  (_lng_id != null ? (!m.Id.Equals(_lng_id.Value)) : 1 == 1) && (m.TarifaPromocion_NomenclaturaPrecio_Id != null || m.TarifaPromocion_Precio != null)).Count() > 0)
                {
                    bol_ValorDevuelto = true;
                }
            }

            return bol_ValorDevuelto;
        }

        public bool Validacion_ExistePromocionPorUnidad(long? _lng_id)
        {
            bool bol_ValorDevuelto = false;

            //Ver si hay algun otra promocion por unidad en las lineas ya introducidas
            if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS != null &&
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Count > 0)
            {
                if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Where(m => (m.Desactivado == null || m.Desactivado.Value == false) && (_lng_id != null ? (!m.Id.Equals(_lng_id.Value)) : 1 == 1) && (m.TarifaPromocion_AB_Articulo_id != null || (m.TarifaPromocion_AB_Cantidad_A != null && m.TarifaPromocion_AB_Cantidad_A.Value > 0) || (m.TarifaPromocion_AB_Cantidad_B != null && m.TarifaPromocion_AB_Cantidad_B.Value > 0))).Count() > 0)
                {
                    bol_ValorDevuelto = true;
                }
            }

            return bol_ValorDevuelto;
        }

        public void CargaInicial(INTERNO_VentasCompras_Calculos_Modelo _mdl_INTERNO_VentasCompras_Calculos_Modelo,
                                 INTERNO_VentasCompras_Calculos_Modelo _mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD,
                                 List<INTERNO_TarifaPromocion_VentasCompras_Modelo> _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo)
        {
            try
            {
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo = _mdl_INTERNO_VentasCompras_Calculos_Modelo;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD = _mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD;
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo;

                // Filtrado de tarifas y promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(CargaInicial));
            }
        }

        public void CargaInicial(INTERNO_VentasCompras_Calculos_Modelo _mdl_INTERNO_VentasCompras_Calculos_Modelo,
                                 decimal? _dcm_PromocionPorUnidad_Cantidad_SegundaUnidad,
                                 List<INTERNO_TarifaPromocion_VentasCompras_Modelo> _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo)
        {
            try
            {
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo = _mdl_INTERNO_VentasCompras_Calculos_Modelo;
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo;

                // Filtrado de tarifas y promociones
                g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS = TarifasPromociones_Filtrar();

                // Calcular el Precio Final ##############################################################################################
                AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio();
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;

                // Calcular las promocionesPorUnidad ##############################################################################################
                Calcular_PromocionesPorUnidad();

                if (_dcm_PromocionPorUnidad_Cantidad_SegundaUnidad != null)
                {
                    //Actualizar la cantidad relacional
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria = Calculo_Segun_TipoCompraVenta(_dcm_PromocionPorUnidad_Cantidad_SegundaUnidad.Value, g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_TipoCompraVenta_Opcion, false);
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(CargaInicial));
            }
        }

        public INTERNO_ValorDevuelto_Modelo Agregar_TarifaPromocion_PorSeleccion(long _lng_idTarifaPromocion_Seleccionada)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                mdl_INTERNO_ValorDevuelto_Modelo = TarifasPromociones_Agregar(_lng_idTarifaPromocion_Seleccionada);
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Agregar_TarifaPromocion_PorSeleccion));
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        #endregion

        #region Articulo/ArticuloComodin/Embalaje
        private MAE_Articulos Articulo_Obtener(long _lng_idArticulo)
        {
            MAE_Articulos mdl_MAE_Articulos = null;
            try
            {
                // 1º cargar los datos del articulo seleccionado
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOS_OBTENER_MODELO_POR_ID_AUX1, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { _lng_idArticulo,true,true,true,true,true,true,true };

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_MAE_Articulos = (MAE_Articulos)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                //##################################################################################################################################################################################################
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Articulo_Obtener), true);
            }

            return mdl_MAE_Articulos;
        }

        private MAE_ArticulosComodin ArticuloComodin_Obtener(long _lng_idArticuloComodin)
        {
            MAE_ArticulosComodin mdl_MAE_ArticulosComodin = null;
            try
            {
                // 1º cargar los datos del articulo seleccionado
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOSCOMODIN_OBTENERMODELO_POR_ID_AUX1, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { _lng_idArticuloComodin,true,true,true ,true,true};

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_MAE_ArticulosComodin = (MAE_ArticulosComodin)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                //##################################################################################################################################################################################################
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(ArticuloComodin_Obtener), true);
            }

            return mdl_MAE_ArticulosComodin;
        }

        private List<MAE_Embalajes> Embalajes_Obtener()
        {
            List<MAE_Embalajes> lst_MAE_Embalajes = null;
            try
            {
                // 1º cargar los datos del articulo seleccionado
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEMBALAJES_OBTENERLISTADO, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = {};

                //Pasamos los parametros al metodo y lo ejecutamos
                lst_MAE_Embalajes = (List<MAE_Embalajes>)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);

                //ORDENAR POR CODIGO
                if (lst_MAE_Embalajes!=null && lst_MAE_Embalajes.Count > 0)
                {
                    lst_MAE_Embalajes = lst_MAE_Embalajes.OrderBy(m => m.codigo).ToList();
                }
                //##################################################################################################################################################################################################
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Embalajes_Obtener), true);
            }

            return lst_MAE_Embalajes;
        }
        #endregion

        #region Precio Historico
        private decimal? PrecioHistorico_Obtener(long _lng_idArticulo,long _lng_idNomenclaturaPrecio,DateTime _dtt_Fecha)
        {
            decimal? dcm_Precio= null;
            try
            {
                // 1º cargar los datos del articulo seleccionado
                //Cargamos el ensamblado #########################################################################################################################################################################
                Assembly m_assembly_1 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_1 = m_assembly_1.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_1 = Activator.CreateInstance(m_type_1);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_1 = obj_Clase_1.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAEARTICULOSEMBALAJESPRINCIPALPRECIOSHISTORICO_OBTENER, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_1 = { _lng_idArticulo, _lng_idNomenclaturaPrecio, _dtt_Fecha };

                //Pasamos los parametros al metodo y lo ejecutamos
                MAE_Articulos_EmbalajesPrincipal_Precios_Historico mdl_MAE_Articulos_EmbalajesPrincipal_Precios_Historico = (MAE_Articulos_EmbalajesPrincipal_Precios_Historico)obj_MethodInfo_1.Invoke(obj_Clase_1, arr_Parametros_1);
                //##################################################################################################################################################################################################

                if (mdl_MAE_Articulos_EmbalajesPrincipal_Precios_Historico != null)
                {
                    dcm_Precio=mdl_MAE_Articulos_EmbalajesPrincipal_Precios_Historico.precio;
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(PrecioHistorico_Obtener), true);
            }

            return dcm_Precio;
        }
        #endregion

        private decimal Calcular_Cantidad_A_EmbalajePrincipal()
        {
            decimal dcm_Cantidad_Final = 1m;

            try
            {
                //Si el precio es por la cantidad secundaria, se tiene que coger la cantidad secundaria para hacer los calculos
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad.Equals(1))
                {
                    //Esta en el Embalaje secundario
                    if (!g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id.Equals(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id))
                    {
                        //Si el embalaje principal es relacional 
                        if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id != null)
                        {
                            dcm_Cantidad_Final = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria;
                        }
                        //Si el embalaje principal no es relacional 
                        {
                            //Calculo cual es el valor estimado de la cantidad secundaria del embalaje principal
                            decimal dcm_CantidadRelacionalEstimada = 0m;
                            //Multiplicar (se divide)
                            if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Codigo))
                            {
                                dcm_CantidadRelacionalEstimada = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion / g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion;
                            }
                            //Dividir( se multiplica)
                            else
                            {
                                dcm_CantidadRelacionalEstimada = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion;
                            }

                            //calculo
                            dcm_Cantidad_Final = Funciones.RedondearDecimal(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria / dcm_CantidadRelacionalEstimada, 3);
                        }
                    }
                    //Esta en el embalaje principal
                    else
                    {
                        dcm_Cantidad_Final = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria;
                    }
                }
                //Se coge la cantidad principal
                else
                {
                    //Esta en el Embalaje secundario
                    if (!g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id.Equals(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id))
                    {
                        //Multiplicar 
                        if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Codigo))
                        {
                            dcm_Cantidad_Final = Funciones.RedondearDecimal(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal, 3);
                        }
                        //Dividir
                        else
                        {
                            dcm_Cantidad_Final = Funciones.RedondearDecimal(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion / g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal, 3);
                        }
                    }
                    //Esta en el embalaje principal
                    else
                    {
                        dcm_Cantidad_Final = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal;
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "" + nameof(Calcular_Cantidad_A_EmbalajePrincipal));
            }

            return dcm_Cantidad_Final;
        }

        #region Obtencion de las tarifas y promociones que se van a utilizar

        private List<INTERNO_TarifaPromocion_VentasCompras_Modelo> TarifasPromociones_Obtener_Desde_BaseDatos(long _lng_idArticulo)
        {
            List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = new List<INTERNO_TarifaPromocion_VentasCompras_Modelo>();

            try
            {
                //Obtener las Tarifas y promociones segun Proveedor ######################################################################################################################
                //Cargamos el ensamblado
                Assembly m_assembly_2 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_2 = m_assembly_2.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_2 = Activator.CreateInstance(m_type_2);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_2 = obj_Clase_2.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_ARTICULO_TARIFASPROMOCIONES, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_2 = {   g_int_Tipo_ClienteProveedor,
                                                _lng_idArticulo,
                                                g_lng_idClienteProveedor,
                                                g_lng_idEmpresa,
                                                g_dtt_Fecha
                                            };

                //Pasamos los parametros al metodo y lo ejecutamos
                lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = (List<INTERNO_TarifaPromocion_VentasCompras_Modelo>)obj_MethodInfo_2.Invoke(obj_Clase_2, arr_Parametros_2);
                //#######################################################################################################################

                //Asignarle los Ids
                if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo!=null && 
                    lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count>0)
                {
                    long lng_Id = -1;
                    foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in lst_INTERNO_TarifaPromocion_VentasCompras_Modelo)
                    {
                        mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id = lng_Id;

                        lng_Id -= 1;
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }

            return lst_INTERNO_TarifaPromocion_VentasCompras_Modelo;
        }

        private INTERNO_ValorDevuelto_Modelo TarifasPromociones_Agregar(long _lng_idTarifaPromocion_Seleccionada)
        {
            INTERNO_ValorDevuelto_Modelo mdl_INTERNO_ValorDevuelto_Modelo = new INTERNO_ValorDevuelto_Modelo();
            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = true;

            try
            {
                INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo = null;

                #region Buscar la Tarifa/Promocion
                //Obtener las Tarifas y promociones ######################################################################################################################
                //Cargamos el ensamblado
                Assembly m_assembly_2 = Assembly.LoadFrom(Variables.G_STR_LIBRERIA_RUTAINICIAL + @"\" + Variables.G_STR_LIBRERIA_MAESTROS + ".dll");
                //Obtenemos el tipo de la clase
                Type m_type_2 = m_assembly_2.GetType("" + Variables.G_STR_LIBRERIA_MAESTROS + "." + Variables.G_STR_LIBRERIA_DATOSMAESTROS);
                //creamos la instancia
                var obj_Clase_2 = Activator.CreateInstance(m_type_2);
                //Cargamos el metodo solicitado
                MethodInfo obj_MethodInfo_2 = obj_Clase_2.GetType().GetMethod(Variables.G_STR_LIBRERIA_DATOSMAESTROS_PROCEDIMIENTO_MAETARIFASPROMOCIONES_OBTENER_POR_ID, BindingFlags.Instance | BindingFlags.NonPublic);

                //Obtener valores
                object[] arr_Parametros_2 = {   _lng_idTarifaPromocion_Seleccionada};

                //Pasamos los parametros al metodo y lo ejecutamos
                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo = (INTERNO_TarifaPromocion_VentasCompras_Modelo)obj_MethodInfo_2.Invoke(obj_Clase_2, arr_Parametros_2);
                //#######################################################################################################################

                #endregion

                #region Validar
                if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo != null)
                {
                    //Comprobar si es tarifa y hay alguna tarifa ya en el listado
                    if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_TARIFA_CODIGO))
                    {
                        if (Validacion_ExisteYaTarifa(null))
                        {
                            mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                            mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TARIFASPROMOCIONES_VALIDACIONES_YAEXITE_TARIFA();
                        }
                    }
                    
                    //validar que solo 1 registro del listado puede tener precio
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Ver si esta relleno el precio
                        if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio!=null ||
                            mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id!=null)
                        {
                            //Ver si hay algun otro precio en las lineas ya introducidas
                            if (Validacion_ExistePrecio(null))
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TARIFASPROMOCIONES_VALIDACIONES_YAEXISTE_REGISTROCONPRECIO();
                            }
                        }
                    }

                    //validar que solo 1 registro del listado puede tener promociones por unidades
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        //Solo si es promocion
                        if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_PROMOCIONES_CODIGO))
                        {
                            //Ver si esta relleno el promociones por unidad
                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A!=null ||
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B != null ||
                               mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id != null )
                            {
                                //Ver si hay algun otra promocion por unidad en las lineas ya introducidas
                                if (Validacion_ExistePromocionPorUnidad(null))
                                {
                                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TARIFASPROMOCIONES_VALIDACIONES_YAEXISTE_REGISTROPROMOCIONUNIDADES();
                                }
                            }
                        }
                    }

                    //Si tiene ArticuloComodin, no se puede agregar un Tarifa 
                    //Las promociones se quita el precio fijo y dinamico y la nomenclaturaprecio
                    if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                    {
                        if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es)
                        {
                            //Si es una tarifa la quito
                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_TARIFA_CODIGO))
                            {
                                mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                                mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_TARIFASPROMOCIONES_VALIDACIONES_ARTICULOCOMODIN_NOPUEDETENERTARIFAS();
                            }

                            if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                            {
                                //Quitar los precios
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id = null;
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio = null;
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_PrecioFijoDinamico = Variables.G_INT_TIPOPRECIO_FIJO_CODIGO;

                                //Si tiene Promocion por unidad y no tiene un articulo seleccionado se quita
                                if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A!=null &&
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A.Value!=0m &&
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id==null)
                                {
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_Codigo = "";
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_Descripcion = "";
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_FechaBorrado = null;
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id = null;
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cancelado = false;
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A = null;
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B = null;
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_Codigo = "";
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_Descripcion = "";
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_FechaBorrado = null;
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id = null;
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje = null;
                                }
                            }
                        }
                    }
                }
                else
                {
                    mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto = false;
                    mdl_INTERNO_ValorDevuelto_Modelo.Mensaje = Mensajes.G_STR_MENSAJES_GENERAL_NOENCUENTRAREGISTRO();
                }
                #endregion

                //Si esta todo Correcto continuo
                if (mdl_INTERNO_ValorDevuelto_Modelo.TodoCorrecto)
                {
                    //Si ya hay registros
                    int int_Orden = 1;
                    long lng_Id = -1;
                    if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo!=null &&
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count>0)
                    {
                        //Id
                        long lng_IDAuxiliar = g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Min(m => m.Id) - 1;
                        if (lng_IDAuxiliar < 0)
                        {
                            lng_Id = lng_IDAuxiliar;
                        }

                        //Orden
                        int_Orden = g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Max(m => m.Orden) + 1;
                    }

                    //Id
                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id = lng_Id;
                    //TarifaPromocion_Id
                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Id = -1;
                    //LibreObligatorio
                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.LibreObligatorio = null;
                    //NoAplicarTarifa
                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.NoAplicarTarifa = false;
                    //Mensaje_Error
                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Mensaje_Error = "";
                    //Modificable
                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Modificable =true;
                    //Desactivado
                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Desactivado = false;
                    //Orden
                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden = int_Orden;


                    //Agregar la tarifa/promocion
                    Cambio_TarifaPromocion(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo);
                }
            }
            catch (Control_Errores)
            {}
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(TarifasPromociones_Agregar));
            }

            return mdl_INTERNO_ValorDevuelto_Modelo;
        }

        private List<INTERNO_TarifaPromocion_VentasCompras_Modelo> TarifasPromociones_Filtrar()
        {
            List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FINAL = new List<INTERNO_TarifaPromocion_VentasCompras_Modelo>();

            try
            {
                if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo != null &&
                    g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count > 0)
                {
                    //Obtener cantidad SEGUN EMBLAJE PRINCIPAL
                    decimal dcm_Cantidad= Calcular_Cantidad_A_EmbalajePrincipal();

                    if (dcm_Cantidad<0)
                    {
                        dcm_Cantidad = dcm_Cantidad * -1;
                    }

                    //Quitar tarifas y promociones fecha Boryado
                    List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => m.TarifaPromocion_FechaBorrado == null).ToList();



                    //Si la opcion es 1,5,6 o 7 no tiene promociones ....................................................
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_1.Codigo) ||
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_5.Codigo) ||
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_6.Codigo) ||
                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_7.Codigo))
                    {
                        //Dejamos solo la Tarifa
                        if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo != null &&
                            lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count > 0)
                        {
                            lst_INTERNO_TarifaPromocion_VentasCompras_Modelo = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => m.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_TARIFA_CODIGO)).ToList();
                        }   
                    }
                    //..................................................................................................

                    //Recorrer las Tarifas y las promociones
                    if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo != null &&
                        lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count > 0)
                    {
                        bool bol_HayPromocion_ConPrecio = false;
                        bool bol_HayPromocion_ConPromocionUnidades = false;
                        bool? bol_NoAplicarTarifa = false;

                        // ### 1º BUSCAR TODAS LAS PROMOCIONES ####################################################################################################################
                        List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_Promociones = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => m.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_PROMOCIONES_CODIGO)).ToList();
                        if (lst_Promociones != null && 
                            lst_Promociones.Count > 0)
                        {
                            bool bol_TienePrecio = false;
                            bool bol_TienePromocionUnidades = false;
                            bool bol_Agregarlo = false;

                            int int_Orden = 1;

                            foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in lst_Promociones.OrderBy(m=>m.Orden))
                            {
                                bol_TienePrecio = false;
                                bol_TienePromocionUnidades = false;
                                bol_Agregarlo = true;

                                #region Verificar Condicionantes
                                if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes!=null &&
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes.Count>0)
                                {
                                    foreach (INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo in mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Condicionantes)
                                    {
                                        //Si tienen valor DESDE Y HASTA
                                        if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor!=null &&
                                            mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor!=null)
                                        {
                                            #region DESDE ...
                                            bool bol_Desde = true;
                                            //Mayor A
                                            if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MAYORA.Codigo))
                                            {
                                                //Si no es mayor se marca como que no se agrega
                                                if (dcm_Cantidad<= mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Desde = false;
                                                }
                                            }
                                            //MAYOR IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MAYORIGUALA.Codigo))
                                            {
                                                //Si no es mayor o igual se marca como que no se agrega
                                                if (dcm_Cantidad < mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Desde = false;
                                                }
                                            }
                                            //MENOR A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MENORA.Codigo))
                                            {
                                                //Si no es menor se marca como que no se agrega
                                                if (dcm_Cantidad >= mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Desde = false;
                                                }
                                            }
                                            //MENOR IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MENORIGUALA.Codigo))
                                            {
                                                //Si no es menor o igual se marca como que no se agrega
                                                if (dcm_Cantidad > mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Desde = false;
                                                }
                                            }
                                            //IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_IGUALA.Codigo))
                                            {
                                                //Si no es igual se marca como que no se agrega
                                                if (dcm_Cantidad != mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Desde = false;
                                                }
                                            }
                                            //NO IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_NOIGUALA.Codigo))
                                            {
                                                //Si es igual se marca como que no se agrega
                                                if (dcm_Cantidad == mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Desde = false;
                                                }
                                            }
                                            #endregion


                                            #region HASTA ...
                                            bool bol_Hasta = true;
                                            //Mayor A
                                            if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MAYORA.Codigo))
                                            {
                                                //Si no es mayor se marca como que no se agrega
                                                if (dcm_Cantidad <= mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Hasta = false;
                                                }
                                            }
                                            //MAYOR IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MAYORIGUALA.Codigo))
                                            {
                                                //Si no es mayor o igual se marca como que no se agrega
                                                if (dcm_Cantidad < mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Hasta = false;
                                                }
                                            }
                                            //MENOR A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MENORA.Codigo))
                                            {
                                                //Si no es menor se marca como que no se agrega
                                                if (dcm_Cantidad >= mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Hasta = false;
                                                }
                                            }
                                            //MENOR IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MENORIGUALA.Codigo))
                                            {
                                                //Si no es menor o igual se marca como que no se agrega
                                                if (dcm_Cantidad > mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Hasta = false;
                                                }
                                            }
                                            //IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_IGUALA.Codigo))
                                            {
                                                //Si no es igual se marca como que no se agrega
                                                if (dcm_Cantidad != mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Hasta = false;
                                                }
                                            }
                                            //NO IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_NOIGUALA.Codigo))
                                            {
                                                //Si es igual se marca como que no se agrega
                                                if (dcm_Cantidad == mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Hasta = false;
                                                }
                                            }
                                            #endregion

                                            if (bol_Desde==false || bol_Hasta==false)
                                            {
                                                bol_Agregarlo = false;
                                            }
                                        }
                                        //Solo tiene valor DESDE
                                        else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor != null)
                                        {
                                            #region DESDE ...
                                            //Mayor A
                                            if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MAYORA.Codigo))
                                            {
                                                //Si no es mayor se marca como que no se agrega
                                                if (dcm_Cantidad <= mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //MAYOR IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MAYORIGUALA.Codigo))
                                            {
                                                //Si no es mayor o igual se marca como que no se agrega
                                                if (dcm_Cantidad < mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //MENOR A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MENORA.Codigo))
                                            {
                                                //Si no es menor se marca como que no se agrega
                                                if (dcm_Cantidad >= mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //MENOR IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MENORIGUALA.Codigo))
                                            {
                                                //Si no es menor o igual se marca como que no se agrega
                                                if (dcm_Cantidad > mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_IGUALA.Codigo))
                                            {
                                                //Si no es igual se marca como que no se agrega
                                                if (dcm_Cantidad != mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //NO IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_NOIGUALA.Codigo))
                                            {
                                                //Si es igual se marca como que no se agrega
                                                if (dcm_Cantidad == mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Desde_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            #endregion
                                        }
                                        //Solo tiene valor HASTA
                                        else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor != null)
                                        {
                                            #region HASTA ...
                                            //Mayor A
                                            if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MAYORA.Codigo))
                                            {
                                                //Si no es mayor se marca como que no se agrega
                                                if (dcm_Cantidad <= mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //MAYOR IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MAYORIGUALA.Codigo))
                                            {
                                                //Si no es mayor o igual se marca como que no se agrega
                                                if (dcm_Cantidad < mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //MENOR A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MENORA.Codigo))
                                            {
                                                //Si no es menor se marca como que no se agrega
                                                if (dcm_Cantidad >= mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //MENOR IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_MENORIGUALA.Codigo))
                                            {
                                                //Si no es menor o igual se marca como que no se agrega
                                                if (dcm_Cantidad > mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_IGUALA.Codigo))
                                            {
                                                //Si no es igual se marca como que no se agrega
                                                if (dcm_Cantidad != mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            //NO IGUAL A
                                            else if (mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Operador.Equals(Variables.G_MDL_INTERNO_CODIGODESCRIPCION_TIPOBUSQUEDA_NUMERICA_NOIGUALA.Codigo))
                                            {
                                                //Si es igual se marca como que no se agrega
                                                if (dcm_Cantidad == mdl_INTERNO_TarifaPromocion_CompraVenta_Condicionantes_Modelo.Condicionante_Cantidad_Hasta_Valor.Value)
                                                {
                                                    bol_Agregarlo = false;
                                                }
                                            }
                                            #endregion
                                        }

                                        //Si no se agrega se sale del bucle
                                        if (bol_Agregarlo==false)
                                        {
                                            break;
                                        }
                                    }
                                }
                                #endregion

                                if (bol_Agregarlo)
                                {
                                    //Ver si tiene precio 
                                    if ((mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio != null ||
                                         mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id != null))
                                    {
                                        bol_TienePrecio = true;
                                    }

                                    //Ver si promociones por unidad
                                    if ((mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A != null &&
                                         mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B != null))
                                    {
                                        bol_TienePromocionUnidades = true;
                                    }

                                    //Si ya hay una promocion cogida con 'precio' y esta tiene 'precio' no se coge
                                    if (bol_HayPromocion_ConPrecio && bol_TienePrecio)
                                    {
                                        bol_Agregarlo = false;
                                    }
                                    else
                                    {
                                        //Si ya hay una promocion cogida con 'promocion por unidades' y esta tiene 'promocion por unidades' no se coge
                                        if (bol_HayPromocion_ConPromocionUnidades && bol_TienePromocionUnidades)
                                        {
                                            bol_Agregarlo = false;
                                        }
                                        else
                                        {
                                            bol_Agregarlo = true;
                                        }
                                    }

                                    //Agregarlo
                                    if (bol_Agregarlo)
                                    {
                                        //NoAplicar tarifa
                                        bol_NoAplicarTarifa = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.NoAplicarTarifa;

                                        //Orden
                                        mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden = int_Orden;
                                        //Modificable
                                        mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Modificable = true;

                                        //Agregarlo al Listado
                                        lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FINAL.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo);

                                        //Sumo 1 al orden para el siguiente
                                        int_Orden += 1;
                                    }
                                }
                            }
                        }
                        //###########################################################################################################################################################################


                        // ### 2º BUSCAR TARIFA SI NO TIENE PRECIO YA ##################################################################################################################################
                        if (bol_HayPromocion_ConPrecio == false)
                        {
                            //AÑADIR TARIFA ACTIVA
                            INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => m.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_TARIFA_CODIGO) &&
                                                                                                                                                                                               (m.Desactivado == null || m.Desactivado.Value == false) &&
                                                                                                                                                                                                (
                                                                                                                                                                                                    m.TarifaPromocion_NomenclaturaPrecio_Id != null ||
                                                                                                                                                                                                    m.TarifaPromocion_Precio != null
                                                                                                                                                                                                )
                                                                                                                                                                                        )
                                                                                                                                                                                    .FirstOrDefault();
                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA != null)
                            {
                                //orden
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA.Orden = 1;

                                //Si la promocion dice que no se aplica tarifa, se marca como desactivada
                                if (bol_NoAplicarTarifa != null && bol_NoAplicarTarifa.Value)
                                {
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA.Desactivado = true;
                                }

                                //Modificable
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA.Modificable = true;

                                //Agregarlo al Listado
                                lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FINAL.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA);
                            }

                            //AÑADIR TARIFAS DESACTIVADAS
                            List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA = lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => m.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_TARIFA_CODIGO) &&
                                                                                                                                                                                                                           (m.Desactivado != null && m.Desactivado.Value) &&
                                                                                                                                                                                                                           (
                                                                                                                                                                                                                              m.TarifaPromocion_NomenclaturaPrecio_Id != null ||
                                                                                                                                                                                                                              m.TarifaPromocion_Precio != null
                                                                                                                                                                                                                           )
                                                                                                                                                                                                                   )
                                                                                                                                                                                                             .ToList();
                            if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA != null &&
                                lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA.Count > 0)
                            { 
                                foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA)
                                {
                                    //orden
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden = 1;

                                    //descativado
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Desactivado = true;

                                    //Modificable
                                    mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Modificable = true;

                                    //Agregarlo al Listado
                                    lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FINAL.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo);
                                }
                            }
                        }
                        //###########################################################################################################################################################################
                    }
                }

                //ORDENAR EL LISTADO #################################################################################################################################################
                if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FINAL != null &&
                    lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FINAL.Count > 0)
                {
                    // 1º Si tuviera alguna tarifa
                    // 2º Si no tuviera tarifa la promocion que tuviera precio 
                    // 3º El resto de las promociones segun su orden
                    Actualizar_Orden_TarifasPromociones(-1, -1, ref lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FINAL);
                }
                //###########################################################################################################################################################################

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

            return lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FINAL;
        }

        private void Actualizar_Orden_TarifasPromociones(long _lng_id, int _int_Orden, ref List<INTERNO_TarifaPromocion_VentasCompras_Modelo> _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo)
        {
            try
            {
                if (_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo != null &&
                    _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count > 0)
                {

                    //Sumar 1 a los registros que tengan el mismo orden que el actual
                    if (_int_Orden>-1)
                    {
                        _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => (!m.Id.Equals(_lng_id)) && m.Orden >= _int_Orden).ToList().ForEach(m => m.Orden += 1);
                    }

                    //ORDENAR EL LISTADO 
                    if (_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo != null &&
                        _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count > 0)
                    {
                        // 1º Si tuviera alguna tarifa
                        // 2º Si no tuviera tarifa la promocion que tuviera precio 
                        // 3º El resto de las promociones segun su orden

                        int int_Orden_FINAL = 1;
                        List<long> lst_idTarifaPromocion_Utilizados = new List<long>();

                        //Ordenar Tarifas
                        List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA = _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => m.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_TARIFA_CODIGO)).ToList();
                        if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA != null &&
                            lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA.Count > 0)
                        {
                            foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_TARIFA)
                            {
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden = int_Orden_FINAL;

                                //Id ya utilizado
                                lst_idTarifaPromocion_Utilizados.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id);

                                //Aumentamos el Orden
                                int_Orden_FINAL += 1;
                            }
                        }

                        //Ordenar promocion con precio
                        List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCION_CONPRECIO = _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => m.TarifaPromocion_Tipo.Equals(Variables.G_INT_TIPO_TARIFAPROMOCION_PROMOCIONES_CODIGO) &&
                                                                                                                                                                                                                        (m.TarifaPromocion_Precio != null || m.TarifaPromocion_NomenclaturaPrecio_Id != null)
                                                                                                                                                                                                                )
                                                                                                                                                                                                            .ToList();
                        if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCION_CONPRECIO != null &&
                            lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCION_CONPRECIO.Count > 0)
                        {
                            foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_PROMOCION_CONPRECIO)
                            {
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden = int_Orden_FINAL;
                              
                                //Id ya utilizado
                                lst_idTarifaPromocion_Utilizados.Add(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id);

                                //Aumentamos el Orden
                                int_Orden_FINAL += 1;
                            }
                        }

                        //Ordenar el Resto
                        List<INTERNO_TarifaPromocion_VentasCompras_Modelo> lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_RESTOPROMOCIONES = _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => !lst_idTarifaPromocion_Utilizados.Contains(m.Id)).ToList();
                        if (lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_RESTOPROMOCIONES.Count > 0)
                        {
                            foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_RESTOPROMOCIONES.OrderBy(m => m.Orden))
                            {

                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Orden = int_Orden_FINAL;
                               
                                //Aumentamos el Orden
                                int_Orden_FINAL += 1;

                            }
                        }
                    }
                }
            }
            catch (Control_Errores)
            { }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Actualizar_Orden_TarifasPromociones));
            }
        }
        #endregion

        #region Precio e Importe
        private AUX_PrecioNumeroredondeo_Modelo Calcular_Precio()
        {
            return Calcular_Precio( g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_precio,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Id,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_Relacion,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final,
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id);
        }
        private AUX_PrecioNumeroredondeo_Modelo Calcular_Precio(List<INTERNO_TarifaPromocion_VentasCompras_Modelo> _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo,
                                                                long _lng_EmbalajePrincipalDelArticulo_Embalaje_Id,
                                                                long? _lng_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id,
                                                                int _int_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                decimal _dcm_EmbalajePrincipalDelArticulo_precio,
                                                                long _lng_Embalaje_Id,
                                                                decimal _dcm_Embalaje_Relacion,
                                                                string _str_Embalaje_Operacion,
                                                                long? _lng_EmbalajeSegundaUnidad_Id,
                                                                decimal _dcm_EmbalajeSegundaUnidad_Relacion,
                                                                int _int_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                decimal? _dcm_Precio_Final,
                                                                long _lng_idArticulo)
        {
            AUX_PrecioNumeroredondeo_Modelo mdl_INTERNO_PrecioNumeroredondeo_Modelo = new AUX_PrecioNumeroredondeo_Modelo();
            mdl_INTERNO_PrecioNumeroredondeo_Modelo.NumeroRedondeo = 3;
            mdl_INTERNO_PrecioNumeroredondeo_Modelo.Precio = 0;

            //Ordern de obtencion de precio
            //1º Promocion o Tarifa
            //2º Historico de precios
            //3º datos del Articulo

            try
            {
                // ##### 1º OBTENCION Y CALCULO DEL PRECIO ####################################################################################### 
                decimal? dcm_Precio = null;
                long? lng_IdTarifaPromocion_Aplicada = null;

                //Si n es Articulo Comodin
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                {
                    //Obtener le precio Inicial
                    if (_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo != null &&
                        _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Count > 0)
                    {
                        //Obtener Promocion o Tarifa con Precio
                        INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo = _lst_INTERNO_TarifaPromocion_VentasCompras_Modelo.Where(m => (m.Desactivado == null || m.Desactivado.Value == false) && m.TarifaPromocion_Precio != null || m.TarifaPromocion_NomenclaturaPrecio_Id != null).FirstOrDefault();
                        if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo != null)
                        {
                            decimal? dcm_Precio_SegunEmbalajePrincipal = null;

                            //Precio Fijo
                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio != null &&
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio.Value != 0m)
                            {
                                dcm_Precio_SegunEmbalajePrincipal = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Precio.Value;
                            }
                            //Precio Dinamico
                            else if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id != null)
                            {
                                //Primero Tiro del Historico
                                dcm_Precio_SegunEmbalajePrincipal = PrecioHistorico_Obtener(_lng_idArticulo, mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id.Value, g_dtt_Fecha);

                                if (dcm_Precio_SegunEmbalajePrincipal == null)
                                {
                                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios != null &&
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios.Count > 0)
                                    {
                                        //Obtener precio segun nomenclatura
                                        MAE_Articulos_EmbalajesPrincipal_Precios mdl_MAE_Articulos_EmbalajesPrincipal_Precios = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipal_Precios.Where(m => m.idNomenclaturaPrecio.Equals(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NomenclaturaPrecio_Id.Value)).FirstOrDefault();
                                        if (mdl_MAE_Articulos_EmbalajesPrincipal_Precios != null)
                                        {
                                            dcm_Precio_SegunEmbalajePrincipal = mdl_MAE_Articulos_EmbalajesPrincipal_Precios.precio;
                                        }
                                    }
                                }
                            }

                            //Aplicar la TarifaPromocion al precio Obtenido
                            if (dcm_Precio_SegunEmbalajePrincipal != null &&
                                dcm_Precio_SegunEmbalajePrincipal.Value != 0m)
                            {
                                //Calcular el precio Segun Embalaje seleccionado
                                dcm_Precio_SegunEmbalajePrincipal = Calcular_Precio_SegunEmbalajePrincipal(dcm_Precio_SegunEmbalajePrincipal,
                                                                                                            _lng_EmbalajePrincipalDelArticulo_Embalaje_Id,
                                                                                                            _lng_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id,
                                                                                                            _int_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                                                            _dcm_EmbalajePrincipalDelArticulo_precio,
                                                                                                            _dcm_Embalaje_Relacion,
                                                                                                            _str_Embalaje_Operacion,
                                                                                                            _lng_EmbalajeSegundaUnidad_Id,
                                                                                                            _dcm_EmbalajeSegundaUnidad_Relacion,
                                                                                                            _int_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad);

                                dcm_Precio = Aplicar_Descuentos_PrecioImporte(dcm_Precio_SegunEmbalajePrincipal.Value, true, mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo);

                                //Numero de Redondeo
                                if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NumeroRedondeo != null)
                                {
                                    mdl_INTERNO_PrecioNumeroredondeo_Modelo.NumeroRedondeo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_NumeroRedondeo.Value;
                                }

                                //Almacenar el Idtarifapromocion Aplicada
                                lng_IdTarifaPromocion_Aplicada = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Id;
                            }
                        }
                    }
                }

                //Si el precio es nulo, significa que no hay ninguna tarifa ni promocion con precio,
                //Por lo tanto si el precio general fuera distinto de nulo se pondria como precio
                if (_dcm_Precio_Final!=null)
                {
                    dcm_Precio = _dcm_Precio_Final.Value;
                }


                //Si no hay en tarifa y promociones, 
                //se busca en el articulo el precio para la Nomenclatura por defecto, segun el embalaje
                //Si n es Articulo Comodin
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_ArticuloComodin_Es == false)
                {
                    if (dcm_Precio == null)
                    {
                        if (_lng_Embalaje_Id > -1)
                        {
                            //Tiene Embalaje principal
                            if (_lng_EmbalajePrincipalDelArticulo_Embalaje_Id > -1)
                            {
                                //Si el embalaje principal es igual al selccionado, se pone el precio sin hacer calculos
                                if (_lng_EmbalajePrincipalDelArticulo_Embalaje_Id.Equals(_lng_Embalaje_Id))
                                {
                                    dcm_Precio = _dcm_EmbalajePrincipalDelArticulo_precio;
                                }
                                //Se calcula el precio, segun el embalaje principal
                                else
                                {
                                    dcm_Precio = Calcular_Precio_SegunEmbalajePrincipal(null,
                                                                                        _lng_EmbalajePrincipalDelArticulo_Embalaje_Id,
                                                                                        _lng_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id,
                                                                                        _int_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                                        _dcm_EmbalajePrincipalDelArticulo_precio,
                                                                                        _dcm_Embalaje_Relacion,
                                                                                        _str_Embalaje_Operacion,
                                                                                        _lng_EmbalajeSegundaUnidad_Id,
                                                                                        _dcm_EmbalajeSegundaUnidad_Relacion,
                                                                                        _int_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad);
                                }
                            }
                            else
                            {
                                dcm_Precio = null;
                            }
                        }
                    }
                }

                // #### PRECIO FINAL ###########################################################
                if (dcm_Precio != null)
                {
                    //Asignar al precio Final
                    mdl_INTERNO_PrecioNumeroredondeo_Modelo.Precio = Funciones.RedondearDecimal(dcm_Precio.Value, mdl_INTERNO_PrecioNumeroredondeo_Modelo.NumeroRedondeo);
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Calcular_Precio), true);
            }

            return mdl_INTERNO_PrecioNumeroredondeo_Modelo;
        }

        private decimal Calcular_Precio_SegunEmbalajePrincipal(decimal? _dcm_Precio_Recibido,
                                                               long _lng_EmbalajePrincipalDelArticulo_Embalaje_Id,
                                                               long? _lng_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id,
                                                               int _int_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                               decimal _dcm_EmbalajePrincipalDelArticulo_precio,
                                                               decimal _dcm_Embalaje_Relacion,
                                                               string _str_Embalaje_Operacion,
                                                               long? _lng_EmbalajeSegundaUnidad_Id ,
                                                               decimal _dcm_EmbalajeSegundaUnidad_Relacion ,
                                                               int _int_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad )
        {
            decimal dcm_Precio_Final = 0m;

            try
            {
                if (_lng_EmbalajePrincipalDelArticulo_Embalaje_Id >-1)
                {
                    
                    //precios del embalaje principal ---------------------------------------------------------------------------------------
                    if (_dcm_Precio_Recibido == null)
                    {
                        _dcm_Precio_Recibido = _dcm_EmbalajePrincipalDelArticulo_precio;
                    }
                    //-----------------------------------------------------------------------------------------------------------------------

                    if (_dcm_Precio_Recibido != null)
                    {
                        //Si el embalaje principal es relacional y tiene precio por segunda unidad se pone el mismo precio que el embalaje principal
                        if (_lng_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id != null &&
                            _int_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad == 1)
                        {
                            dcm_Precio_Final = _dcm_Precio_Recibido.Value;
                        }
                        //Si el embalaje secundario es relacional y se calcula el precio por 2 Unidad
                        else if (_lng_EmbalajeSegundaUnidad_Id != null &&
                                 _int_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad == 1)
                        {
                            dcm_Precio_Final = (_dcm_Precio_Recibido.Value / _dcm_EmbalajeSegundaUnidad_Relacion) * _dcm_Embalaje_Relacion;
                        }
                        else
                        {
                            decimal dcm_Cantidad_Calculo = _dcm_Embalaje_Relacion;

                            if (dcm_Cantidad_Calculo != 0)
                            {
                                //Dividir
                                if (_str_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_DIVIDIR.Codigo))
                                {
                                    dcm_Precio_Final = _dcm_Precio_Recibido.Value / dcm_Cantidad_Calculo;
                                }
                                //Multiplicar
                                else
                                {
                                    dcm_Precio_Final = _dcm_Precio_Recibido.Value * dcm_Cantidad_Calculo;
                                }
                            }
                            else
                            {
                                dcm_Precio_Final = _dcm_Precio_Recibido.Value;
                            }
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Calcular_Precio_SegunEmbalajePrincipal), true);
            }

            return dcm_Precio_Final;
        }

        private decimal Calcular_Importe()
        {
            decimal dcm_Importe_FINAL = 0m;
            try
            {
                // #### 1º SI LA OPCION ES 1,5,6 O 7, EL IMPORTE DEBE SER 0 ##################################################################################################
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_1.Codigo) ||
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_5.Codigo) ||
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_6.Codigo) ||
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_7.Codigo))
                {
                    dcm_Importe_FINAL = 0m;//El importe e 0
                }
                else
                {
                    decimal dcm_Cantidad = 0m;
                    //Si el precio es por la cantidad secundaria, se tiene que coger la cantidad secundaria para hacer los calculos
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad.Equals(1))
                    {
                        dcm_Cantidad = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Secundaria;
                    }
                    else
                    {
                        dcm_Cantidad = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal;
                    }


                    decimal dcm_Precio = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final != null ? g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Precio_Final.Value : 0m;

                    // #### 2º APLICAR TODOS LOS DESCUENTO EN MONEDA QUE HAYAN SIN SER LOS QUE YA HEMOS APLICADO ###########################################################
                    if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS != null &&
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Count > 0)
                    {
                        decimal dcm_Total_DescuentoMoneda = g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Where(m => (m.Desactivado==null || (m.Desactivado!=null && !m.Desactivado.Value)) &&
                                                                                                                                    m.TarifaPromocion_DescuentoMoneda != null)
                                                                                                                        .Sum(x => x.TarifaPromocion_DescuentoMoneda.Value);

                        dcm_Precio = dcm_Precio - dcm_Total_DescuentoMoneda;
                    }

                    // #### 1º CALCULAR CANTIDAD X PRECIO ##################################################################################################
                    decimal dcm_Importe = Funciones.RedondearDecimal(dcm_Cantidad * dcm_Precio, 2);

                    // #### 2º APLICAR DESCUENTO GENERAL SI LO HUBIERA ##################################################################################################
                    dcm_Importe = Funciones.RedondearDecimal(dcm_Importe - (dcm_Importe * (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_DescuentoGeneral / 100)), 2);
                    
                    // ##### 3º APLICACION DE LAS PROMOCIONES ####################################################################################### 
                    //Obtener el importe aplicando los descuentos de las promociones
                    if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS != null &&
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Count>0)
                    {
                        //Obtener Promocion o Tarifa con Precio
                        foreach (INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo in g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Where(m => (m.Desactivado == null || (m.Desactivado != null && !m.Desactivado.Value)) && (m.TarifaPromocion_Precio == null || m.TarifaPromocion_Precio.Value == 0m) && m.TarifaPromocion_NomenclaturaPrecio_Id == null).ToList())
                        {
                            dcm_Importe = Aplicar_Descuentos_PrecioImporte(dcm_Importe, false, mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo);
                        }
                    }

                    dcm_Importe_FINAL = Funciones.RedondearDecimal(dcm_Importe, 2);
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Calcular_Importe), true);
            }

            return dcm_Importe_FINAL;

        }

        private decimal Aplicar_Descuentos_PrecioImporte(decimal _dcm_PrecioImporte,
                                                         bool _bol_EsPrecio,
                                                         INTERNO_TarifaPromocion_VentasCompras_Modelo _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo)
        {
            try
            {

                // #### DESCUENTO EN MONEDA
                if (_bol_EsPrecio)
                {
                    if (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_DescuentoMoneda != null)
                    {
                        _dcm_PrecioImporte = _dcm_PrecioImporte - _mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_DescuentoMoneda.Value;
                    }
                }

                // #### INCREMENTO
                if (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Incremento != null)
                {
                    _dcm_PrecioImporte = _dcm_PrecioImporte + (_dcm_PrecioImporte * (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Incremento.Value / 100));
                }

                // #### DESCUENTO 1
                if (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_1 != null)
                {
                    _dcm_PrecioImporte = _dcm_PrecioImporte - (_dcm_PrecioImporte * (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_1.Value / 100));
                }

                // #### DESCUENTO 2
                if (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_2 != null)
                {
                    _dcm_PrecioImporte = _dcm_PrecioImporte - (_dcm_PrecioImporte * (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_2.Value / 100));
                }

                // #### DESCUENTO 3
                if (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_3 != null)
                {
                    _dcm_PrecioImporte = _dcm_PrecioImporte - (_dcm_PrecioImporte * (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_3.Value / 100));
                }

                // #### DESCUENTO 4
                if (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_4 != null)
                {
                    _dcm_PrecioImporte = _dcm_PrecioImporte - (_dcm_PrecioImporte * (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_4.Value / 100));
                }

                // #### DESCUENTO 5
                if (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_5 != null)
                {
                    _dcm_PrecioImporte = _dcm_PrecioImporte - (_dcm_PrecioImporte * (_mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_Descuento_5.Value / 100));
                }
            }
            catch (Exception ex)
            {
                throw new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Aplicar_Descuentos_PrecioImporte), true);
            }

            return _dcm_PrecioImporte;
        }
        #endregion

        #region Promocion por Unidad
        private void Calcular_PromocionesPorUnidad( )
        {
            try
            {
                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;

                // Si la opcion es 1,5,6 o 7 no tiene promociones por unidad
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_1.Codigo) ||
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_5.Codigo) ||
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_6.Codigo) ||
                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_7.Codigo))
                {}
                else
                {
                    INTERNO_TarifaPromocion_VentasCompras_Modelo mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo = null;
                    // #### 1º BUSCAR SI TUVIERA ALGUNA PROMOCION CON 'PROMOCION POR UNIDAD' ##################################################################################################
                    if (g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS != null && 
                        g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Count > 0)
                    {
                        mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo = g_lst_INTERNO_TarifaPromocion_VentasCompras_Modelo_FILTRADOS.Where(m => (m.Desactivado == null || m.Desactivado.Value == false) && m.TarifaPromocion_AB_Cantidad_A != null && m.TarifaPromocion_AB_Cantidad_A.Value != 0m && (m.TarifaPromocion_AB_Cancelado == null || (m.TarifaPromocion_AB_Cancelado != null && m.TarifaPromocion_AB_Cancelado.Value == false))).FirstOrDefault();
                    }

                    if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo != null)
                    {
                        // #### 2º SI NO TIENE ARTICULO Y TIENE EMBALAJE, COMPROBAR QUE ESE EMBALAJE EXISTE PARA ESE ARTICULO #######################################
                        if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id == null &&
                            mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id != null)
                        {
                            bool bol_ExisteEmbalaje = false;

                            //Si ya tengo un listado de MAE_Articulos_Embalajes busco ahi
                            if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes != null)
                            {
                                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes.Where(m => m.idEmbalajePrincipal.Equals(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id.Value) && m.fechaBorrado == null).Count() > 0)
                                {
                                    bol_ExisteEmbalaje = true;
                                }
                            }
                            //Sino busco el articulo y sus embalajes en BD
                            else
                            {
                                //Busco el Articulo primero
                                MAE_Articulos mdl_MAE_Articulos = Articulo_Obtener(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id);

                                if (mdl_MAE_Articulos != null &&
                                    mdl_MAE_Articulos.MAE_Articulos_Embalajes != null &&
                                    mdl_MAE_Articulos.MAE_Articulos_Embalajes.Count > 0)
                                {
                                    //Actualizo el listado
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes = mdl_MAE_Articulos.MAE_Articulos_Embalajes.ToList();

                                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_MAE_Articulos_Embalajes.Where(m => m.idEmbalajePrincipal.Equals(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id.Value) && m.fechaBorrado == null).Count() > 0)
                                    {
                                        bol_ExisteEmbalaje = true;
                                    }
                                }
                            }

                            //Sino existe, Borrar la Promocion por unidad del listado, y guardar un mensaje
                            if (bol_ExisteEmbalaje == false)
                            {
                                //Borro el idEmbalaje, y dejo un mensaje
                                mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Mensaje_Error = Mensajes.G_STR_TARIFASPROMOCIONES_VALIDACIONES_EMBALAJENOEXISTE_PARAARTICULOPRINCIPAL();

                                return;
                            }
                        }

                        // #### 3º CALCULAR PROMOCION POR UNIDAD ##################################################################################################
                        decimal dcm_CantidadACalcular = 0m;
                        //Esta en el Embalaje secundario
                        if (!g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Id.Equals(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id))
                        {
                            //Multiplicar 
                            if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Operacion.Equals(Variables.G_MDL_TIPOOPERACION_MULTIPLICAR.Codigo))
                            {
                                dcm_CantidadACalcular = Funciones.RedondearDecimal(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal * g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion, 3);
                            }
                            //Dividir
                            else
                            {
                                dcm_CantidadACalcular = Funciones.RedondearDecimal(g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal / g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Embalaje_Relacion, 3);
                            }
                        }
                        //Esta en el embalaje principal
                        else
                        {
                            dcm_CantidadACalcular = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Cantidad_Principal;
                        }

                        decimal dcm_ValorCalculado = ((int)Math.Truncate(dcm_CantidadACalcular / mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_A.Value)) * mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Cantidad_B.Value;

                        if (dcm_ValorCalculado != 0m)
                        {
                            //Articulo .................................................................................................
                            long lng_idArticulo = -1;
                            if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id != null)
                            {
                                lng_idArticulo = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Articulo_id.Value;
                            }
                            else
                            {
                                lng_idArticulo = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_Articulo_Id;
                            }
                            //..........................................................................................................

                            //Si el idArticulo en promocion es -1 o es Diferente al que estaba almacenado se borran todos los datos
                            bool bol_RecargarDatos = false;
                            if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Articulo_Id==-1 ||
                                (!g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Articulo_Id.Equals(lng_idArticulo)))
                            {
                                //TipoCompraVenta
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_TipoCompraVenta_Opcion = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Opcion;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_TipoCompraVenta_Id = g_mdl_INTERNO_VentasCompras_Calculos_Modelo.PROPIEDAD_TipoCompraVenta_Id;

                                //Articulo
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = -1;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Codigo = "";
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Descripcion = "";
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_TipoTrazabilidad = "";

                                //Codigos Articos proveedor
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_CodigosArticuloProveedor = null;

                                //Articulos_Embalajes
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_MAE_Articulos_Embalajes = null;

                                //Impuesto Tipo
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Id = null;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Codigo = "";
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Descripcion = "";

                                //Retencion Tipo
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Id = null;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Codigo = "";
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Descripcion = "";

                                //precio Final
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Precio_Final = null;

                                //NumeroRedondeo
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NumeroRedondeo = 3;

                                //descuento General
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_DescuentoGeneral = 0m;

                                //cantidad principal
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal = 0m;

                                //cantidad secundaria
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria = 0m;

                                //Nomenclatura precio
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio = null;

                                //Listado de embalajes
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();

                                //Embalaje 
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Id = -1;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Texto = "";
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Relacion = 1m;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Operacion = "";

                                //Embalaje segunda unidad
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Id = null;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Texto = "";
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = 1m;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                                //Embalaje Principal
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = -1;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = "";
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = 1m;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = "";
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = 0m;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipal_Precios = null;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = null;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = "";
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = 1m;
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = 0;

                                bol_RecargarDatos = true;
                            }

                            if (bol_RecargarDatos)
                            {
                                //Articulo
                                MAE_Articulos mdl_MAE_Articulos_Seleccionado = Articulo_Obtener(lng_idArticulo);
                                if (mdl_MAE_Articulos_Seleccionado != null)
                                {
                                    //Articulo
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id = mdl_MAE_Articulos_Seleccionado.id;
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Codigo = mdl_MAE_Articulos_Seleccionado.codigo;
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Descripcion = mdl_MAE_Articulos_Seleccionado.descripcion;

                                    // Tipo trazabilidad
                                    //Cliente(Venta)
                                    if (g_int_Tipo_ClienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO))
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_TipoTrazabilidad = mdl_MAE_Articulos_Seleccionado.tipoTrazabilidad_Salidas;
                                    }
                                    //Proveedor(Compra)
                                    else
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_TipoTrazabilidad = mdl_MAE_Articulos_Seleccionado.tipoTrazabilidad_Entradas;
                                    }

                                    //Codigos Articulo proveedor
                                    if (mdl_MAE_Articulos_Seleccionado.MAE_Proveedores_CodigosArticuloProveedor != null &&
                                        mdl_MAE_Articulos_Seleccionado.MAE_Proveedores_CodigosArticuloProveedor.Count > 0)
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_CodigosArticuloProveedor = mdl_MAE_Articulos_Seleccionado.MAE_Proveedores_CodigosArticuloProveedor.ToList();
                                    }

                                    //Impuesto Tipo
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Id = mdl_MAE_Articulos_Seleccionado.idImpuestoTipo;
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Codigo = mdl_MAE_Articulos_Seleccionado.GEN_ImpuestosTipos.codigo;
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_ImpuestoTipo_Descripcion = mdl_MAE_Articulos_Seleccionado.GEN_ImpuestosTipos.descripcion;

                                    //Retencion Tipo
                                    if (mdl_MAE_Articulos_Seleccionado.idRetencionTipo_Venta != null)
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Id = mdl_MAE_Articulos_Seleccionado.idRetencionTipo_Venta;
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Codigo = mdl_MAE_Articulos_Seleccionado.GEN_RetencionesTipos.codigo;
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_RetencionTipo_Descripcion = mdl_MAE_Articulos_Seleccionado.GEN_RetencionesTipos.descripcion;
                                    }

                                    //Seleccionamos la Nomenclatura precio  ##############################################################################################################
                                    //Compra (Proveedor)
                                    if (g_int_Tipo_ClienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_PROVEEDOR_CODIGO))
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_Articulos_Seleccionado.MAE_NomenclaturasPrecios;
                                    }
                                    //Ventas (Cliente)
                                    else
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_Articulos_Seleccionado.MAE_NomenclaturasPrecios1;
                                    }

                                    // Buscamos el Embalaje principal del Articulo y el de por defecto ##############################################################################################################
                                    if (mdl_MAE_Articulos_Seleccionado.MAE_Articulos_Embalajes != null &&
                                        mdl_MAE_Articulos_Seleccionado.MAE_Articulos_Embalajes.Count > 0)
                                    {
                                        //Todos los MAE_Articulos_Embalajes del articulo
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_MAE_Articulos_Embalajes = mdl_MAE_Articulos_Seleccionado.MAE_Articulos_Embalajes.ToList();

                                        //Rellenar el listado de Embalajes
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajesPorArticulo = new List<INTERNO_ComboBox_Modelo>();
                                        foreach (MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes in mdl_MAE_Articulos_Seleccionado.MAE_Articulos_Embalajes)
                                        {
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajesPorArticulo.Add(new INTERNO_ComboBox_Modelo(mdl_MAE_Articulos_Embalajes.MAE_Embalajes.id.ToString(), mdl_MAE_Articulos_Embalajes.MAE_Embalajes.descripcion, null));
                                        }

                                        //BUSCAR EL EMBALAJE PRINCIPAL
                                        MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes_PRINCIPAL = mdl_MAE_Articulos_Seleccionado.MAE_Articulos_Embalajes.Where(x => x.fechaBorrado == null && x.esPrincipal).FirstOrDefault();
                                        if (mdl_MAE_Articulos_Embalajes_PRINCIPAL != null)
                                        {
                                            //Embalaje
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id = mdl_MAE_Articulos_Embalajes_PRINCIPAL.idEmbalajePrincipal;
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Texto = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes.descripcion;
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Relacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajePrincipal;
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Operacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.operacion;

                                            if (mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios != null &&
                                                mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios.Count > 0)
                                            {
                                                //Listado de los precios de todas las nomenclaturas del embalaje principal del articulo
                                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipal_Precios = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Articulos_EmbalajesPrincipal_Precios.ToList();

                                                //Primero miro en el Historico de precios
                                                decimal? dcm_Precio_SegunEmbalajePrincipal = PrecioHistorico_Obtener(g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id, g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio.id, g_dtt_Fecha);
                                                if (dcm_Precio_SegunEmbalajePrincipal != null)
                                                {
                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = dcm_Precio_SegunEmbalajePrincipal.Value;
                                                }
                                                else
                                                {
                                                    //precio por defecto de la nomenclatura por defecto
                                                    MAE_Articulos_EmbalajesPrincipal_Precios mdl_MAE_Articulos_EmbalajesPrincipal_Precios = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipal_Precios.Where(m => m.idNomenclaturaPrecio.Equals(g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio.id)).FirstOrDefault();
                                                    if (mdl_MAE_Articulos_EmbalajesPrincipal_Precios != null)
                                                    {
                                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_precio = mdl_MAE_Articulos_EmbalajesPrincipal_Precios.precio;
                                                    }
                                                }
                                            }

                                            //Embalaje Segunda unidad
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id = mdl_MAE_Articulos_Embalajes_PRINCIPAL.idEmbalajeRelacional;
                                            if (mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes1 != null)
                                            {
                                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Texto = mdl_MAE_Articulos_Embalajes_PRINCIPAL.MAE_Embalajes1.descripcion;
                                            }
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Relacion = mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajeRelacional != null ? mdl_MAE_Articulos_Embalajes_PRINCIPAL.cantidadEmbalajeRelacional.Value : 1m;
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_MAE_Articulos_Embalajes_PRINCIPAL.precio_Cantidad_SegundaUnidad != null ? mdl_MAE_Articulos_Embalajes_PRINCIPAL.precio_Cantidad_SegundaUnidad.Value : 0;
                                        }

                                        //Es el Embalaje Seleccionado
                                        MAE_Articulos_Embalajes mdl_MAE_Articulos_Embalajes_SELECCIONADO = null;
                                        //Buscar primero el embale seleccionado
                                        if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id!=null)
                                        {
                                            mdl_MAE_Articulos_Embalajes_SELECCIONADO = mdl_MAE_Articulos_Seleccionado.MAE_Articulos_Embalajes.Where(x => x.idEmbalajePrincipal.Equals(mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Embalaje_id)).FirstOrDefault();
                                        }

                                        //Si no ecnontro ninguno se busca el que esta por defecto
                                        if (mdl_MAE_Articulos_Embalajes_SELECCIONADO==null)
                                        {
                                            mdl_MAE_Articulos_Embalajes_SELECCIONADO = mdl_MAE_Articulos_Seleccionado.MAE_Articulos_Embalajes.Where(x => x.fechaBorrado == null && x.esPrincipal).FirstOrDefault();
                                        }
                                       
                                        if (mdl_MAE_Articulos_Embalajes_SELECCIONADO != null)
                                        {
                                            //idEmbalajePrincipal
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Id = mdl_MAE_Articulos_Embalajes_SELECCIONADO.idEmbalajePrincipal;

                                            //Embalaje texto
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Texto = mdl_MAE_Articulos_Embalajes_SELECCIONADO.MAE_Embalajes.descripcion;

                                            // Cantidad principal
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal = Calculo_Segun_TipoCompraVenta( dcm_ValorCalculado, g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_TipoCompraVenta_Opcion, false);

                                            //relacion
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Relacion = mdl_MAE_Articulos_Embalajes_SELECCIONADO.cantidadEmbalajePrincipal;

                                            //Operacion
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Operacion = mdl_MAE_Articulos_Embalajes_SELECCIONADO.operacion;

                                            //precio_Cantidad_SegundaUnidad
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad = mdl_MAE_Articulos_Embalajes_SELECCIONADO.precio_Cantidad_SegundaUnidad != null ? mdl_MAE_Articulos_Embalajes_SELECCIONADO.precio_Cantidad_SegundaUnidad.Value : 0;

                                            //idEmbalajeRelacional
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Id = mdl_MAE_Articulos_Embalajes_SELECCIONADO.idEmbalajeRelacional;

                                            //Descripcion el embalaje relacional
                                            if (mdl_MAE_Articulos_Embalajes_SELECCIONADO.MAE_Embalajes1 != null)
                                            {
                                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Texto = mdl_MAE_Articulos_Embalajes_SELECCIONADO.MAE_Embalajes1.descripcion;
                                            }

                                            //relacion embalaje segunda unidad
                                            g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Relacion = mdl_MAE_Articulos_Embalajes_SELECCIONADO.cantidadEmbalajeRelacional != null ? mdl_MAE_Articulos_Embalajes_SELECCIONADO.cantidadEmbalajeRelacional.Value : 1m;

                                            // Cantidad Secundaria
                                            if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Id != null &&
                                               g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Id.Value > -1)
                                            {
                                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria = Calculo_Segun_TipoCompraVenta((g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Relacion * g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal),g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_TipoCompraVenta_Opcion, false);
                                            }
                                            else
                                            {
                                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria = 0m;
                                            }
                                        }
                                    }
                                    // Calcular el Precio Final ##############################################################################################
                                    //Ver si hay que calcular el precio
                                    if (mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje != null &&
                                        mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje.Value != 0m)
                                    {
                                        AUX_PrecioNumeroredondeo_Modelo mdl_AUX_PrecioNumeroredondeo_Modelo = Calcular_Precio_PromocionesPorUnidad(g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_Embalaje_Id,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajePrincipalDelArticulo_precio,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Id,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Relacion,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Embalaje_Operacion,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Id,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Relacion,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                                                                                                    null,
                                                                                                                                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio.id);

                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Precio_Final = mdl_AUX_PrecioNumeroredondeo_Modelo.Precio;
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NumeroRedondeo = mdl_AUX_PrecioNumeroredondeo_Modelo.NumeroRedondeo;
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_DescuentoGeneral = mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.TarifaPromocion_AB_Porcentaje.Value;
                                    }

                                    //Cliente
                                    if (g_int_Tipo_ClienteProveedor.Equals(Variables.G_INT_TIPOCLIENTEPROVEEDOR_CLIENTE_CODIGO))
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_Articulos_Seleccionado.idNomenclaturaPrecio_Venta_PorDefecto != null ? mdl_MAE_Articulos_Seleccionado.MAE_NomenclaturasPrecios1 : null;
                                    }
                                    //Proveedor
                                    else
                                    {
                                        g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_NomenclaturaPrecio = mdl_MAE_Articulos_Seleccionado.idNomenclaturaPrecio_Compra_PorDefecto != null ? mdl_MAE_Articulos_Seleccionado.MAE_NomenclaturasPrecios : null;
                                    }
                                }
                            }
                            else
                            {
                                // Cantidad principal
                                g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal = dcm_ValorCalculado;

                                // Cantidad Secundaria
                                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Id != null &&
                                   g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Id.Value > -1)
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria = (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_Relacion * g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal);
                                }
                                else
                                {
                                    g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria = 0m;
                                }
                            }

                            //Mensaje de Error
                            mdl_INTERNO_TarifaPromocion_VentasCompras_Modelo.Mensaje_Error = null;
                        }
                    }
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Calcular_PromocionesPorUnidad), true);
            }
        }

        private AUX_PrecioNumeroredondeo_Modelo Calcular_Precio_PromocionesPorUnidad(long _lng_Articulo_Id,
                                                                                    long _lng_EmbalajePrincipalDelArticulo_Embalaje_Id,
                                                                                    long? _lng_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id,
                                                                                    int _int_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                                    decimal _dcm_EmbalajePrincipalDelArticulo_precio,
                                                                                    long _lng_Embalaje_Id,
                                                                                    decimal _dcm_Embalaje_Relacion,
                                                                                    string _str_Embalaje_Operacion,
                                                                                    long? _lng_EmbalajeSegundaUnidad_Id,
                                                                                    decimal _dcm_EmbalajeSegundaUnidad_Relacion,
                                                                                    int _int_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                                    decimal? _dcm_Precio_Final,
                                                                                    long _lng_idNomenclaturaPrecio)
        {
            AUX_PrecioNumeroredondeo_Modelo mdl_INTERNO_PrecioNumeroredondeo_Modelo = new AUX_PrecioNumeroredondeo_Modelo();
            mdl_INTERNO_PrecioNumeroredondeo_Modelo.NumeroRedondeo = 3;
            mdl_INTERNO_PrecioNumeroredondeo_Modelo.Precio = 0;

            try
            {
                if (_lng_Articulo_Id>-1)
                {
                    mdl_INTERNO_PrecioNumeroredondeo_Modelo = Calcular_Precio(  null,
                                                                                _lng_EmbalajePrincipalDelArticulo_Embalaje_Id,
                                                                                _lng_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_Id,
                                                                                _int_EmbalajePrincipalDelArticulo_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                                _dcm_EmbalajePrincipalDelArticulo_precio,
                                                                                _lng_Embalaje_Id,
                                                                                _dcm_Embalaje_Relacion,
                                                                                _str_Embalaje_Operacion,
                                                                                _lng_EmbalajeSegundaUnidad_Id,
                                                                                _dcm_EmbalajeSegundaUnidad_Relacion,
                                                                                _int_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad,
                                                                                null,
                                                                                _lng_Articulo_Id);
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Calcular_Precio_PromocionesPorUnidad), true);
            }

            return mdl_INTERNO_PrecioNumeroredondeo_Modelo;
        }

        private decimal Calcular_Importe_PromocionesPorUnidad()
        {
            decimal dcm_Importe_FINAL = 0m;
            try
            {
                if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Articulo_Id>-1)
                {
                    decimal dcm_Cantidad = 0m;
                    //Si el precio es por la cantidad secundaria, se tiene que coger la cantidad secundaria para hacer los calculos
                    if (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_EmbalajeSegundaUnidad_PrecioCantidadSegundaUnidad.Equals(1))
                    {
                        dcm_Cantidad = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Secundaria;
                    }
                    else
                    {
                        dcm_Cantidad = g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Cantidad_Principal;
                    }

                    // #### 1º CALCULAR CANTIDAD X PRECIO ##################################################################################################
                    decimal dcm_Importe = Funciones.RedondearDecimal(dcm_Cantidad * (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Precio_Final!=null ? g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_Precio_Final.Value : 0m), 2);

                    // #### 2º APLICAR DESCUENTO GENERAL SI LO HUBIERA ##################################################################################################
                    dcm_Importe = Funciones.RedondearDecimal(dcm_Importe - (dcm_Importe * (g_mdl_INTERNO_VentasCompras_Calculos_Modelo_PROMOCIONPORUNIDAD.PROPIEDAD_DescuentoGeneral / 100)), 2);
                    

                    dcm_Importe_FINAL = Funciones.RedondearDecimal(dcm_Importe, 2);
                }
            }
            catch (Control_Errores)
            {
                throw;
            }
            catch (Exception ex)
            {
                new Control_Errores("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Calcular_Importe_PromocionesPorUnidad), true);
            }

            return dcm_Importe_FINAL;

        }
        #endregion

        #region calculos Segun TipoCompraventa
        private decimal Calculo_Segun_TipoCompraVenta(decimal _dcm_Valor,string _str_TipoCompraVenta_Opcion,bool _bol_ObligarPositivo)
        {
            try
            {
                if (_dcm_Valor > 0)
                {
                    //2 --> Devolucion Desechable
                    if (_str_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_2.Codigo))
                    {
                        _dcm_Valor = _dcm_Valor * (-1m);
                    }
                    //3 --> Devolucion recuperable
                    else if (_str_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_3.Codigo))
                    {
                        _dcm_Valor = _dcm_Valor * (-1m);
                    }
                    //6 --> Mercancia en deposito (Entrega)
                    else if (_str_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_6.Codigo))
                    {
                        _dcm_Valor = _dcm_Valor * (-1m);
                    }
                }
                else
                {
                    if (_bol_ObligarPositivo)
                    {
                        _dcm_Valor = _dcm_Valor * (-1m);
                    }
                }

            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Calculo_Segun_TipoCompraVenta));
            }

            return _dcm_Valor;
        }
        private decimal? Calculo_Segun_TipoCompraVenta(decimal? _dcm_Valor, string _str_TipoCompraVenta_Opcion, bool _bol_ObligarPositivo)
        {
            try
            {
                if (_dcm_Valor!=null)
                {
                    if (_dcm_Valor.Value > 0)
                    {
                        //2 --> Devolucion Desechable
                        if (_str_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_2.Codigo))
                        {
                            _dcm_Valor = _dcm_Valor.Value * (-1m);
                        }
                        //3 --> Devolucion recuperable
                        else if (_str_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_3.Codigo))
                        {
                            _dcm_Valor = _dcm_Valor.Value * (-1m);
                        }
                        //6 --> Mercancia en deposito (Entrega)
                        else if (_str_TipoCompraVenta_Opcion.Equals(Variables.G_MDL_TIPOCOMPRAVENTA_OPCION_6.Codigo))
                        {
                            _dcm_Valor = _dcm_Valor.Value * (-1m);

                        }
                    }
                    else
                    {
                        if (_bol_ObligarPositivo)
                        {
                            _dcm_Valor = _dcm_Valor.Value * (-1m);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Control_Errores.Errores_Log("", ex, nameof(VentasCompras_Calculos) + "/" + nameof(Calculo_Segun_TipoCompraVenta));
            }

            return _dcm_Valor;
        }
        #endregion
    }
}
