none
Validar cantidades máxima y mínima RRS feed

  • Pregunta

  • Hola 

    Trabajo en una app Windows Forms, VS 2019, EF, SQL Server

    En el negocio se vende papel impreso con los siguiente valores

    Tengo el siguiente requerimiento:

    Si el metro de papel es 0.01 cm hasta 0.49cm se cobra 2.50 usd si la cantidad es 0.30 me debe dar 2.50 que es lo minimo que se cobra de 0.49 cm para abajo.

    Eso quiere decir que no puedo usar esta formula importe = cantidad * precio porque nunca me va a salir a 2.50, ¿como lo puedo solucionar?

    En el resto de casos si me sirve este código

     //preguntar en ProductoPrecio
                            var productoPrecioList = _productoPrecioRepository
                                .Filter(x => x.ProductoId == entity.ProductoId).ToList();
    
                            switch (producto.TipoProducto)
                            {
                                case ProductoType.Bien:
                                    break;
                                case ProductoType.Servicio:
                                    foreach (var item in productoPrecioList)
                                    {
                                        if (entity.Cantidad >= item.CantidadMinima && entity.Cantidad <= item.CantidadMaxima)
                                        {
                                            entity.Precio = item.Pvp;
                                        }
                                    }
                                    break;
                                default:
                                    break;
                            }
    
                            entity.SubTotalIva = entity.Importe;
                            entity.SubTotalIva = Math.Round(entity.Importe * 10000M / (100M + entity.Iva)) / 100M;
                            entity.ValorIva = entity.Importe - entity.SubTotalIva;
                            _ventaRepository.Agregar(entity);

    El otro detalle esta aplicación sirve para utilizarla en varios negocios y la solución que se de no queme el código quemado(que me limite solo para un negocio).

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila jueves, 28 de noviembre de 2019 17:22
    jueves, 28 de noviembre de 2019 17:05

Respuestas

  • En primer lugar, algunas observaciones respecto a calidad de código:

    1. ¿Por qué el espanglish? Por ejemplo, en la condición de la instrucción de selección switch, dice TipoProducto; mientras que en la expresión de coincidencia dice ProductoType. ¿Se dan cuenta? O bien escribes tu código en español, o bien en inglés; pero no con ambas. Aquí hay otro: productoPrecioList, ¡uff! y así hay varios.
    2. Y cuidado. Si escribes el código en español, pues escríbelo con ortografía y gramática, como debe ser. Lo correcto es CantidadMínima y CantidadMáxima, «Mínima» y «Máxima» con tildes.
    3. Define correctamente el nombre de las entidades, según su naturaleza y funcionalidad. Por ejemplo, si defines la entidad ProductoPrecio, indicas que es el producto del precio; cuando lo correcto es precio del producto, es decir, PrecioProducto, porque, según el modelo de datos, la relación es un producto con varios precios.
    4. Para las colecciones, eviten usar tipos genéricos; más bien, define clases específicas para las colecciones. Por ejemplo, y con la corrección anterior, si la entidad es PrecioProducto, entonces se debe definir la clase PreciosProducto para su colección.
    5. Con las notaciones igual, o bien escribes el código con notación Camel, o bien con notación Pascal; pero no las mezclen, por favor.
    6. Y cuando declaren una variable local, háganlo anteponiendo un guión bajo, seguido del tipo de forma explícita. No escriban así (peor con el espanglish, y con las corecciones de nomenclatura): var productoPrecioList = _productoPrecioRepository;, lo correcto es: PreciosProducto _PreciosProducto = _PreciosProductoRepositorio; (no sé de dónde sale la variable _productoPrecioRepository).
    Ahora sí, respecto a la pregunta. Daré mi propuesta de solución, en base a cómo lo haría yo, sin guiarme del modelo de datos, ni de la lógica y técnica de programación que se presenta. Aquí mi propuesta de solución, acompaño de un modelo conceptual en UML:

    public class ProductoOrdenVenta
    {
        protected override void PreparandoAtributos()
        {
            this.Atributos.Add(new Atributo("Producto"));
            
            this.Atributos.Add(new Atributo("Cantidad"));
            
            this.Atributos.Add(new Atributo("PrecioProducto") { Dependencia = "Producto;Cantidad" });
            
            this.Atributos.Add(new Atributo("Subtotal") { Dependencia = "Cantidad;PrecioProducto" });
        }
    
        private void SeleccionarPreciosProducto()
        {
            this.PreciosProducto.TextoComando = "SELECT * FROM PreciosProducto WHERE Producto = '" + this.Producto.Registro.Id + "' AND " + this.Cantidad.ToString() + " >= CantidadMínima AND " + this.Cantidad.ToString() + " <= CantidadMáxima";
        }
    
        private void RestringirSubtotal()
        {
            this.Subtotal = this.Cantidad * this.PrecioProducto.PrecioVenta;
        }
    }

    jueves, 28 de noviembre de 2019 19:09

