Atualizado Chat ID do Telegram: - Antigo: 661151076 (chat privado) - Novo: -1003758835428 (grupo Squad financeiro) Testes realizados: ✅ Mensagem de teste enviada (Message ID: 6) ✅ Relatório completo enviado (Message ID: 8) Fluxo atualizado: - Coleta dados do Supabase - Gera report.json - Push para GitHub - Dashboard atualiza automaticamente - Envia resumo para o GRUPO Squad financeiro ✨ Próxima execução automática: - Amanhã (13/02) às 07:00 BRT - Relatório será enviado para o grupo automaticamente
233 lines
6.9 KiB
Bash
Executable File
233 lines
6.9 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# gerar_relatorio_supabase_com_telegram.sh
|
|
# Coleta dados do Supabase, gera o dashboard e envia para o Telegram
|
|
# Executado pelo Crontab às 10:00 (UTC) -> 13:00 (BRT)
|
|
#
|
|
|
|
echo "============================================================================="
|
|
echo "📊 GERANDO RELATÓRIO FINANCEIRO (SUPABASE → DASHBOARD → TELEGRAM)"
|
|
echo "============================================================================="
|
|
echo "Horário: $(date '+%d/%m/%Y %H:%M:%S UTC')"
|
|
echo "============================================================================="
|
|
|
|
# 1. Configuração
|
|
source ~/mission-control/financeiro/config/supabase.env
|
|
|
|
DATA_ANTERIOR=$(date -d "1 day ago" +%Y-%m-%d)
|
|
DATA_ATUAL=$(date +%Y-%m-%d)
|
|
|
|
ARQUIVO_DADOS="/root/mission-control/financeiro/memory/daily/gastos-${DATA_ANTERIOR}.json"
|
|
REPO_DIR="/root/clawd/financeiro-dashboard"
|
|
|
|
echo "📅 Data de Referência: $DATA_ANTERIOR"
|
|
echo "📁 Arquivo de saída: $ARQUIVO_DADOS"
|
|
echo ""
|
|
|
|
# 2. Coletar dados do Supabase
|
|
echo "🔍 [1/5] Coletando dados do Supabase..."
|
|
RESPONSE=$(curl -s -X POST "${SUPABASE_URL}/rest/v1/rpc/get_gastos_dia_anterior" \
|
|
-H "apikey: ${SUPABASE_SERVICE_KEY}" \
|
|
-H "Authorization: Bearer ${SUPABASE_SERVICE_KEY}" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{\"org_id\": \"${ORGANIZATION_ID}\"}")
|
|
|
|
# Verificar se retornou dados
|
|
if [ -z "$RESPONSE" ]; then
|
|
echo "❌ ERRO: Resposta vazia do Supabase"
|
|
exit 1
|
|
fi
|
|
|
|
# Validar JSON
|
|
if ! echo "$RESPONSE" | python3 -m json.tool > /dev/null 2>&1; then
|
|
echo "❌ ERRO: Resposta inválida do Supabase"
|
|
echo "$RESPONSE"
|
|
exit 1
|
|
fi
|
|
|
|
# Verificar se tem transações
|
|
NUM_TRANSACOES=$(echo "$RESPONSE" | python3 -c "import sys, json; data=json.load(sys.stdin); print(len(data))")
|
|
echo "✅ $NUM_TRANSACOES transações encontradas"
|
|
|
|
if [ "$NUM_TRANSACOES" -eq 0 ]; then
|
|
echo "⚠️ AVISO: Nenhuma transação encontrada para $DATA_ANTERIOR"
|
|
echo "💡 O relatório não será gerado"
|
|
exit 0
|
|
fi
|
|
|
|
# 3. Salvar arquivo JSON
|
|
echo ""
|
|
echo "💾 [2/5] Salvando arquivo JSON..."
|
|
echo "$RESPONSE" > "$ARQUIVO_DADOS"
|
|
echo "✅ Arquivo salvo: $ARQUIVO_DADOS"
|
|
|
|
# 4. Atualizar script gerar_report_json.py para usar o arquivo correto
|
|
echo ""
|
|
echo "🔨 [3/5] Preparando para gerar dashboard..."
|
|
|
|
# 5. Executar script Python para gerar report.json
|
|
echo ""
|
|
echo "📊 [4/5] Gerando report.json..."
|
|
cd "$REPO_DIR" || { echo "❌ Erro ao entrar no repositório"; exit 1; }
|
|
|
|
python3 gerar_report_json.py
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "❌ ERRO ao gerar report.json"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ report.json gerado com sucesso"
|
|
|
|
# 6. Fazer commit e push no Git
|
|
echo ""
|
|
echo "📤 [5/6] Enviando para o GitHub..."
|
|
|
|
git add report.json > /dev/null 2>&1
|
|
|
|
# Verificar se há mudanças
|
|
git_status=$(git status --porcelain report.json)
|
|
|
|
if [ -z "$git_status" ]; then
|
|
echo "⚠️ Nenhuma alteração em report.json (mesmo que o dia anterior)"
|
|
else
|
|
# Commit
|
|
MENSAGEM="Update: Relatório diário do dia $DATA_ANTERIOR (via Supabase)
|
|
|
|
- Dados coletados via RPC get_gastos_dia_anterior
|
|
- $NUM_TRANSACOES transações
|
|
- Data do relatório: $DATA_ANTERIOR
|
|
- Gerado automaticamente às 10:00 UTC (13:00 BRT)"
|
|
|
|
git commit -m "$MENSAGEM" --quiet > /dev/null 2>&1
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "❌ ERRO ao fazer commit"
|
|
exit 1
|
|
fi
|
|
|
|
# Push
|
|
git push origin main --quiet > /dev/null 2>&1
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo "❌ ERRO ao fazer push para o GitHub"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ Push realizado com sucesso"
|
|
fi
|
|
|
|
# 7. Enviar resumo para o Telegram
|
|
echo ""
|
|
echo "📱 [6/6] Enviando resumo para o Telegram..."
|
|
|
|
# Gerar e enviar resumo compacto
|
|
export DATA_RELATORIO=$DATA_ANTERIOR
|
|
python3 << 'PYEOF'
|
|
import json
|
|
from collections import defaultdict
|
|
from datetime import datetime
|
|
import requests
|
|
import os
|
|
|
|
# Credenciais do Telegram
|
|
BOT_TOKEN = "8281825181:AAHUoYGdg7iUKtQoPzFxlsjpqIKGv_bQu28"
|
|
CHAT_ID = "-1003758835428" # Grupo Squad financeiro
|
|
|
|
# Obter data do relatório da variável de ambiente
|
|
data_ontem = os.environ.get('DATA_RELATORIO', datetime.now().strftime('%Y-%m-%d'))
|
|
arquivo_json = '/root/mission-control/financeiro/memory/daily/gastos-{}.json'.format(data_ontem)
|
|
|
|
with open(arquivo_json, 'r') as f:
|
|
transacoes = json.load(f)
|
|
|
|
# Agrupar por hotel
|
|
por_unidade = defaultdict(list)
|
|
for t in transacoes:
|
|
por_unidade[t['unidade']].append(t)
|
|
|
|
total_geral = sum(g['valor'] for g in transacoes)
|
|
num_transacoes = len(transacoes)
|
|
|
|
# Top hotéis por gasto
|
|
top_hoteis = sorted(por_unidade.items(), key=lambda x: sum(g['valor'] for g in x[1]), reverse=True)[:5]
|
|
|
|
# Gerar resumo
|
|
resumo = """📊 RELATÓRIO FINANCEIRO - {}
|
|
|
|
💰 TOTAL: R$ {:,.2f}
|
|
📝 TRANSAÇÕES: {}
|
|
🏨 HOTÉIS: {}
|
|
|
|
━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
TOP HOTÉIS:
|
|
""".format(data_ontem, total_geral, num_transacoes, len(por_unidade))
|
|
|
|
for i, (unidade, gastos) in enumerate(top_hoteis, 1):
|
|
total_unidade = sum(g['valor'] for g in gastos)
|
|
num_items = len(gastos)
|
|
resumo += "\n{}. {} - R$ {:,.2f} ({} transações)".format(i, unidade, total_unidade, num_items)
|
|
|
|
resumo += """
|
|
━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
📱 DASHBOARD: https://rodribm10.github.io/financeiro-dashboard/
|
|
|
|
🤖 Enviado automaticamente pelo Squad Financeiro
|
|
📅 Data do relatório: {}
|
|
""".format(data_ontem)
|
|
|
|
# Enviar para o Telegram
|
|
url = "https://api.telegram.org/bot{}/sendMessage".format(BOT_TOKEN)
|
|
payload = {
|
|
"chat_id": CHAT_ID,
|
|
"text": resumo,
|
|
"parse_mode": "Markdown"
|
|
}
|
|
|
|
try:
|
|
response = requests.post(url, json=payload, timeout=10)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
if data.get('ok'):
|
|
print("✅ Relatório enviado para o Telegram com sucesso!")
|
|
print("📋 Message ID: {}".format(data.get('result', {}).get('message_id', 'N/A')))
|
|
else:
|
|
print("❌ Erro na API do Telegram: {}".format(data.get('description', 'Erro desconhecido')))
|
|
else:
|
|
print("❌ Erro HTTP {}: {}".format(response.status_code, response.text))
|
|
except Exception as e:
|
|
print("❌ Erro ao enviar para o Telegram: {}".format(str(e)))
|
|
|
|
PYEOF
|
|
|
|
echo ""
|
|
|
|
# 8. Exibir resumo final
|
|
echo "============================================================================="
|
|
echo "🎉 RELATÓRIO FINANCEIRO GERADO COM SUCESSO!"
|
|
echo "============================================================================="
|
|
echo ""
|
|
echo "📅 Data de Referência: $DATA_ANTERIOR"
|
|
echo "📊 Total de Transações: $NUM_TRANSACOES"
|
|
echo ""
|
|
|
|
# Calcular total
|
|
TOTAL=$(echo "$RESPONSE" | python3 -c "
|
|
import sys, json
|
|
data = json.load(sys.stdin)
|
|
total = sum(item['valor'] for item in data)
|
|
print('R\$ {:,.2f}'.format(total))
|
|
")
|
|
|
|
echo "💰 Valor Total: $TOTAL"
|
|
echo ""
|
|
echo "============================================================================="
|
|
echo "✅ PROCESSO CONCLUÍDO!"
|
|
echo "============================================================================="
|
|
echo ""
|
|
echo "📤 Resumo enviado automaticamente para o Telegram"
|
|
echo "📱 Dashboard atualizado: https://rodribm10.github.io/financeiro-dashboard/"
|