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)
|
// Clients with no appointment in last 90 days (churn risk)
|
||||||
const ninetyDaysAgo = new Date();
|
const ninetyDaysAgo = new Date();
|
||||||
ninetyDaysAgo.setDate(ninetyDaysAgo.getDate() - 90);
|
ninetyDaysAgo.setDate(ninetyDaysAgo.getDate() - 90);
|
||||||
|
const ninetyDaysAgoISO = ninetyDaysAgo.toISOString();
|
||||||
|
|
||||||
const churnRisk = await db
|
const churnRisk = await db
|
||||||
.select({
|
.select({
|
||||||
@@ -290,7 +291,7 @@ reportsRouter.get("/clients", async (c) => {
|
|||||||
.leftJoin(appointments, eq(appointments.clientId, clients.id))
|
.leftJoin(appointments, eq(appointments.clientId, clients.id))
|
||||||
.groupBy(clients.id, clients.name)
|
.groupBy(clients.id, clients.name)
|
||||||
.having(
|
.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`);
|
.orderBy(sql`MAX(${appointments.startTime}) ASC NULLS FIRST`);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user