Beispiel #1
0
        private static PedidoModel ToPedidoModel(CarrinhoPagamentoViewModel carrinhoPagamentoViewModel, int usuarioId, double subTotal, double descontoTotal, CorreioWebServiceViewModel dadosEnvio)
        {
            var pedidoModel = new PedidoModel(
                usuarioId,
                carrinhoPagamentoViewModel.FormaPagamento,
                carrinhoPagamentoViewModel.Parcelas,
                subTotal,
                descontoTotal,
                (subTotal + double.Parse(dadosEnvio.Valor)) - descontoTotal,
                double.Parse(dadosEnvio.Valor),
                dadosEnvio.Servico,
                carrinhoPagamentoViewModel.Cep,
                carrinhoPagamentoViewModel.Rua,
                carrinhoPagamentoViewModel.Numero,
                carrinhoPagamentoViewModel.Complemento,
                carrinhoPagamentoViewModel.Bairro,
                carrinhoPagamentoViewModel.Cidade,
                carrinhoPagamentoViewModel.Estado,
                TimeZoneInfo.ConvertTime(DateTime.Now,
                                         TimeZoneInfo.FindSystemTimeZoneById("E. South America Standard Time")),
                carrinhoPagamentoViewModel.ObsPagamento,
                0
                );

            return(pedidoModel);
        }
