public void TestePromocaoMuitoQueijo()
        {
            var lanche = new LanchePedidoMdl();

            lanche.Ingredientes = new List <IngredienteLanchePedidoMdl>();
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 7, Nome = "Ingrediente 1", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Queijo, Valor = 10
            }, 2));
            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            Assert.False(lanche.Promocoes.Any(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.MuitoQueijo), "Não deveria possuir nenhuma promoção de muito queijo!");

            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 7, Nome = "Ingrediente 1", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Queijo, Valor = 10
            }, 1));
            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            Assert.True(lanche.Promocoes.Any(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.MuitoQueijo), "Deveria possuir uma promoção de muito queijo!");
            Assert.True(lanche.Promocoes.Count(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.MuitoQueijo) == 1, "Deveria possuir apenas uma promoção Muito Queijo");

            Assert.True(lanche.Promocoes.First(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.MuitoQueijo).Valor == lanche.Ingredientes.First().Valor * -1, "Deveria ter havido desconto de 1 ingrediente!");
        }
        public void TesteValorSemPromocao()
        {
            //Teste para garantir que o preço
            var lanche = new LanchePedidoMdl();

            lanche.Ingredientes = new List <IngredienteLanchePedidoMdl>();
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 6, Nome = "Ingrediente 1", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Carne, Valor = 10
            }, 2));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 7, Nome = "Ingrediente 2", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Queijo, Valor = 4
            }, 2));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 3, Nome = "Ingrediente 3", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Queijo, Valor = 4
            }, 5));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 4, Nome = "Ingrediente 4", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Queijo, Valor = 1
            }, 4));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 5, Nome = "Ingrediente 5", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Queijo, Valor = 22
            }, 1));

            var valorEsperado = lanche.Ingredientes.Sum(s => s.Quantidade * s.Valor);

            _lancheBLL.CalcularValor(lanche);

            Assert.True(valorEsperado == lanche.Valor, $"Soma do lanche de testes deveria ser {valorEsperado}");
        }
        public void TestePromocaoMuitaCarne()
        {
            var lanche = new LanchePedidoMdl();

            lanche.Ingredientes = new List <IngredienteLanchePedidoMdl>();
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 3, Nome = "Ingrediente 1", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Carne, Valor = 10
            }, 2));
            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            Assert.False(lanche.Promocoes.Any(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.MuitaCarne), "Não deveria possuir uma promoção de muita carne!");

            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 3, Nome = "Ingrediente 1", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Carne, Valor = 10
            }, 1));
            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            Assert.True(lanche.Promocoes.Any(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.MuitaCarne), "Deveria possuir uma promoção de muita carne!");
            Assert.True(lanche.Promocoes.Count(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.MuitaCarne) == 1, "Deveria possuir apenas uma promoção Muita Carne!");

            Assert.True(lanche.Promocoes.First(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.MuitaCarne).Valor == lanche.Ingredientes.First().Valor * -1);
        }
        public void TestePromocaoLight()
        {
            var lanche = new LanchePedidoMdl();

            lanche.Ingredientes = new List <IngredienteLanchePedidoMdl>();
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 2, Nome = "Bacon", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Carne, Valor = 10
            }, 2));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 5, Nome = "Hamburguer", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Carne, Valor = 10
            }, 2));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 1, Nome = "Alface", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Vegetal, Valor = 10
            }, 2));
            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            Assert.False(lanche.Promocoes.Any(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.Light), "Não deveria possuir uma promoção de Light!");

            lanche.Ingredientes.RemoveAt(0);

            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            Assert.True(lanche.Promocoes.Any(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.Light), "Deveria possuir uma promoção de Light!");

            Assert.True(lanche.Promocoes.First(x => x.TipoPromocao == Model.Enumeradores.EnumTipoPromocao.Light).Valor == lanche.Valor * 0.1M * -1, "O desconto deveria ser de 10%");
        }
Beispiel #5
0
        public PartialViewResult AdicionarLanchePedido(LanchePedidoMdl lanchePedido)
        {
            var lancheBLL = new LancheBLL();

            lancheBLL.CalcularValor(lanchePedido);
            lancheBLL.CalcularPromocao(lanchePedido);
            return(PartialView("pvTrLanchePedido", lanchePedido));
        }
Beispiel #6
0
        public PartialViewResult CalcularPromocoes(LanchePedidoMdl lanchePedido)
        {
            var lancheBLL = new LancheBLL();

            lancheBLL.CalcularValor(lanchePedido);
            lancheBLL.CalcularPromocao(lanchePedido);
            return(PartialView("pvTbodyTrMontagemLanche", lanchePedido));
        }
Beispiel #7
0
        public void CalcularValor(LanchePedidoMdl Lanche)
        {
            if (Lanche == null)
            {
                throw new BusinessException("Erro ao calcular preço do lanche. Lanche não informado.");
            }

            if (Lanche.Ingredientes == null || !Lanche.Ingredientes.Any())
            {
                throw new BusinessException("Lanches devem possuir ingredientes para composição de seus preços.");
            }

            Lanche.Valor = Lanche.ValorIngredientes;
        }
