'use strict' const Order = require('../models/Order') const Ticket = require('../models/Ticket') const WhatsappCore = require('../services/whatsappService') const ASAAS_WEBHOOK_TOKEN = process.env.ASAAS_WEBHOOK_TOKEN const webhookController = { async asaasWebhook(req, res) { try { if (!ASAAS_WEBHOOK_TOKEN) { console.error('[Webhook Asaas] ASAAS_WEBHOOK_TOKEN não configurado') return res.status(500).json({ error: 'Configuração incompleta' }) } const incomingToken = req.headers['asaas-access-token'] if (!incomingToken || incomingToken !== ASAAS_WEBHOOK_TOKEN) { console.warn('[Webhook Asaas] Token inválido rejeitado') return res.status(401).json({ error: 'Não autorizado' }) } const { event, payment } = req.body if (!event || !payment) { return res.status(400).json({ error: 'Payload inválido' }) } console.log(`[Webhook Asaas] Recebido evento: ${event} para o pagamento ${payment.id}`) if (event === 'PAYMENT_CONFIRMED' || event === 'PAYMENT_RECEIVED') { const order = await Order.findByAsaasId(payment.id) if (!order) { console.error(`[Webhook Asaas] Pedido não encontrado para payment.id: ${payment.id}`) return res.status(404).json({ error: 'Pedido não encontrado' }) } if (order.status !== 'paid') { await Order.updateStatus(order.id, 'paid') await Ticket.confirmOrder(order.id) // Fase 7: Dispara Confirmação de Compra pelo WhatsApp via BullMQ Fila const getTickets = await Ticket.getByOrderId(order.id) if (getTickets && getTickets.length > 0) { const userPhone = getTickets[0].usuario_telefone const numerosComprados = getTickets.map(t => t.numero).join(', ') WhatsappCore.sendNotification({ userId: null, phone: userPhone, type: 'purchase_confirmed', variables: { numeros: numerosComprados, valor: parseFloat(order.total_amount).toFixed(2), link: `${process.env.APP_URL || 'http://alemaoconveniencias.local'}/meus-premios` } }).catch(console.error) } console.log(`[Webhook Asaas] Pagamento confirmado! Pedido ${order.id} status atualizado para 'paid' e tickets garantidos.`) } else { console.log(`[Webhook Asaas] Pedido ${order.id} já estava marcado como 'paid'.`) } } else if (event === 'PAYMENT_DELETED' || event === 'PAYMENT_OVERDUE') { const order = await Order.findByAsaasId(payment.id) if (order && order.status !== 'paid') { await Order.updateStatus(order.id, event === 'PAYMENT_DELETED' ? 'canceled' : 'expired') } } return res.json({ success: true }) } catch (error) { console.error('[Webhook Asaas] Erro no processamento:', error) return res.status(500).json({ error: 'Erro interno no processamento do webhook' }) } } } module.exports = webhookController