Beispiel #2
0
        public async Task <(bool, string, string, int)> FinalizarPedido(CarrinhoPagamentoViewModel carrinhoPagamentoViewModel, IEnumerable <CarrinhoViewModel> carrinho, string userId, string transactionData, CorreioWebServiceViewModel dadosEnvio)
        {
            try
            {
                var carrinhoViewModels = carrinho.ToList();

                if (!await VerificarEstoqueFinalizacao(carrinhoViewModels))
                {
                    return(false, null, "estoque", 0);
                }

                var usuario = await _usuarioServices.GetByUserIdAsync(userId);

                var produtoCarrinho = carrinhoViewModels.Any(x => x.Produto != null);

                double valorTotal    = 0;
                double descontoTotal = 0;

                var listaProdutos = new List <CarrinhoViewModel>();
                var listaKits     = new List <CarrinhoViewModel>();

                if (produtoCarrinho)
                {
                    listaProdutos = carrinhoViewModels.FindAll(x => x.Produto != null);

                    valorTotal    += listaProdutos.Sum(x => double.Parse(x.Produto.ValorVenda) * x.QuantidadeIndividual);
                    descontoTotal += listaProdutos.Sum(x => x.DescontoUnitarioProduto);
                }

                var kitsCarrinho = carrinhoViewModels.Any(x => x.Kits != null);

                if (kitsCarrinho)
                {
                    listaKits   = carrinhoViewModels.FindAll(x => x.Kits != null);
                    valorTotal += listaKits.Sum(x => double.Parse(x.Kits.ValorVenda) * x.QuantidadeIndividual);
                }

                if (usuario.DescontoCliente > 0)
                {
                    var descontoCliente = valorTotal * (usuario.DescontoCliente / 100);
                    descontoTotal += descontoCliente;
                }


                var pedidoModel = ToPedidoModel(carrinhoPagamentoViewModel, usuario.Id, valorTotal, descontoTotal, dadosEnvio);

                if (transactionData != null)
                {
                    var pagarMeModel = JsonConvert.DeserializeObject <PagarMeModel>(transactionData);

                    if (pagarMeModel.Installments == null)
                    {
                        pagarMeModel.SetInstallments("1");
                    }

                    if (!await CheckInstallments(pedidoModel.FormaDePagamento, pedidoModel.ValorTotal, int.Parse(pagarMeModel.Installments)))
                    {
                        return(false, null, "parcela", 0);
                    }

                    var orderProducts = await ToPedidoProdutoModel(listaProdutos, 0);

                    var pagarMeReturnModel = await _pedidoService.CreatePagarMeTransaction(pagarMeModel, pedidoModel, orderProducts, userId);

                    if (pagarMeReturnModel.TransactionStatus != "paid" && pagarMeReturnModel.TransactionStatus != "authorized")
                    {
                        return(false, null, "pagamento", 0);
                    }

                    pedidoModel.SetTransactionStatus(pagarMeReturnModel.TransactionStatus);
                    pedidoModel.SetTid(pagarMeReturnModel.Tid);
                    pedidoModel.SetAuthorizationCode(pagarMeReturnModel.AuthorizationCode);
                    pedidoModel.SetGateway("Stone");
                }

                using var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);

                var idPedido = await _pedidoService.CreateReturningIdAsync(pedidoModel);

                var produtosDoPedido = new List <PedidoProdutosModel>();

                if (listaProdutos.Any())
                {
                    produtosDoPedido = await ToPedidoProdutoModel(listaProdutos, idPedido);

                    await _pedidoService.CreateProdutosAsync(produtosDoPedido, new List <PedidoKitModel>());
                }

                if (listaKits.Any())
                {
                    var kitsDoPedido = await ToPedidoKitModel(listaKits, idPedido);

                    await _pedidoService.CreateProdutosAsync(new List <PedidoProdutosModel>(), kitsDoPedido);
                }

                scope.Complete();

                return(true, usuario.NomeCompleto, null, idPedido);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
Beispiel #3
0
        public async Task <IActionResult> Finalizar([Bind("FormaPagamento,Parcelas,ObsPagamento,Cep,Rua,Numero,Complemento,Bairro,Cidade,Estado")] CarrinhoPagamentoViewModel carrinhoPagamentoViewModel, string transactionData, string servicoFrete)
        {
            bool   statusPedido;
            string nomeCompleto;
            string erro;
            int    idPedido;

            var carrinho = SessionHelper.GetObjectFromJson <List <CarrinhoViewModel> >(HttpContext.Session, "cart");

            if (!ModelState.IsValid)
            {
                TempData["Error"] = "Todos os campos são obrigatórios";

                return(RedirectToAction("Pagamento", "Carrinho"));
            }

            if (carrinho == null)
            {
                TempData["Error"] = "O carrinho está vazio.";

                return(RedirectToAction("Pagamento", "Carrinho"));
            }

            if (TempData["frete"].ToString() != "gratis" && servicoFrete == "proprio")
            {
                TempData["Error"] = "Selecione o frete";

                return(RedirectToAction("Pagamento", "Carrinho"));
            }


            var user = await _userManager.GetUserAsync(User);

            try
            {
                var freteJson =
                    JsonConvert.DeserializeObject <IEnumerable <CorreioWebServiceViewModel> >(TempData["frete"]
                                                                                              .ToString());

                var dadosEnvio = freteJson.First(x => x.Servico == servicoFrete);

                var(status, nome, mensagemDoErro, pedido) = await _pedidoAppServices.FinalizarPedido(carrinhoPagamentoViewModel, carrinho, user.Id, transactionData, dadosEnvio);

                statusPedido = status;
                nomeCompleto = nome;
                erro         = mensagemDoErro;
                idPedido     = pedido;
            }
            catch (Exception)
            {
                TempData["Error"] = $"Ocorreu um erro ao finalizar o pedido. Caso o erro persista, entre em contato pelo 'Fale Conosco'";
                return(RedirectToAction("Pagamento", "Carrinho"));
            }

            if (statusPedido)
            {
                await _pedidoAppServices.EnviarConfirmacaoPedidoEmail(idPedido, nomeCompleto, user.Email);

                carrinho.Clear();
                SessionHelper.SetObjectAsJson(HttpContext.Session, "cart", carrinho);
                TempData["Pedido"] = idPedido.ToString();
                return(RedirectToAction("Success"));
            }

            TempData["Error"] = erro switch
            {
                "estoque" => "Um ou mais itens do pedido estão com estoque insuficiente",
                "pagamento" => "01 - Ocorreu um erro ao processar o pagamento.",
                "parcela" => "02 - Ocorreu um erro ao processar o pagamento.",
                _ => TempData["Error"]
            };

            return(RedirectToAction("Pagamento", "Carrinho"));
        }