feat: implementacao inicial do sistema LeadRadar
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user