Fix reports crash: serialize Date as ISO string in churn risk query
The /api/reports/clients endpoint crashes with a 500 because Drizzle's sql template literal in a HAVING clause cannot serialize a JavaScript Date object — the postgres driver expects a string. Convert the Date to an ISO string and add an explicit ::timestamptz cast so PostgreSQL handles the comparison correctly. Closes groombook/groombook#49 Co-Authored-By: Paperclip <noreply@paperclip.ing> Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -279,6 +279,7 @@ reportsRouter.get("/clients", async (c) => {
|
||||
// Clients with no appointment in last 90 days (churn risk)
|
||||
const ninetyDaysAgo = new Date();
|
||||
ninetyDaysAgo.setDate(ninetyDaysAgo.getDate() - 90);
|
||||
const ninetyDaysAgoISO = ninetyDaysAgo.toISOString();
|
||||
|
||||
const churnRisk = await db
|
||||
.select({
|
||||
@@ -290,7 +291,7 @@ reportsRouter.get("/clients", async (c) => {
|
||||
.leftJoin(appointments, eq(appointments.clientId, clients.id))
|
||||
.groupBy(clients.id, clients.name)
|
||||
.having(
|
||||
sql`MAX(${appointments.startTime}) < ${ninetyDaysAgo} OR MAX(${appointments.startTime}) IS NULL`
|
||||
sql`MAX(${appointments.startTime}) < ${ninetyDaysAgoISO}::timestamptz OR MAX(${appointments.startTime}) IS NULL`
|
||||
)
|
||||
.orderBy(sql`MAX(${appointments.startTime}) ASC NULLS FIRST`);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user