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); }
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; } }
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")); }