From 668d672531a207f17cf4a33e2b9819a193ae5402 Mon Sep 17 00:00:00 2001 From: VPS 4 Builder Date: Mon, 6 Jul 2026 05:59:32 +0200 Subject: [PATCH] =?UTF-8?q?feat(agenda):=201h=20de=20espa=C3=A7amento=20+?= =?UTF-8?q?=20filtro=20manh=C3=A3/tarde=20no=20/slots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Espaçamento/duração padrão do slot passa de 30 para 60 min (1h entre atendimentos). - /slots aceita ?periodo=manha|tarde (a Secretária pergunta o período antes de oferecer e busca só aquele período). Co-Authored-By: Claude Opus 4.8 --- backend/newwhats/agenda-bridge.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/newwhats/agenda-bridge.js b/backend/newwhats/agenda-bridge.js index cd45678..5a15968 100644 --- a/backend/newwhats/agenda-bridge.js +++ b/backend/newwhats/agenda-bridge.js @@ -12,7 +12,7 @@ import express from 'express'; import { getConfig } from './config.js'; import { resolverFeriado, feriadoNacionalNome } from './feriados.js'; -const SLOT_MIN = 30; // duração padrão do slot (min) +const SLOT_MIN = 60; // duração/espaçamento padrão do slot (1h entre atendimentos) const HORIZON_DAYS = 7; // janela padrão de busca const MAX_SLOTS = 20; // quantos slots RETORNAR (após ordenar por horário) const CANDIDATE_CAP = 240; // teto de GERAÇÃO (clínica + salas competem por horário) @@ -142,6 +142,7 @@ export function createAgendaBridge(pool) { const duration = Math.max(10, parseInt(req.query.duration, 10) || SLOT_MIN); const days = Math.min(30, Math.max(1, parseInt(req.query.days, 10) || HORIZON_DAYS)); const from = req.query.date ? new Date(`${req.query.date}T00:00:00`) : new Date(); + const periodo = req.query.periodo ? String(req.query.periodo).toLowerCase() : null; // manha|tarde try { // Dentistas no escopo da clínica. @@ -243,8 +244,11 @@ export function createAgendaBridge(pool) { } catch { /* sala_reservas pode não existir */ } } - slots.sort((a, b) => a.start.localeCompare(b.start)); - res.json({ slots: slots.slice(0, MAX_SLOTS) }); + let out = slots.sort((a, b) => a.start.localeCompare(b.start)); + // Filtro manhã/tarde (a Secretária pergunta o período antes de oferecer). + if (periodo === 'manha' || periodo === 'manhã') out = out.filter((s) => parseInt(s.start.slice(11, 13), 10) < 12); + else if (periodo === 'tarde') out = out.filter((s) => parseInt(s.start.slice(11, 13), 10) >= 12); + res.json({ slots: out.slice(0, MAX_SLOTS) }); } catch (e) { res.status(500).json({ error: e.message }); }