šŸ“‘ Fluxo Financeiro WhatsApp (n8n + WAHA)

Este fluxo integra o WhatsApp com Google Sheets para gerenciar finanƧas pessoais de forma conversacional.
O usuƔrio interage enviando mensagens no WhatsApp, e o sistema interpreta, classifica e registra automaticamente.


šŸ”„ VisĆ£o Geral da ExperiĆŖncia do UsuĆ”rio

  1. UsuƔrio envia mensagem no WhatsApp.

  2. O bot marca a mensagem como lida.

  3. O sistema interpreta a intenção do usuÔrio:

    • 1 → LanƧar Transação (entrada/saĆ­da).

    • 2 → Pedir Resumo.

    • 3 → Ajustar Saldo manual.

    • 4 → Pagamento de Fatura.

  4. O fluxo atualiza as planilhas do Google Sheets:

    • Contas → saldos/limites.

    • Transacoes → histórico.

    • MemoriaTemporaria → estado da conversa.

  5. O usuÔrio recebe feedback em mensagens de confirmação ou resumo.


🧩 Nodos Detalhados

1. Webhook

  • Função: Ponto de entrada. Recebe mensagens do WhatsApp via WAHA.

  • SaĆ­da: Payload com dados crus (quem enviou, texto, horĆ”rio, etc.).


2. Preparar_Dados_Mensagem (Set)

  • Função: Extrai campos Ćŗteis do payload inicial.

  • Atributos extraĆ­dos:

    • session → ID da sessĆ£o WhatsApp.

    • chatId → ID do chat.

    • pushName → Nome do contato.

    • payload_id → ID da mensagem.

    • event → Tipo de evento (ex: message).

    • message → Texto enviado.

    • fromMe → Se a msg foi enviada pelo próprio bot.

    • messageTime → Timestamp atual.


3. Marcar_Mensagem_Como_Lida (WAHA - Send Seen)

  • Função: Marca a mensagem recebida como ā€œvisualizadaā€.

4. Filtrar_Conversas_Autorizadas (Switch)

  • Função: Permite apenas mensagens de nĆŗmeros cadastrados (Yan e Raquel).

  • Condição:

    {{ $('Dados').item.json.chatId == ('[email protected]' || '[email protected]') 
       && ($('Dados').item.json.event=='message') }}

5. Ɖ_Resposta_NumĆ©rica? (If)

  • Função: Verifica se a mensagem Ć© apenas um nĆŗmero (regex ^\d+$).

  • Caminhos:

    • āœ… Sim → Buscar memória e continuar fluxo de transação.

    • āŒ NĆ£o → Envia para classificação de intenção.


6. Classificar_Intencao_Usuario (AI Agent)

  • Função: Classifica a mensagem do usuĆ”rio em 4 intenƧƵes.

  • Prompt de Sistema:

    Você é um assistente classificador de intenções para um bot de finanças pessoais.  
    Responda APENAS com o nĆŗmero da categoria.
    
    Categorias:
    1. Lançar Transação
    2. Pedir Resumo
    3. Ajustar Saldo
    4. Pagar Fatura
    

7. Roteamento_Intencao (Switch)

  • Função: Direciona para o subfluxo certo.

  • SaĆ­das:

    • 1 → Fluxo de Transação.

    • 2 → Fluxo de Resumo.

    • 3 → Fluxo de Ajuste.

    • 4 → Fluxo de Pagamento.


šŸš€ Fluxo 1 — LanƧar Transação

8. Extrair_Detalhes_Transacao (AI Agent)

  • Função: Estrutura a mensagem em JSON financeiro.

  • Prompt de Sistema:

    Sua única função é extrair informações financeiras de uma mensagem e formatÔ-las em JSON.
    
    Estrutura:
    {
      "pessoa": "Nome Pessoa",
      "data": "AAAA-MM-DD",
      "mes": "Nome do MĆŖs",
      "transacao": "Descrição",
      "tipo": "Entrada ou Despesa",
      "entrada": 0.00,
      "saida": 0.00
    }
    

9. Validar_JSON_Transacao (Code)

const rawOutput = $input.first().json.output;
const match = rawOutput.match(/{[\s\S]*}/);
if (match && match[0]) {
  return JSON.parse(match[0]);
}
return { error: "Nenhum JSON vƔlido foi encontrado na resposta." };

10. Validar_Valores (Switch)

  • Condição:

    • Se entrada == 0 && saida == 0 → erro.

    • Caso contrĆ”rio → segue.


11. Guardar_Memoria_Temporaria (Google Sheets)

  • Função: Salva a transação temporariamente atĆ© a conta ser escolhida.

12. Buscar_Contas_Disponiveis (Google Sheets)

  • Função: Lista as contas cadastradas.

13. Formatar_Pergunta_Conta (Code)

const contas = $('Buscar_Contas').all();
let mensagem = "Entendido! Onde foi essa despesa?\n\n";
contas.forEach((conta) => {
  mensagem += `${conta.json.ID}. ${conta.json['Nome da Conta']}\n`;
});
return { mensagem };

14. Enviar_Pergunta_Conta (WAHA - Send Text)

  • Envia lista de contas para escolha.

15. Identificar_Conta (Google Sheets)

  • Busca a conta pelo nĆŗmero digitado.

16. Selecionar_Ultima_Memoria (Code)

const todasMemorias = $('Buscar_na_Memoria').all();
todasMemorias.sort((a, b) => b.json.Timestamp - a.json.Timestamp);
return todasMemorias[0];

