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%"); }
public PartialViewResult AdicionarLanchePedido(LanchePedidoMdl lanchePedido) { var lancheBLL = new LancheBLL(); lancheBLL.CalcularValor(lanchePedido); lancheBLL.CalcularPromocao(lanchePedido); return(PartialView("pvTrLanchePedido", lanchePedido)); }
public PartialViewResult CalcularPromocoes(LanchePedidoMdl lanchePedido) { var lancheBLL = new LancheBLL(); lancheBLL.CalcularValor(lanchePedido); lancheBLL.CalcularPromocao(lanchePedido); return(PartialView("pvTbodyTrMontagemLanche", lanchePedido)); }
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; }
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}"); }
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); } } }