218 lines
7.5 KiB
TypeScript
218 lines
7.5 KiB
TypeScript
|
|
import { serve } from 'https://deno.land/std@0.177.0/http/server.ts'
|
|
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'
|
|
|
|
const corsHeaders = {
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
|
|
}
|
|
|
|
interface ContaRecorrente {
|
|
id: string;
|
|
user_id: string;
|
|
nome_conta: string;
|
|
descricao: string | null;
|
|
valor: number | null;
|
|
dia_vencimento: number;
|
|
hora_aviso: string;
|
|
dias_antecedencia: number;
|
|
ativo: boolean;
|
|
email_usuario: string | null;
|
|
whatsapp_usuario: string | null;
|
|
}
|
|
|
|
interface AvisoData {
|
|
conta_id: string;
|
|
user_id: string;
|
|
email_usuario: string | null;
|
|
whatsapp_usuario: string | null;
|
|
nome_conta: string;
|
|
descricao: string | null;
|
|
valor: number | null;
|
|
dia_vencimento: number;
|
|
dias_restantes: number;
|
|
data_vencimento: string;
|
|
webhook_url: string;
|
|
}
|
|
|
|
serve(async (req) => {
|
|
if (req.method === 'OPTIONS') {
|
|
return new Response(null, { headers: corsHeaders })
|
|
}
|
|
|
|
try {
|
|
const supabaseUrl = Deno.env.get('SUPABASE_URL')!
|
|
const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!
|
|
const supabase = createClient(supabaseUrl, supabaseKey)
|
|
|
|
// Usar horário de Brasília (UTC-3)
|
|
const agoraBrasilia = new Date(new Date().getTime() - (3 * 60 * 60 * 1000))
|
|
const hojeBrasilia = new Date(agoraBrasilia.getFullYear(), agoraBrasilia.getMonth(), agoraBrasilia.getDate())
|
|
const horaAtualBrasilia = agoraBrasilia.toTimeString().slice(0, 5) // HH:MM
|
|
|
|
console.log(`Executando verificação de avisos às ${horaAtualBrasilia} (horário de Brasília)`)
|
|
console.log(`Data atual (Brasília): ${hojeBrasilia.toISOString().split('T')[0]}`)
|
|
|
|
// Buscar todas as contas ativas incluindo email e whatsapp do usuário
|
|
const { data: contas, error: contasError } = await supabase
|
|
.from('contas_recorrentes')
|
|
.select('*')
|
|
.eq('ativo', true)
|
|
|
|
if (contasError) {
|
|
console.error('Erro ao buscar contas:', contasError)
|
|
throw contasError
|
|
}
|
|
|
|
console.log(`Encontradas ${contas?.length || 0} contas ativas`)
|
|
|
|
let avisosEnviados = 0
|
|
|
|
for (const conta of contas || []) {
|
|
console.log(`\n--- Processando conta: ${conta.nome_conta} ---`)
|
|
console.log(`Dia vencimento: ${conta.dia_vencimento}`)
|
|
console.log(`Dias antecedência: ${conta.dias_antecedencia}`)
|
|
console.log(`Hora aviso: ${conta.hora_aviso}`)
|
|
|
|
// Calcular próxima data de vencimento
|
|
const diaVencimento = conta.dia_vencimento
|
|
let proximoVencimento = new Date(hojeBrasilia.getFullYear(), hojeBrasilia.getMonth(), diaVencimento)
|
|
|
|
// Se o dia já passou neste mês, usar o próximo mês
|
|
if (proximoVencimento <= hojeBrasilia) {
|
|
proximoVencimento = new Date(hojeBrasilia.getFullYear(), hojeBrasilia.getMonth() + 1, diaVencimento)
|
|
}
|
|
|
|
// Calcular dias restantes
|
|
const diffTime = proximoVencimento.getTime() - hojeBrasilia.getTime()
|
|
const diasRestantes = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
|
|
|
|
console.log(`Próximo vencimento: ${proximoVencimento.toISOString().split('T')[0]}`)
|
|
console.log(`Dias restantes: ${diasRestantes}`)
|
|
console.log(`Hora atual: ${horaAtualBrasilia}, Hora aviso: ${conta.hora_aviso}`)
|
|
|
|
// Normalizar hora_aviso para comparação (pode vir como "09:00:00" do banco)
|
|
const horaAvisoNormalizada = conta.hora_aviso ? conta.hora_aviso.substring(0, 5) : ''
|
|
|
|
// Verificar se deve enviar aviso
|
|
// Enviar aviso nos dias de antecedência E no dia do vencimento
|
|
const deveEnviarAviso = (
|
|
(diasRestantes <= conta.dias_antecedencia && diasRestantes >= 0) &&
|
|
horaAtualBrasilia === horaAvisoNormalizada
|
|
)
|
|
|
|
console.log(`Deve enviar aviso: ${deveEnviarAviso}`)
|
|
|
|
if (deveEnviarAviso) {
|
|
console.log(`🔔 Enviando aviso para conta: ${conta.nome_conta}, dias restantes: ${diasRestantes}`)
|
|
|
|
// Verificar se já foi enviado aviso hoje
|
|
const dataAviso = hojeBrasilia.toISOString().split('T')[0]
|
|
const { data: avisoExistente } = await supabase
|
|
.from('avisos_enviados')
|
|
.select('id')
|
|
.eq('conta_id', conta.id)
|
|
.eq('data_aviso', dataAviso)
|
|
.single()
|
|
|
|
if (avisoExistente) {
|
|
console.log(`⚠️ Aviso já enviado hoje para conta: ${conta.nome_conta}`)
|
|
continue
|
|
}
|
|
|
|
// Preparar dados para o webhook
|
|
const avisoData: AvisoData = {
|
|
conta_id: conta.id,
|
|
user_id: conta.user_id,
|
|
email_usuario: conta.email_usuario,
|
|
whatsapp_usuario: conta.whatsapp_usuario,
|
|
nome_conta: conta.nome_conta,
|
|
descricao: conta.descricao,
|
|
valor: conta.valor,
|
|
dia_vencimento: conta.dia_vencimento,
|
|
dias_restantes: diasRestantes,
|
|
data_vencimento: proximoVencimento.toISOString().split('T')[0],
|
|
webhook_url: 'https://webhookn8n.innova1001.com.br/webhook/avisosfinancehome'
|
|
}
|
|
|
|
console.log(`📤 Dados do webhook:`, JSON.stringify(avisoData, null, 2))
|
|
|
|
try {
|
|
// Enviar webhook
|
|
const webhookResponse = await fetch('https://webhookn8n.innova1001.com.br/webhook/avisosfinancehome', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(avisoData),
|
|
})
|
|
|
|
const statusEnvio = webhookResponse.ok ? 'enviado' : 'erro'
|
|
console.log(`📊 Status do webhook: ${webhookResponse.status} - ${statusEnvio}`)
|
|
|
|
// Registrar envio
|
|
await supabase
|
|
.from('avisos_enviados')
|
|
.insert({
|
|
conta_id: conta.id,
|
|
data_aviso: dataAviso,
|
|
hora_aviso: horaAtualBrasilia,
|
|
dados_webhook: avisoData,
|
|
status_envio: statusEnvio,
|
|
tentativas: 1
|
|
})
|
|
|
|
if (webhookResponse.ok) {
|
|
avisosEnviados++
|
|
console.log(`✅ Aviso enviado com sucesso para: ${conta.nome_conta} (${conta.whatsapp_usuario})`)
|
|
} else {
|
|
console.error(`❌ Erro ao enviar webhook para: ${conta.nome_conta} - Status: ${webhookResponse.status}`)
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error(`💥 Erro ao processar conta ${conta.nome_conta}:`, error)
|
|
|
|
// Registrar erro
|
|
await supabase
|
|
.from('avisos_enviados')
|
|
.insert({
|
|
conta_id: conta.id,
|
|
data_aviso: dataAviso,
|
|
hora_aviso: horaAtualBrasilia,
|
|
dados_webhook: avisoData,
|
|
status_envio: 'erro',
|
|
tentativas: 1
|
|
})
|
|
}
|
|
} else {
|
|
console.log(`⏭️ Não é hora de enviar aviso para: ${conta.nome_conta}`)
|
|
}
|
|
}
|
|
|
|
console.log(`\n🎯 Processamento concluído. ${avisosEnviados} avisos enviados.`)
|
|
|
|
return new Response(
|
|
JSON.stringify({
|
|
success: true,
|
|
avisosEnviados,
|
|
timestamp: agoraBrasilia.toISOString(),
|
|
horario_brasilia: horaAtualBrasilia,
|
|
data_brasilia: hojeBrasilia.toISOString().split('T')[0]
|
|
}),
|
|
{
|
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
|
}
|
|
)
|
|
|
|
} catch (error) {
|
|
console.error('💥 Erro na função de avisos:', error)
|
|
return new Response(
|
|
JSON.stringify({ error: error.message }),
|
|
{
|
|
status: 500,
|
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
|
|
}
|
|
)
|
|
}
|
|
})
|