Todas las respuestas

  • En primer lugar, algunas observaciones respecto a calidad de código:

    1. ¿Por qué el espanglish? Por ejemplo, en la condición de la instrucción de selección switch, dice TipoProducto; mientras que en la expresión de coincidencia dice ProductoType. ¿Se dan cuenta? O bien escribes tu código en español, o bien en inglés; pero no con ambas. Aquí hay otro: productoPrecioList, ¡uff! y así hay varios.
    2. Y cuidado. Si escribes el código en español, pues escríbelo con ortografía y gramática, como debe ser. Lo correcto es CantidadMínima y CantidadMáxima, «Mínima» y «Máxima» con tildes.
    3. Define correctamente el nombre de las entidades, según su naturaleza y funcionalidad. Por ejemplo, si defines la entidad ProductoPrecio, indicas que es el producto del precio; cuando lo correcto es precio del producto, es decir, PrecioProducto, porque, según el modelo de datos, la relación es un producto con varios precios.
    4. Para las colecciones, eviten usar tipos genéricos; más bien, define clases específicas para las colecciones. Por ejemplo, y con la corrección anterior, si la entidad es PrecioProducto, entonces se debe definir la clase PreciosProducto para su colección.
    5. Con las notaciones igual, o bien escribes el código con notación Camel, o bien con notación Pascal; pero no las mezclen, por favor.
    6. Y cuando declaren una variable local, háganlo anteponiendo un guión bajo, seguido del tipo de forma explícita. No escriban así (peor con el espanglish, y con las corecciones de nomenclatura): var productoPrecioList = _productoPrecioRepository;, lo correcto es: PreciosProducto _PreciosProducto = _PreciosProductoRepositorio; (no sé de dónde sale la variable _productoPrecioRepository).
    Ahora sí, respecto a la pregunta. Daré mi propuesta de solución, en base a cómo lo haría yo, sin guiarme del modelo de datos, ni de la lógica y técnica de programación que se presenta. Aquí mi propuesta de solución, acompaño de un modelo conceptual en UML:

    public class ProductoOrdenVenta
    {
        protected override void PreparandoAtributos()
        {
            this.Atributos.Add(new Atributo("Producto"));
            
            this.Atributos.Add(new Atributo("Cantidad"));
            
            this.Atributos.Add(new Atributo("PrecioProducto") { Dependencia = "Producto;Cantidad" });
            
            this.Atributos.Add(new Atributo("Subtotal") { Dependencia = "Cantidad;PrecioProducto" });
        }
    
        private void SeleccionarPreciosProducto()
        {
            this.PreciosProducto.TextoComando = "SELECT * FROM PreciosProducto WHERE Producto = '" + this.Producto.Registro.Id + "' AND " + this.Cantidad.ToString() + " >= CantidadMínima AND " + this.Cantidad.ToString() + " <= CantidadMáxima";
        }
    
        private void RestringirSubtotal()
        {
            this.Subtotal = this.Cantidad * this.PrecioProducto.PrecioVenta;
        }
    }

    jueves, 28 de noviembre de 2019 19:09
  • Hola @Gerardo

    Gracias por las recomendaciones, tengo que ser mas consecuente en lo que hago.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    viernes, 29 de noviembre de 2019 15:03