64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
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
|
|
}
|