Beispiel #8
0
        public PartialViewResult TableMontagemLanche(int?idLanche)
        {
            LanchePedidoMdl lanchePedido;

            if (idLanche.HasValue)
            {
                var bllLanche = new LancheBLL();
                var lanche    = bllLanche.Obter(idLanche.Value);
                lanchePedido = new LanchePedidoMdl(lanche);
            }
            else
            {
                lanchePedido = new LanchePedidoMdl();
                lanchePedido.Ingredientes = new List <IngredienteLanchePedidoMdl>();
            }
            return(PartialView("pvTbodyTrMontagemLanche", lanchePedido));
        }
        public void TesteValorComPromocao()
        {
            var lanche = new LanchePedidoMdl();

            lanche.Ingredientes = new List <IngredienteLanchePedidoMdl>();

            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 2, Nome = "Bacon", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Carne, Valor = 2
            }, 2));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 3, Nome = "Hamburguer", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Carne, Valor = 3
            }, 2));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 1, Nome = "Alface", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Vegetal, Valor = 0.4M
            }, 2));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 4, Nome = "Ovo", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Outros, Valor = 0.8M
            }, 2));
            lanche.Ingredientes.Add(new IngredienteLanchePedidoMdl(new IngredienteMdl()
            {
                Id = 5, Nome = "Queijo", TipoIngrediente = Model.Enumeradores.EnumTipoIngrediente.Queijo, Valor = 1.5M
            }, 2));

            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            decimal valorEsperado = lanche.Ingredientes.Sum(s => s.Quantidade * s.Valor);

            Assert.True(lanche.ValorPromocional == valorEsperado, $"Lanche deveria ter um valor {valorEsperado}");

            lanche.Ingredientes.ElementAt(4).Quantidade = 4;

            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            valorEsperado = lanche.ValorIngredientes - lanche.Ingredientes.ElementAt(4).Valor;

            Assert.True(lanche.ValorPromocional == valorEsperado, $"Lanche deveria ter um valor {valorEsperado}");

            lanche.Ingredientes.ElementAt(1).Quantidade = 4;

            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            valorEsperado = lanche.ValorIngredientes - lanche.Ingredientes.ElementAt(1).Valor - lanche.Ingredientes.ElementAt(4).Valor;

            Assert.True(lanche.ValorPromocional == valorEsperado, $"Lanche deveria ter um valor {valorEsperado}");

            decimal valorPrimeiroItem = lanche.Ingredientes.ElementAt(0).Valor *lanche.Ingredientes.ElementAt(0).Quantidade;

            lanche.Ingredientes.RemoveAt(0);

            _lancheBLL.CalcularValor(lanche);
            _lancheBLL.CalcularPromocao(lanche);

            valorEsperado = (lanche.ValorIngredientes - (lanche.ValorIngredientes * 0.1M)) - lanche.Ingredientes.ElementAt(0).Valor - lanche.Ingredientes.ElementAt(3).Valor;

            Assert.True(lanche.ValorPromocional == valorEsperado, $"Lanche deveria ter um valor {valorEsperado}");
        }
Beispiel #10
0
        public void CalcularPromocao(LanchePedidoMdl Lanche)
        {
            if (Lanche == null)
            {
                throw new BusinessException("Erro ao calcular promoções do lanche. Lanche não informado.");
            }

            if (Lanche.Ingredientes == null || !Lanche.Ingredientes.Any())
            {
                throw new BusinessException("Lanches devem possuir ingredientes para composição de suas promoções.");
            }

            if (Lanche.Valor <= 0)
            {
                throw new BusinessException("Lanches devem possuir seus valores calculados antes de validar promoções.");
            }

            Lanche.Promocoes = new List <PromocaoLancheMdl>();

            //Estes IDs poderiam ser oferecidos através de um cadastro de promoções ou parametros globais. Não os implementei para economizar tempo.
            int idAlface = 1;
            int idBacon  = 2;

            if (Lanche.Ingredientes.Any(x => x.IdIngrediente == idAlface) &&
                !Lanche.Ingredientes.Any(x => x.IdIngrediente == idBacon))
            {
                //Promoção Light
                var promocaoLight = new PromocaoLancheMdl(EnumTipoPromocao.Light);
                promocaoLight.Nome = "Light";

                promocaoLight.Valor = Lanche.Valor * 0.1M * -1;
                Lanche.Promocoes.Add(promocaoLight);
            }

            foreach (var group in Lanche.Ingredientes
                     .Where(x => x.Ingrediente.TipoIngrediente == Model.Enumeradores.EnumTipoIngrediente.Carne)
                     .GroupBy(g => new { g.IdIngrediente, g.Ingrediente.TipoIngrediente }))
            {
                //Promoção muita carne
                int carnesParaDescontar = group.Sum(s => s.Quantidade) / 3;
                if (carnesParaDescontar > 0)
                {
                    var ingrediente        = group.First().Ingrediente;
                    var promocaoMuitaCarne = new PromocaoLancheMdl(EnumTipoPromocao.MuitaCarne);
                    promocaoMuitaCarne.Nome  = string.Format("Muita Carne! - {0}", ingrediente.Nome);
                    promocaoMuitaCarne.Valor = carnesParaDescontar * ingrediente.Valor * -1;
                    Lanche.Promocoes.Add(promocaoMuitaCarne);
                }
            }

            foreach (var group in Lanche.Ingredientes
                     .Where(x => x.Ingrediente.TipoIngrediente == Model.Enumeradores.EnumTipoIngrediente.Queijo)
                     .GroupBy(g => new { g.IdIngrediente, g.Ingrediente.TipoIngrediente }))
            {
                //Promoção muito queijo
                int queijosParaDescontar = group.Sum(s => s.Quantidade) / 3;
                if (queijosParaDescontar > 0)
                {
                    var ingrediente         = group.First().Ingrediente;
                    var promocaoMuitoQueijo = new PromocaoLancheMdl(EnumTipoPromocao.MuitoQueijo);
                    promocaoMuitoQueijo.Nome  = string.Format("Muito Queijo! - {0}", ingrediente.Nome);
                    promocaoMuitoQueijo.Valor = queijosParaDescontar * ingrediente.Valor * -1;
                    Lanche.Promocoes.Add(promocaoMuitoQueijo);
                }
            }
        }