8.3 KiB
8.3 KiB
INTEGRAÇÃO PROCESSAMENTO PÓS-PAGAMENTO - MERCADO PAGO
Status (pronto x faltando)
Pronto
- Conteúdo descrito neste documento.
Faltando
- Confirmar no código o estado real das funcionalidades e atualizar esta seção conforme necessário.
🎯 Objetivo
Implementar o processamento completo pós-pagamento na página de sucesso do Mercado Pago, replicando as operações que eram executadas no checkout tradicional, com proteção contra reprocessamento.
🛡️ NOVA FUNCIONALIDADE: Proteção Contra Reprocessamento
Problema Identificado
- Usuário podia usar o botão "voltar" do navegador
- Página era recarregada e operações executadas novamente
- Duplicação de chamadas: faturas, ajuste de estoque, entregas
Solução Implementada
1. Controle de Pedidos Processados
// Marcar pedido como processado
const marcarPedidoComoProcessado = (pedidoId: string) => {
const chave = `pedido_processado_${pedidoId}`
const dadosProcessamento = {
processadoEm: new Date().toISOString(),
timestamp: Date.now()
}
localStorage.setItem(chave, JSON.stringify(dadosProcessamento))
}
// Verificar se já foi processado (válido por 24 horas)
const verificarSePedidoJaFoiProcessado = (pedidoId: string): boolean
2. Validação Antes do Processamento
- ✅ Verifica se pedido já foi processado antes de executar operações
- ✅ Evita duplicação de faturas, ajuste de estoque e entregas
- ✅ Mostra interface adequada para pedidos já processados
3. Manipulação do Histórico do Navegador
- ✅ Detecta tentativas de volta durante processamento
- ✅ Redireciona automaticamente para evitar interferência
- ✅ Protege contra refresh acidental da página
4. Interface Visual para Pedidos Já Processados
- ⚠️ Aviso Visual: Seção específica informando que o pedido já foi processado
- 📋 Lista de Operações: Mostra o que já foi feito (fatura, estoque, entrega)
- 💡 Dica de Navegação: Sugere ir para "Meus Pedidos"
Fluxos de Proteção
Cenário 1: Primeira Visita ✅
- Pedido não está marcado como processado
- Executa todas as operações normalmente
- Marca pedido como processado ao final
Cenário 2: Volta do Navegador ⚠️
- Detecta que pedido já foi processado
- Pula todas as operações
- Mostra interface de "já processado"
- Evita duplicação de chamadas
Cenário 3: Volta Durante Processamento 🔄
- Detecta processamento em andamento
- Redireciona automaticamente para
/pedidos - Evita interferência no processamento
🛠️ Implementações Realizadas
1. Novos Imports e Dependências
Adicionado na página /src/app/pagamento/sucesso/page.tsx:
produtosVendaService- Para ajuste de estoquefaturaApiService- Para criação e atualização de faturasentregasApiService- Para criação de entregas- Novos ícones:
CogIcon,ArchiveBoxIcon
2. Estados de Controle
Novos estados adicionados para controlar o processamento:
processandoPostPagamento- Loading geral do processamentoprocessandoFatura- Loading da criação de faturafaturaId- ID da fatura criadaprocessandoEstoque- Loading do ajuste de estoqueestoqueAjustado- Flag de estoque ajustadoprocessandoEntrega- Loading da criação de entregaentregaId- ID da entrega criadaprocessamentoCompleto- Flag de processamento finalizado
3. Função processarOperacoesPosPagamento
Implementa sequencialmente:
3.1 Criação e Pagamento de Fatura
// 1. Criar fatura
const faturaResponse = await faturaApiService.criar(pedidoId)
// 2. Marcar como paga (pagamento já aprovado no MP)
const faturaUpdateResponse = await faturaApiService.atualizarStatus(faturaIdCriada, 'pago')
3.2 Ajuste de Estoque
// Mapear itens do pedido para formato do service
const itensParaAjuste = dadosPedido.itens.map((produtoId, index) => ({
produto: { id: produtoId },
quantidade: dadosPedido.quantidade[index]
}))
// Processar ajuste de estoque
const resultadoEstoque = await produtosVendaService.processarAjusteEstoquePedido(itensParaAjuste)
3.3 Criação de Entrega
// Dados da entrega
const dadosEntrega = {
entregadorId: "entregador_padrao",
empresaId: user?.empresaId || "empresa_padrao",
enderecoEntrega: "Endereço do cliente",
// ... outros campos
}
// Criar entrega
const entregaResponse = await entregasApiService.criar(dadosEntrega)
4. Integração com Fluxo Existente
A função é chamada automaticamente quando:
- O pagamento tem status
approved - O pedido é encontrado e atualizado com sucesso
- Há um delay de 1 segundo para garantir sincronização
if (status === 'approved') {
setTimeout(() => {
processarOperacoesPosPagamento(externalReference, pedidoResponse.data)
}, 1000)
}
5. Interface Visual de Progresso
Adicionada seção "Status do Processamento" que mostra:
Estados de Loading
- Processamento Geral: Ícone de engrenagem girando
- Fatura: Ícone de documento pulsando
- Estoque: Ícone de caixa pulando
- Entrega: Ícone de caminhão pulsando
Estados de Sucesso
- Fatura: ✅ "Fatura criada e paga!"
- Estoque: ✅ "Estoque atualizado!"
- Entrega: ✅ "Entrega programada!"
- Final: ✅ "Pedido processado completamente!"
🔄 Fluxo Completo
Etapa 1: Checkout com Mercado Pago
- Cliente seleciona produtos
- Vai para checkout
- Escolhe Mercado Pago
- É redirecionado para MP
- Realiza pagamento
Etapa 2: Retorno e Processamento (NOVA)
- Retorna para
/pagamento/sucesso - Sistema verifica status do pagamento
- Atualiza pedido para "aprovado"
- INICIA PROCESSAMENTO PÓS-PAGAMENTO:
- 🧾 Cria fatura e marca como paga
- 📦 Ajusta estoque dos produtos
- 🚚 Cria entrega com prazo estimado
- Exibe status completo para o cliente
📊 Benefícios
- Paridade de Funcionalidades: Mercado Pago agora tem as mesmas operações do checkout tradicional
- Transparência: Cliente vê o progresso em tempo real
- Automação Completa: Não requer intervenção manual
- Robustez: Tratamento de erros e fallbacks para cada operação
- Experiência Unificada: Interface consistente independente do método de pagamento
- 🛡️ Proteção Completa: Evita duplicação de operações em qualquer cenário
🧪 Testes de Proteção
Teste 1: Processamento Normal ✅
- Fazer pedido com Mercado Pago
- Completar pagamento
- Verificar que todas operações são executadas UMA vez
Teste 2: Volta do Navegador Após Processamento ⚠️
- Após completar Teste 1, usar botão voltar do navegador
- ✅ Verificar que operações NÃO são executadas novamente
- ✅ Verificar aviso de "Pedido Já Processado"
- ✅ Verificar que lista mostra operações já concluídas
Teste 3: Volta do Navegador Durante Processamento 🔄
- Durante processamento, tentar usar botão voltar
- ✅ Verificar redirecionamento automático para
/pedidos - ✅ Verificar que processamento não é interrompido
Teste 4: Refresh da Página 🔄
- Atualizar página (F5) após processamento completo
- ✅ Verificar que não reprocessa operações
- ✅ Verificar que mostra status de "já processado"
Teste 5: Múltiplas Tentativas 🔁
- Tentar acessar URL de sucesso várias vezes
- ✅ Verificar que processamento ocorre apenas na primeira vez
- ✅ Verificar consistência da interface
🧪 Teste Tradicional
Para testar funcionalidade básica:
- Fazer um pedido usando Mercado Pago
- Completar pagamento no ambiente MP
- Verificar retorno em
/pagamento/sucesso - Observar execução sequencial das operações
- Confirmar dados em:
- Faturas (status "pago")
- Produtos-venda (estoque ajustado)
- Entregas (entrega criada)
📝 Considerações Futuras
- Endereço de Entrega: Atualmente usando dados mock - integrar com dados reais do checkout
- Fallback Manual: Se alguma operação falhar, permitir processamento manual
- Notificações: Adicionar emails/SMS de confirmação
- Rastreamento: Integrar códigos de rastreamento reais
- 🆕 Analytics: Rastrear tentativas de reprocessamento para métricas
- 🆕 Cache Distribuído: Para ambientes com múltiplos servidores, considerar cache distribuído além do localStorage