feat(agenda-bridge): proxima_janela_ts p/ agendar o envio diferido
/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 <noreply@anthropic.com>
This commit is contained in:
@@ -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 }); }
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user