from typing import Dict, Any, Tuple from app.extensions import db from app.models.lead import Lead from app.models.lead_interacao import LeadInteracao from app.utils.sanitizers import sanitize_phone class WebhookService: @staticmethod def process_n8n_event(payload: Dict[str, Any]) -> Tuple[bool, str, Dict[str, Any]]: """ Processa eventos recebidos do n8n para atualizar leads e gerar logs de auditoria. """ if not payload: return False, "Payload vazio.", {} lead_id = payload.get('lead_id') telefone = payload.get('telefone') event_type = payload.get('event_type', 'webhook_n8n') new_status = payload.get('new_status') mensagem = payload.get('mensagem') or payload.get('descricao', 'Evento recebido via Webhook n8n') lead = None if lead_id: lead = db.session.get(Lead, lead_id) if not lead and telefone: sanitized = sanitize_phone(telefone) if sanitized: lead = Lead.query.filter_by(telefone_sanitizado=sanitized).first() if not lead: return False, "Lead correspondente não foi localizado no banco.", {} # Se houver atualização de status if new_status and new_status in ['novo', 'contatado', 'respondeu', 'negociacao', 'ganho', 'perdido', 'opt_out']: old_status = lead.status_funil lead.status_funil = new_status lead.atualizado_em = db.func.now() interacao_status = LeadInteracao( lead_id=lead.id, tipo='status_change', descricao=f'Status alterado via webhook n8n de "{old_status}" para "{new_status}".', metadados={'origem': 'n8n', 'old_status': old_status, 'new_status': new_status} ) db.session.add(interacao_status) # Registra a interação principal do webhook interacao_webhook = LeadInteracao( lead_id=lead.id, tipo='webhook_n8n', descricao=f"Webhook [{event_type}]: {mensagem}", metadados=payload ) db.session.add(interacao_webhook) db.session.commit() return True, "Webhook processado com sucesso.", { 'lead_id': lead.id, 'lead_nome': lead.nome_empresa, 'status_atual': lead.status_funil }