public static void calcularDescuentoProducto(PrecioDescuentoProducto datos) { DescuentosProducto dtoProducto; datos.descuentoCalculado = 0; datos.precioCalculado = (decimal)datos.producto.PVP; datos.aplicarDescuento = calcularAplicarDescuento(datos.aplicarDescuento, datos.producto.Familia, datos.producto.SubGrupo); // En Nesto Viejo, si no tiene el aplicar descuento marcado, solo calcula precios especiales, pero no descuentos // Ahora hacemos que no calcule nada, por eso lo pongo aquí arriba. if (!datos.aplicarDescuento) { return; } using (NVEntities db = new NVEntities()) { // AQUÍ CALCULA PRECIOS, NO DESCUENTOS //select precio from descuentosproducto with (nolock) where [nº cliente]='15191 ' and contacto='0 ' and [nº producto]= '29487' and empresa='1 ' AND CANTIDADMÍNIMA<=1 dtoProducto = db.DescuentosProductoes.SingleOrDefault(d => d.Empresa == datos.producto.Empresa && d.Nº_Cliente == datos.cliente && d.Contacto == datos.contacto && d.Nº_Producto == datos.producto.Número && d.CantidadMínima <= datos.cantidad); if (dtoProducto != null && dtoProducto.Precio < datos.precioCalculado) { datos.precioCalculado = (decimal)dtoProducto.Precio; } //select precio from descuentosproducto with (nolock) where [nº cliente]='15191 ' and [nº producto]= '29487' and empresa='1 ' AND CantidadMínima<=1 //select recargopvp from clientes with (nolock) where empresa='1 ' and [nº cliente]='15191 ' and contacto='0 ' //select top 1 precio,cantidadminima from descuentosproducto where cantidadminíma<=1 and empresa='1 ' and [Nº Producto]='29352' and [nº cliente]='15191 ' and contacto='0 ' order by cantidadminima desc //select top 1 precio,cantidadminima from descuentosproducto where cantidadminíma<=1 and empresa='1 ' and [Nº Producto]='29352' and [nº cliente]='15191 ' order by cantidadminima desc dtoProducto = db.DescuentosProductoes.SingleOrDefault(d => d.Empresa == datos.producto.Empresa && d.Nº_Cliente == datos.cliente && d.Nº_Producto == datos.producto.Número && d.CantidadMínima <= datos.cantidad); if (dtoProducto != null && dtoProducto.Precio < datos.precioCalculado) { datos.precioCalculado = (decimal)dtoProducto.Precio; } //select top 1 precio,cantidadminima from descuentosproducto where cantidadminíma<=1 and empresa='1 ' and [Nº Producto]='29352' and [nº cliente] is null and [nºproveedor] is null order by cantidadminima desc dtoProducto = db.DescuentosProductoes.OrderByDescending(d => d.CantidadMínima).FirstOrDefault(d => d.Empresa == datos.producto.Empresa && d.Nº_Producto == datos.producto.Número && d.CantidadMínima <= datos.cantidad && d.Nº_Cliente == null && d.NºProveedor == null); if (dtoProducto != null && dtoProducto.Precio < datos.precioCalculado) { datos.precioCalculado = (decimal)dtoProducto.Precio; } // CALCULA DESCUENTOS //select * from descuentosproducto where empresa='1 ' and [nº producto]='29352' and [nº cliente] is null and nºproveedor is null and familia is null //select * from descuentosproducto where empresa='1 ' and grupoproducto='PEL' and [nº cliente] is null and nºproveedor is null and familia is null //select * from descuentosproducto where empresa='1 ' and [nº producto]='29352' and [nº cliente]='15191 ' and nºproveedor is null and familia is null dtoProducto = db.DescuentosProductoes.SingleOrDefault(d => d.Empresa == datos.producto.Empresa && d.Nº_Cliente == datos.cliente && d.Nº_Producto == datos.producto.Número && d.CantidadMínima <= datos.cantidad && d.NºProveedor == null && d.Familia == null); if (dtoProducto != null && dtoProducto.Descuento > datos.descuentoCalculado) { datos.descuentoCalculado = dtoProducto.Descuento; } //select * from descuentosproducto where empresa='1 ' and grupoproducto='PEL' and [nº cliente]='15191 ' and nºproveedor is null and familia is null // AGAIN AND AGAIN AND AGAIN... //select isnull(max(descuento),0) from descuentosproducto where [nº cliente]='15191 ' and empresa='1 ' and grupoproducto='PEL' and cantidadmínima<=1 and familia is null and nºproveedor is null dtoProducto = db.DescuentosProductoes.SingleOrDefault(d => d.Empresa == datos.producto.Empresa && d.Nº_Cliente == datos.cliente && d.Familia == null && d.CantidadMínima <= datos.cantidad && d.NºProveedor == null && d.GrupoProducto == datos.producto.Grupo); if (dtoProducto != null && dtoProducto.Descuento > datos.descuentoCalculado) { datos.descuentoCalculado = dtoProducto.Descuento; } //select * from descuentosproducto where empresa='1 ' and familia='Lisap ' and [nº cliente]='15191 ' and nºproveedor is null and grupoproducto is null //select isnull(max(descuento),0) from descuentosproducto where [nº cliente]='15191 ' and empresa='1 ' and familia='Lisap ' and cantidadmínima<=1 and nºproveedor is null and grupoproducto is null dtoProducto = db.DescuentosProductoes.SingleOrDefault(d => d.Empresa == datos.producto.Empresa && d.Nº_Cliente == datos.cliente && d.Familia == datos.producto.Familia && d.CantidadMínima <= datos.cantidad && d.NºProveedor == null && d.GrupoProducto == null); if (dtoProducto != null && dtoProducto.Descuento > datos.descuentoCalculado) { datos.descuentoCalculado = dtoProducto.Descuento; } //select * from descuentosproducto where empresa='1 ' and familia='Lisap ' and [nº cliente]='15191 ' and grupoproducto='PEL' and nºproveedor is null if (datos.precioCalculado < datos.producto.PVP * (1 - datos.descuentoCalculado)) { datos.descuentoCalculado = 0; } else { datos.precioCalculado = (decimal)datos.producto.PVP; } // Si quisiéramos comprobar también las condiciones que tiene en ficha, descomentar la siguiente línea // comprobarCondiciones(datos); } }
public static bool comprobarCondiciones(PrecioDescuentoProducto datos) { // Primero miramos si ese precio está en las oferta (tiene metidos los precios generales para todos los clientes) using (NVEntities db = new NVEntities()) { DescuentosProducto dtoProducto = db.DescuentosProductoes.OrderByDescending(d => d.CantidadMínima).FirstOrDefault(d => d.Empresa == datos.producto.Empresa && d.Nº_Producto == datos.producto.Número && d.CantidadMínima <= datos.cantidad && d.Nº_Cliente == null && d.NºProveedor == null); if (dtoProducto != null && dtoProducto.Precio * (1 - dtoProducto.Descuento) <= datos.producto.PVP * (1 - datos.descuentoReal)) { return true; } } // Recorre listaCondiciones y mira una a una si "datos" cumplen todas las condiciones // Devuelve true si cumple todas y false si alguna no se cumple // Las que no se cumplen son corregidas durante la comprobación if (listaCondiciones == null || listaCondiciones.Count == 0) { cargarListaCondiciones(); } bool cumpleTodasLasCondiciones = true; // Cambiar el for por un while para mejorar rendimiento foreach (ICondicionPrecioDescuento condicion in listaCondiciones) { cumpleTodasLasCondiciones = condicion.precioAceptado(datos) && cumpleTodasLasCondiciones; }; return cumpleTodasLasCondiciones; }
public ProductoDTO(string producto, NVEntities db) { this.producto = producto; this.db = db; }