17. Registrar_Transacao_Final (Google Sheets)

  • Grava a transação na aba Transacoes.

18. Calcular_Novo_Saldo (Code)

const conta = $('Identificar_Conta').first().json;
const tipoConta = conta.Tipo;
let saldoAntigo = parseFloat(conta['Saldo / Limite DisponĆ­vel']);
if (Number.isNaN(saldoAntigo)) saldoAntigo = 0;
 
const memoria = $('Pegar_Ultima_Memoria').first().json;
const tipoTransacao = memoria.Tipo;
let valorTransacao = parseFloat(memoria.Valor);
if (Number.isNaN(valorTransacao)) valorTransacao = 0;
 
let novoSaldo = saldoAntigo;
 
if (tipoConta === 'DƩbito') {
  novoSaldo += (tipoTransacao === 'Entrada' ? valorTransacao : -valorTransacao);
} else if (tipoConta === 'CrƩdito') {
  novoSaldo += (tipoTransacao === 'Entrada' ? valorTransacao : -valorTransacao);
}
 
return { novoSaldo: novoSaldo.toFixed(2) };

19. Atualizar_Saldo_Conta (Google Sheets)

  • Atualiza saldo/limite disponĆ­vel.

20. Limpar_Memoria_Temporaria (Google Sheets)

  • Apaga a memória usada.

21. Confirmar_Registro (WAHA - Send Text)

  • Mensagem final:
    āœ… ā€œTransação registrada com sucesso!ā€

šŸš€ Fluxo 2 — Pedir Resumo

22. Buscar_Saldos (Google Sheets)

  • Recupera todos os saldos.

23. Formatar_Resumo_Financeiro (Code)

const contas = $('Buscar_Saldos').all();
let mensagem = "šŸ“Š *Resumo Financeiro Atual* šŸ“Š\n\n";
 
const contasDebito = contas.filter(c => c.json.Tipo === 'DƩbito');
if (contasDebito.length > 0) {
  mensagem += "šŸ’° *Saldos em Conta (DĆ©bito):*\n";
  contasDebito.forEach(conta => {
    let saldo = parseFloat(conta.json['Saldo / Limite DisponĆ­vel']);
    if (Number.isNaN(saldo)) saldo = 0;
    mensagem += `- ${conta.json['Nome da Conta']}: R$ ${saldo.toFixed(2)}\n`;
  });
}
 
const contasCredito = contas.filter(c => c.json.Tipo === 'CrƩdito');
if (contasCredito.length > 0) {
  mensagem += "\nšŸ’³ *Limites DisponĆ­veis (CrĆ©dito):*\n";
  contasCredito.forEach(conta => {
    let limite = parseFloat(conta.json['Saldo / Limite DisponĆ­vel']);
    if (Number.isNaN(limite)) limite = 0;
    mensagem += `- ${conta.json['Nome da Conta']}: R$ ${limite.toFixed(2)}\n`;
  });
}
 
return { mensagem };

24. Enviar_Resumo_Financeiro (WAHA - Send Text)

  • Envia o resumo formatado.

šŸš€ Fluxo 3 — Ajustar Saldo

25. Extrair_Detalhes_Ajuste (AI Agent)

  • Prompt de Sistema:

    Sua única função é extrair o nome da conta e o novo valor de uma mensagem de ajuste de saldo.  
    Responda APENAS com:
    {"nome_conta": "Nome da Conta", "novo_valor": 1500.00}
    

26. Validar_JSON_Ajuste (Code)

const rawOutput = $input.first().json.output;
const match = rawOutput.match(/{[\s\S]*}/);
if (match && match[0]) {
  return JSON.parse(match[0]);
}
return { error: "Nenhum JSON vƔlido foi encontrado na resposta." };

27. Buscar_Todas_Contas (Google Sheets)

  • Puxa lista de contas.

28. Filtrar_Conta_Ajuste (Code)

const nomeBusca = $('AI Extrair Ajuste').first().json.nome_conta.toLowerCase();
const todasAsContas = $('Encontrar_Conta_para_Ajuste').all();
 
const contaEncontrada = todasAsContas.find(item =>
  item.json['Nome da Conta'].toLowerCase().includes(nomeBusca)
);
 
if (contaEncontrada) return contaEncontrada;
return { error: "Nenhuma conta encontrada com esse nome." };

šŸ‘‰ (Faltam conexƵes no fluxo para atualizar o saldo diretamente e enviar mensagem de confirmação.)


šŸš€ Fluxo 4 — Pagamento de Fatura

29. Extrair_Detalhes_Pagamento (AI Agent)

  • Prompt de Sistema:

    Sua função é extrair de uma mensagem de pagamento de fatura o nome do cartão de crédito e o valor pago.  
    Responda APENAS com:
    {"nome_cartao": "Nome do Cartão", "valor_pago": 1200.00}
    

šŸ‘‰ (Assim como no ajuste, falta conexĆ£o final para atualizar limite e confirmar pagamento.)


šŸ“Œ Pontos de Melhoria

  • Adicionar mensagem de confirmação para Ajuste e Pagamento.

  • Criar tratamento de erros unificado (respostas amigĆ”veis quando IA nĆ£o entende).

  • Melhorar UX do Resumo → separar ā€œcontas principaisā€ em destaque.


šŸ‘‰ Quer que eu monte tambĆ©m um diagrama em Mermaid (fluxo visual) para anexar ao .md, ou prefere manter só a documentação textual detalhada?