From 99bfca0072b2073f72c8b74c782f1b7fab064b38 Mon Sep 17 00:00:00 2001 From: Sidney Date: Sun, 19 Jul 2026 23:00:30 -0300 Subject: [PATCH] fix: alinhamento fixo de agendamentos por data real no modo semana da agenda --- src/app/api/tenant/agenda/route.ts | 22 +++++++++++++++++++--- src/components/Agenda.tsx | 12 +++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/app/api/tenant/agenda/route.ts b/src/app/api/tenant/agenda/route.ts index 3e704bc..2237a58 100644 --- a/src/app/api/tenant/agenda/route.ts +++ b/src/app/api/tenant/agenda/route.ts @@ -6,6 +6,10 @@ export async function GET(req: NextRequest) { const { searchParams } = new URL(req.url); const slug = searchParams.get('slug'); + const dateParam = searchParams.get('date'); + const startDateParam = searchParams.get('startDate'); + const endDateParam = searchParams.get('endDate'); + if (!slug) { return NextResponse.json({ error: 'Missing tenant slug' }, { status: 400 }); } @@ -17,10 +21,21 @@ export async function GET(req: NextRequest) { const profsRes = await query(`SELECT id, name FROM users WHERE tenant_id = $1 AND role = 'professional'`, [tenantId]); - // In PostgreSQL, DATE columns return as Date objects or strings depending on driver. Let's cast to text. + let dateWhereClause = ''; + const queryParams: any[] = [tenantId]; + + if (startDateParam && endDateParam) { + queryParams.push(startDateParam, endDateParam); + dateWhereClause = `AND a.date >= $2 AND a.date <= $3`; + } else if (dateParam) { + queryParams.push(dateParam); + dateWhereClause = `AND a.date = $2`; + } + const apptsRes = await query(` SELECT a.id, a.professional_id as "professionalId", + TO_CHAR(a.date, 'YYYY-MM-DD') as date, COALESCE(c.name, a.client_name, 'Cliente Avulso') as client, COALESCE(s.name, 'Serviço Personalizado') as service, EXTRACT(HOUR FROM a.start_time) as "startHour", @@ -30,8 +45,9 @@ export async function GET(req: NextRequest) { FROM appointments a LEFT JOIN clients c ON a.client_id = c.id LEFT JOIN services s ON a.service_id = s.id - WHERE a.tenant_id = $1 AND a.date = CURRENT_DATE - `, [tenantId]); + WHERE a.tenant_id = $1 ${dateWhereClause} + ORDER BY a.date ASC, a.start_time ASC + `, queryParams); const colors = ['#6C63FF', '#a855f7', '#10b981', '#f59e0b', '#ef4444']; const professionals = profsRes.rows.map((p, i) => ({ diff --git a/src/components/Agenda.tsx b/src/components/Agenda.tsx index 6aad506..939d1ea 100644 --- a/src/components/Agenda.tsx +++ b/src/components/Agenda.tsx @@ -38,8 +38,11 @@ export default function Agenda() { const fetchAgenda = async () => { try { const slug = localStorage.getItem('agendapro_tenant_slug') || 'barbearia-premium'; + const startOfWeekStr = weekDays[0].toISOString().split('T')[0]; + const endOfWeekStr = weekDays[6].toISOString().split('T')[0]; + const [agendaRes, servicesRes] = await Promise.all([ - fetch(`/api/tenant/agenda?slug=${slug}`), + fetch(`/api/tenant/agenda?slug=${slug}&startDate=${startOfWeekStr}&endDate=${endOfWeekStr}`), fetch(`/api/tenant/services?slug=${slug}`) ]); @@ -210,7 +213,8 @@ export default function Agenda() { {professionals.map(prof => { - const visibleAppointments = appointments.filter(a => a.professionalId === prof.id); + const selectedDateStr = currentDate.toISOString().split('T')[0]; + const visibleAppointments = appointments.filter(a => a.professionalId === prof.id && (a.date === selectedDateStr || !a.date)); return (
@@ -290,9 +294,7 @@ export default function Agenda() {
{weekDays.map(day => { const dayStr = day.toISOString().split('T')[0]; - // Para homologação estática, os agendamentos do dia ativo usam a data selecionada - const isSelected = day.toDateString() === currentDate.toDateString(); - const dayApts = isSelected ? appointments : []; + const dayApts = appointments.filter(a => a.date === dayStr); return (