diff --git a/sino-ia/mcp-clinica/tools/consultas.mjs b/sino-ia/mcp-clinica/tools/consultas.mjs index 685be8c..2d09c74 100644 --- a/sino-ia/mcp-clinica/tools/consultas.mjs +++ b/sino-ia/mcp-clinica/tools/consultas.mjs @@ -26,6 +26,14 @@ const addDias = (s, n) => { const d = dt(s); d.setUTCDate(d.getUTCDate() + n); r const diaSemana = (s) => WD[dt(s).getUTCDay()]; const fmtBR = (s) => { const [y, m, d] = s.split('-'); return `${d}/${m}/${y}`; }; const money = (v) => new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(v || 0); +// CONVÊNIO do atendimento. É o campo `insurance` do Fluxa, e quem o define é a recepção no painel: +// o `agendar` grava sempre "Particular" e a Dra. ou a Maria trocam para "Prefeitura" no balcão, +// junto com CPF e credenciais do exame (visível no editHistory dos registros da prefeitura). +// +// Registro SEM o campo não vira "Particular" por conta própria: são 55 documentos, todos de janeiro +// de 2026, e preencher o convênio deles por dedução seria inventar um dado de faturamento. Desde +// 01/08/2026 nenhum agendamento chega sem o campo, então na prática isto quase nunca aparece. +const convenioDe = (a) => a.insurance || 'não informado'; const isDate = (d) => /^\d{4}-\d{2}-\d{2}$/.test(d || ''); // Rótulo → intervalo {de, ate, nome}. Semana começa na SEGUNDA (convenção comercial BR). @@ -88,6 +96,11 @@ export async function consultarAgenda({ team }, args = {}) { const porStatus = {}; for (const a of appts) porStatus[a.status || 'sem status'] = (porStatus[a.status || 'sem status'] || 0) + 1; + // Contado sobre o período INTEIRO, como o porStatus, e não sobre a lista que vai truncada abaixo: + // "quantos da prefeitura amanhã" tem que continuar certo num mês com mais de 60 atendimentos. + const porConvenio = {}; + for (const a of appts) porConvenio[convenioDe(a)] = (porConvenio[convenioDe(a)] || 0) + 1; + return { profissional: membro.name, periodo: nome, de, ate, @@ -104,6 +117,7 @@ export async function consultarAgenda({ team }, args = {}) { } : undefined, total: appts.length, porStatus, + porConvenio, // CORTE NUNCA SILENCIOSO. `total` contava o período inteiro e a lista entregava 60, sem sinal // nenhum de corte: quem lia tratava os 60 como a agenda completa. Em 12/08/2026 isso me fez // concluir que quatro pacientes não tinham agendamento nenhum — as quatro tinham, estavam @@ -117,6 +131,7 @@ export async function consultarAgenda({ team }, args = {}) { data: a.date === de && de === ate ? undefined : fmtBR(a.date), hora: a.time, paciente: a.patientName, exame: a.procedure, status: a.status, valor: money(a.value), pago: a.paymentStatus === 'paid', + convenio: convenioDe(a), })), }; }