From 1e73a0c01f9d0dc7a8eae0e6c1e474396391a829 Mon Sep 17 00:00:00 2001 From: VPS 4 Builder Date: Tue, 7 Jul 2026 19:39:24 +0200 Subject: [PATCH] feat(agenda-bridge): proxima_janela_ts p/ agendar o envio diferido MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit /dentista-contato passa a devolver proxima_janela_ts (ISO do início da próxima janela) além do label — o motor usa como fire_at do envio diferido. Co-Authored-By: Claude Opus 4.8 --- backend/newwhats/agenda-bridge.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/newwhats/agenda-bridge.js b/backend/newwhats/agenda-bridge.js index bc8e48d..d263df0 100644 --- a/backend/newwhats/agenda-bridge.js +++ b/backend/newwhats/agenda-bridge.js @@ -139,11 +139,11 @@ function contatoPermitidoAgora(numeros, now = new Date()) { } return null; } -// Próxima janela permitida (varre os próximos 7 dias) → "segunda-feira às 08:00" | null. +// Próxima janela permitida (varre os próximos 7 dias) → { label:"segunda-feira às 08:00", ts:ISO } | null. function proximaJanela(numeros, now = new Date()) { const nowDow = now.getDay(); const nowHm = now.getHours() * 60 + now.getMinutes(); - let best = null; // { offset, ini } + let best = null; // { offset, ini, dow, inicio } for (const n of (numeros || [])) { if (String(n?.numero || '').replace(/\D/g, '').length < 10) continue; for (const j of (n.janelas || [])) { @@ -158,7 +158,9 @@ function proximaJanela(numeros, now = new Date()) { } if (!best) return null; const quando = best.offset === 0 ? 'hoje' : best.offset === 1 ? 'amanhã' : DIAS_NOME[best.dow]; - return `${quando} às ${best.inicio}`; + const dt = new Date(now); dt.setDate(dt.getDate() + best.offset); + const [h, m] = String(best.inicio).split(':').map(Number); dt.setHours(h || 0, m || 0, 0, 0); + return { label: `${quando} às ${best.inicio}`, ts: dt.toISOString() }; } export function createAgendaBridge(pool) { @@ -463,9 +465,10 @@ export function createAgendaBridge(pool) { } // Com perfil → só permite contato dentro de uma janela; senão devolve a próxima. const agora = contatoPermitidoAgora(numeros); + const prox = agora ? null : proximaJanela(numeros); res.json({ encontrado: true, dentista_id: d.id, nome: d.nome, tem_perfil: true, telefone: agora ? agora.numero : null, contato_agora: agora, - bloqueado_por_janela: !agora, proxima_janela: agora ? null : proximaJanela(numeros) }); + bloqueado_por_janela: !agora, proxima_janela: prox ? prox.label : null, proxima_janela_ts: prox ? prox.ts : null }); } catch (e) { res.status(500).json({ error: e.message }); } });