public ViewResult FecharPedido(Carrinho carrinho, Pedido pedido)
        {
            EmailConfiguracoes email = new EmailConfiguracoes
            {
                EscreverArquivo = bool.Parse(ConfigurationManager.AppSettings["Email.EscreverArquivo"] ?? "false")
            };

            EmailPedido emailPedido = new EmailPedido(email);

            if (!carrinho.ItensCarrinhos.Any())
            {
                ModelState.AddModelError("", "Não foi possivel concluir o pedido, seu carrinho esta vazio.");
            }

            if (ModelState.IsValid)
            {
                emailPedido.Processarpedido(carrinho, pedido);
                carrinho.LimparCarrinho();
                return View("PedidoConcluido");
            }
            else
            {
                return View(pedido);
            }
        }
        public void AdicionarProdutoExistenteParaCarrinho()
        {
            Produto produto1 = new Produto
            {
                ProdutoId = 1,
                Nome = "Teste 1"
            };

            Produto produto2 = new Produto
            {
                ProdutoId = 2,
                Nome = "Teste 2"
            };
            //Produto produto3 = new Produto
            //{
            //    ProdutoId = 3,
            //    Nome = "Teste 3"
            //};

            //arrange
            Carrinho carrinho = new Carrinho();

            carrinho.AdicionarItem(produto1, 1);
            carrinho.AdicionarItem(produto2, 1);
            carrinho.AdicionarItem(produto1, 10);

            //Act
            ItemCarrinho[] resultado = carrinho.ItensCarrinhos
                .OrderBy(c => c.Produto.ProdutoId).ToArray();

            //ver qts produto tenho no carrinho
            Assert.AreEqual(resultado.Length, 2);
            Assert.AreEqual(resultado[0].Quantidade, 11);
            Assert.AreEqual(resultado[1].Quantidade, 1);
        }
        public void AdicionarItensAoCarrinho()
        {
            //Arrange - criacao dos produtos
            Produto produto1 = new Produto
            {
                ProdutoId = 1,
                Nome = "Teste 1"
            };

            Produto produto2 = new Produto
            {
                ProdutoId = 2,
                Nome = "Teste 2"
            };

            //Arrange
            Carrinho carrinho = new Carrinho();

            carrinho.AdicionarItem(produto1, 2);
            carrinho.AdicionarItem(produto2, 3);

            //Act
            ItemCarrinho[] itens = carrinho.ItensCarrinhos.ToArray();

            //Assert
            Assert.AreEqual(itens.Length, 2);

            //Assert.AreEqual(itens[0].Produto, produto1);
            //Assert.AreEqual(itens[1].Produto, produto2);
        }
 //retorna o carrinho e a Url
 public ViewResult Index(Carrinho carrinho, string returnurl)
 {
     return View(new CarrinhoViewModel
     {
         Carrinho = carrinho,
         ReturnUrl = returnurl
     });
 }
 private Carrinho ObterCarrinho()
 {
     Carrinho carrinho = (Carrinho)Session["Carrinho"];
     if (carrinho == null)
     {
         carrinho = new Carrinho();
         Session["Carrinho"] = carrinho;
     }
         return carrinho;
 }
        public RedirectToRouteResult Remover(Carrinho carrinho ,int produtoId, string returnUrl)
        {
            _repositorio = new ProdutosRepositorio();

            Produto produto = _repositorio.Produtos.FirstOrDefault(p => p.ProdutoId == produtoId);

            if (produto != null)
            {
                carrinho.RemoverItem(produto);
            }
            return RedirectToAction("Index", new {returnUrl});
        }
        public void Processarpedido(Carrinho carrinho, Pedido pedido)
        {
            using (var smtpClient = new SmtpClient())
            {
                smtpClient.EnableSsl = _emailConfiguracoes.UsarSsl;
                smtpClient.Host = _emailConfiguracoes.ServidorSmtp;
                smtpClient.Port = _emailConfiguracoes.ServidorPorta;
                smtpClient.UseDefaultCredentials = false;
                smtpClient.Credentials = new NetworkCredential(
                    _emailConfiguracoes.Usuario, _emailConfiguracoes.ServidorSmtp);

                if (_emailConfiguracoes.EscreverArquivo)
                {
                    smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
                    smtpClient.PickupDirectoryLocation = _emailConfiguracoes.PastaArquivo;
                    smtpClient.EnableSsl = false;
                }
                StringBuilder body = new StringBuilder()
                .AppendLine("Novo Pedido:")
                .AppendLine("------------")
                .AppendLine("Itens");

                foreach (var item  in carrinho.ItensCarrinhos)
                {
                    var subtotal = item.Produto.Preco*item.Quantidade;
                    body.AppendFormat("{0} x {1} (SubTotal: {2:c})", item.Quantidade, item.Produto.Nome, subtotal);
                }

                body.AppendFormat("Valor total do Pedido: {0:c}", carrinho.ObterValorTotal())
                    .AppendLine("--------------------")
                    .AppendLine("Enviar para:")
                    .AppendLine(pedido.NomeCliente)
                    .AppendLine(pedido.Email)
                    .AppendLine(pedido.Endereco ?? "")
                    .AppendLine(pedido.Cidade)
                    .AppendLine(pedido.Complemento ?? "")
                    .AppendLine("--------------------")
                    .AppendFormat("Para presente?: {0}", pedido.EmbrulhaPresente ? "Sim" : "Não");

                MailMessage mailMessage = new MailMessage(_emailConfiguracoes.De,
                    _emailConfiguracoes.Para,
                    "Novo Pedido", body.ToString()
                    );

                if (_emailConfiguracoes.EscreverArquivo)
                {
                    mailMessage.BodyEncoding = Encoding.GetEncoding("ISO-8859-1");
                }
                smtpClient.Send(mailMessage);
            }
        }
        public void ProcessarPedido(Carrinho carrinho, Pedido pedido)
        {
            using (var smtpClient = new SmtpClient())
            {
                smtpClient.EnableSsl             = _emailConfiguracoes.UsarSsl;
                smtpClient.Host                  = _emailConfiguracoes.ServidorSmtp;
                smtpClient.Port                  = _emailConfiguracoes.ServidorPorta;
                smtpClient.UseDefaultCredentials = false;
                smtpClient.Credentials           = new NetworkCredential(_emailConfiguracoes.Usuario, _emailConfiguracoes.ServidorSmtp);
                if (_emailConfiguracoes.EscreverArquivo)
                {
                    smtpClient.DeliveryMethod          = SmtpDeliveryMethod.SpecifiedPickupDirectory;
                    smtpClient.PickupDirectoryLocation = _emailConfiguracoes.PastaArquivo;
                    smtpClient.EnableSsl = false;
                }

                StringBuilder body = new StringBuilder()
                                     .AppendLine("Novo Pedido:")
                                     .AppendLine("-------")
                                     .AppendLine("Itens");

                foreach (var item in carrinho.ItensCarrinho)
                {
                    var subtotal = item.Produto.Preco * item.Quantidade;
                    body.AppendFormat("{0} x {1} (subtotal : {2:c}", item.Quantidade, item.Produto.Nome, subtotal);
                }

                body.AppendFormat("Valor Total do Pedido:{0:c}", carrinho.ObterValorTotal())
                .AppendLine("----------------------")
                .AppendLine("Enviar para:")
                .AppendLine(pedido.NomeCliente)
                .AppendLine(pedido.Email)
                .AppendLine(pedido.Endereco ?? "")
                .AppendLine(pedido.Cidade ?? "")
                .AppendLine(pedido.Complemento ?? "")
                .AppendLine("----------------------")
                .AppendFormat("Para Presente?: {0}", pedido.EmbrulhaPresente ? "Sim" : "Não");

                MailMessage mailMessage = new MailMessage(_emailConfiguracoes.De, _emailConfiguracoes.Para, "Novo Pedido", body.ToString());

                if (_emailConfiguracoes.EscreverArquivo)
                {
                    mailMessage.BodyEncoding = Encoding.GetEncoding("ISO-8859-1");
                }

                smtpClient.Send(mailMessage);
            }
        }
        public void AdicionarProdutoExistenteAoCarrinho()
        {
            #region [-- Arrange --]

            Produtos produto01 = new Produtos
            {
                ProdutoId = 1,
                Nome = "teste 1"
            };

            Produtos produto02 = new Produtos
            {
                ProdutoId = 2,
                Nome = "teste 2"
            };

            Produtos produto03 = new Produtos
            {
                ProdutoId = 3,
                Nome = "teste 3"
            };

            Carrinho carrinho = new Carrinho();

            #endregion

            #region [-- Action --]

            carrinho.AdicionarItem(produto01, 2);
            carrinho.AdicionarItem(produto02, 3);
            carrinho.AdicionarItem(produto03, 5);
            carrinho.AdicionarItem(produto01, 7);

            ItensCarrinho[] itens = carrinho.ItensCarrinho.OrderBy(c => c.Produto.ProdutoId).ToArray();

            #endregion

            #region [-- Assert --]

            Assert.AreEqual(itens.Length, 3);
            Assert.AreEqual(itens[0].Produto, produto01);
            Assert.AreEqual(itens[1].Produto, produto02);
            Assert.AreEqual(itens[0].Quantidade, 9);

            #endregion
        }
        //ImodelBinder interface define o metodo bindModel
        //ControllerContext - incapsula uma informacao httpRequest ou seja a cada requisiçao ele vai estar encapsulando
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            //obter carrinho da sessao
            Carrinho carrinho = null;

            if (controllerContext.HttpContext.Session != null)
            {
                carrinho = (Carrinho)controllerContext.HttpContext.Session[SessionKey];
            }

            //crio o carrinho se nao tenho a sessao
            if (carrinho == null)
            {
                carrinho = new Carrinho();
                if (controllerContext.HttpContext.Session != null)
                {
                    controllerContext.HttpContext.Session[SessionKey] = carrinho;
                }
            }
            //retorno o carrinho
            return carrinho;
        }
 public PartialViewResult Resumo(Carrinho carrinho)
 {
     return PartialView(carrinho);
 }
        public void CalcularValorTotal()
        {
            Produto produto1 = new Produto
            {
                ProdutoId = 1,
                Nome = "Teste 1",
                Preco = 100M
            };
            Produto produto2 = new Produto
            {
                ProdutoId = 2,
                Nome = "Teste 2",
                Preco = 50M
            };
            //Produto produto3 = new Produto
            //{
            //    ProdutoId = 3,
            //    Nome = "Teste 3"
            //};

            Carrinho carrinho = new Carrinho();

            carrinho.AdicionarItem(produto1, 1);
            carrinho.AdicionarItem(produto2, 1);
            carrinho.AdicionarItem(produto1, 3);

            Decimal resultado = carrinho.ObterValorTotal();
            Assert.AreEqual(resultado, 500M);
        }
        public void RemoverItensCarrinho()
        {
            #region [-- Arrange --]

            Produtos produto01 = new Produtos
            {
                ProdutoId = 1,
                Nome = "teste 1"
            };

            Produtos produto02 = new Produtos
            {
                ProdutoId = 2,
                Nome = "teste 2"
            };

            Produtos produto03 = new Produtos
            {
                ProdutoId = 3,
                Nome = "teste 3"
            };

            Carrinho carrinho = new Carrinho();

            #endregion

            #region [-- Action --]

            carrinho.AdicionarItem(produto01, 2);
            carrinho.AdicionarItem(produto02, 3);
            carrinho.AdicionarItem(produto03, 5);
            carrinho.AdicionarItem(produto01, 7);

            carrinho.RemoverItem(produto02);

            #endregion

            #region [-- Assert --]

            Assert.AreEqual(carrinho.ItensCarrinho.Where(c => c.Produto == produto02).Count(), 0);
            Assert.AreEqual(carrinho.ItensCarrinho.Count(), 2);

            #endregion
        }
        public void LimparItensCarrinho()
        {
            #region [-- Arrange --]

            Produtos produto01 = new Produtos
            {
                ProdutoId = 1,
                Nome = "teste 1",
                Preco = 100M
            };

            Produtos produto02 = new Produtos
            {
                ProdutoId = 2,
                Nome = "teste 2",
                Preco = 50M
            };

            Carrinho carrinho = new Carrinho();

            #endregion

            #region [-- Action --]

            carrinho.AdicionarItem(produto01, 1);
            carrinho.AdicionarItem(produto02, 1);
            carrinho.AdicionarItem(produto01, 4);

            decimal? result = carrinho.ValorTotal();

            carrinho.LimparCarrinho();

            #endregion

            #region [-- Assert --]

            Assert.AreEqual(carrinho.ItensCarrinho.Count(), 0);

            #endregion
        }
        public void RemoverItensCarrinho()
        {
            //Arrange
            Produto produto1 = new Produto()
            {
                ProdutoId = 1,
                Nome = "Teste 1"
            };

            Produto produto2 = new Produto()
            {
                ProdutoId = 2,
                Nome = "Teste 2"
            };

            Produto produto3 = new Produto()
            {
                ProdutoId = 3,
                Nome = "Teste 3"
            };

            //Arrange
            Carrinho carrinho = new Carrinho();

            carrinho.AdicionarItem(produto1, 1);
            carrinho.AdicionarItem(produto2, 3);
            carrinho.AdicionarItem(produto3, 5);
            carrinho.AdicionarItem(produto2, 1);

            carrinho.RemoverItem(produto2);

            Assert.AreEqual(
                carrinho.ItensCarrinho.Count(c => c.Produto == produto2),
                0
            );

            Assert.AreEqual(carrinho.ItensCarrinho.Count(),2);

        }
        public void LimparItensCarrinho()
        {
            //Arrange
            Produto produto1 = new Produto()
            {
                ProdutoId = 1,
                Nome = "Teste 1",
                Preco = 100M
            };

            Produto produto2 = new Produto()
            {
                ProdutoId = 2,
                Nome = "Teste 2",
                Preco = 50M
            };
            //Arrange
            Carrinho carrinho = new Carrinho();

            carrinho.AdicionarItem(produto1, 1);
            carrinho.AdicionarItem(produto2, 1);
            carrinho.AdicionarItem(produto1, 3);
            
            carrinho.LimparCarrinho();

            Assert.AreEqual(carrinho.ItensCarrinho.Count(),0);
        }
        public void CalcularValorTotal()
        {
            //Arrange
            Produto produto1 = new Produto()
            {
                ProdutoId = 1,
                Nome = "Teste 1",
                Preco = 100M
            };

            Produto produto2 = new Produto()
            {
                ProdutoId = 2,
                Nome = "Teste 2",
                Preco = 50M
            };
            //Arrange
            Carrinho carrinho = new Carrinho();

            carrinho.AdicionarItem(produto1, 1);
            carrinho.AdicionarItem(produto2, 1);
            carrinho.AdicionarItem(produto1, 3);

            decimal resultado = carrinho.ObterValorTotal();

            Assert.AreEqual(resultado, 450M);
        }