const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());
app.post('/webhook/cotacao-frete', async (req, res) => {
const data = req.body;
if (data.evento === 'cotacao_fretes') {
const { cotacao_id, origem, destino, peso_total, valor_total_produtos } = data;
try {
const opcoesFrete = [];
// 1. Consulta API de transportadoras
const correios = await consultarCorreios(origem.cep, destino.cep, peso_total);
opcoesFrete.push(...correios);
// 2. Tabela própria de frete
const freteTabela = calcularFretePorTabela(origem.estado, destino.estado, peso_total);
if (freteTabela) {
opcoesFrete.push(freteTabela);
}
// 3. Regras promocionais
if (valor_total_produtos >= 200) {
opcoesFrete.unshift({
nome: 'Frete Grátis',
descricao: 'Promoção especial!',
valor: 0.00,
prazo_entrega: 10,
observacoes: 'Válido para compras acima de R$ 200'
});
}
// 4. Frete expresso (se disponível)
if (isFreteExpressoDisponivel(origem, destino)) {
opcoesFrete.push({
nome: 'Entrega Expressa 24h',
descricao: 'Receba amanhã',
valor: 89.90,
prazo_entrega: 1,
transportadora: 'Loggi',
observacoes: 'Apenas capitais'
});
}
res.status(200).json({
status: 'OK',
cotacao_id: cotacao_id,
opcoes_frete: opcoesFrete
});
} catch (error) {
console.error('Erro ao calcular frete:', error);
res.status(200).json({
status: 'ERRO',
cotacao_id: cotacao_id,
erro: 'Não foi possível calcular o frete no momento'
});
}
} else {
res.status(400).json({ status: 'ERRO', erro: 'Evento inválido' });
}
});
async function consultarCorreios(cepOrigem, cepDestino, peso) {
// Integração com API dos Correios
// Retorna array de opções
return [
{
nome: 'PAC',
valor: 25.50,
prazo_entrega: 8,
transportadora: 'Correios',
codigo_servico: '04510'
},
{
nome: 'SEDEX',
valor: 45.90,
prazo_entrega: 3,
transportadora: 'Correios',
codigo_servico: '04014'
}
];
}
function calcularFretePorTabela(ufOrigem, ufDestino, peso) {
// Lógica de tabela própria
const tabelaFrete = {
'SP-SP': { valor: 15.00, prazo: 3 },
'SP-RJ': { valor: 20.00, prazo: 5 },
'SP-MG': { valor: 18.00, prazo: 4 }
};
const chave = `${ufOrigem}-${ufDestino}`;
const frete = tabelaFrete[chave];
if (frete) {
return {
nome: 'Transportadora Regional',
valor: frete.valor + (peso * 2), // R$ 2 por kg adicional
prazo_entrega: frete.prazo,
transportadora: 'Regional Transportes'
};
}
return null;
}
function isFreteExpressoDisponivel(origem, destino) {
const capitais = ['São Paulo', 'Rio de Janeiro', 'Belo Horizonte', 'Curitiba'];
return capitais.includes(origem.cidade) && capitais.includes(destino.cidade);
}
app.listen(3000, () => {
console.log('Webhook de cotação de frete rodando na porta 3000');
});