From 3e30fae173b09cb11303fa350401d9530b8c5bc4 Mon Sep 17 00:00:00 2001 From: echo Date: Thu, 19 Mar 2026 01:29:09 +0100 Subject: [PATCH] attendace, user stats --- apps/admin/data/fitai.db | Bin 172032 -> 172032 bytes .../src/app/api/gyms/[id]/stats/route.ts | 3 ++- apps/admin/src/app/attendance/page.tsx | 10 ++++---- apps/admin/src/components/users/UserGrid.tsx | 2 +- .../src/components/users/UserManagement.tsx | 4 +-- apps/admin/src/hooks/use-api.ts | 4 +-- apps/admin/src/lib/database/drizzle.ts | 23 ++++++++++++++---- 7 files changed, 30 insertions(+), 16 deletions(-) diff --git a/apps/admin/data/fitai.db b/apps/admin/data/fitai.db index 858699d307cedc4653fc1cec4165cc909b05faed..2e0bd3d233605c1d2ec00607a4a2b019cf9ae3b2 100644 GIT binary patch delta 407 zcmZoTz}0YoYl1Z6mWeXXj9WG)EaK<0WMJpXV&lo;Z{vHy8@X9PAc}{-h>_PmO){%t*i`x zDJ!q9vp7(zI7F+DzQW`TSxx!Gl-$g`Oq*}vjB}Z5Uw%S2Wb*}CBO!@W26lcw2L5RN zt^DWs{rEHZU-M7pFXb=YELfn*KiS^ijD>*#XiufR%;Zvg1r`ZrQ^v^x@*WnmF!V5zh)C@?Zj zDKY|jO;KUD<23BNmusLV$ z3?>;K{zwM?wfyP)6Zx<6&*%TlznlLg|5KogoB1PwZnor?;boR*gj>b~;=v3xz3yUrT!{mc=6(+Bd(-+CyZMC(sBrB`Z$g(8U+$<~E$f9)eJ(*~ha#mj7$+ogG zlVkPyCwItd+Lsh1X6B_9W!iiTXPooz!=ncorN(6jCRN2b#aX7QMR~b=wG493Kr7@W zS<*OoeL+kHNfs6c28Pn&)S}H7WQ~L*rZTYe`!VoG^Ka!p$M46V!T*}S6a+U57O3)1 zwzoH9k!N;hoLp%yqXN{YP>@ - {new Date(record.checkIn).toLocaleString()} + {new Date(record.checkInTime).toLocaleString()} - {record.checkOut - ? new Date(record.checkOut).toLocaleString() + {record.checkOutTime + ? new Date(record.checkOutTime).toLocaleString() : "-"} - - {record.checkOut ? "Completed" : "Active"} + + {record.checkOutTime ? "Completed" : "Active"} diff --git a/apps/admin/src/components/users/UserGrid.tsx b/apps/admin/src/components/users/UserGrid.tsx index adfe37b..9d94335 100644 --- a/apps/admin/src/components/users/UserGrid.tsx +++ b/apps/admin/src/components/users/UserGrid.tsx @@ -260,7 +260,7 @@ export function UserGrid({ // }, { headerName: "Last Visit", - valueGetter: (params) => params.data?.client?.lastVisit, + valueGetter: (params) => params.data?.lastCheckInTime, filter: "agDateColumnFilter", sortable: true, valueFormatter: (params: any) => diff --git a/apps/admin/src/components/users/UserManagement.tsx b/apps/admin/src/components/users/UserManagement.tsx index 3babce7..e5e7586 100644 --- a/apps/admin/src/components/users/UserManagement.tsx +++ b/apps/admin/src/components/users/UserManagement.tsx @@ -587,9 +587,9 @@ export function UserManagement({ gymId }: UserManagementProps) {

Last Visit:{" "} - {selectedUser.client.lastVisit + {selectedUser.lastCheckInTime ? new Date( - selectedUser.client.lastVisit, + selectedUser.lastCheckInTime, ).toLocaleDateString() : "Never"}

diff --git a/apps/admin/src/hooks/use-api.ts b/apps/admin/src/hooks/use-api.ts index 7073f91..10653e7 100644 --- a/apps/admin/src/hooks/use-api.ts +++ b/apps/admin/src/hooks/use-api.ts @@ -55,8 +55,8 @@ export interface Gym { export interface AttendanceRecord { id: string; userId: string; - checkIn: string; - checkOut?: string; + checkInTime: Date; + checkOutTime?: Date; date: string; type?: string; } diff --git a/apps/admin/src/lib/database/drizzle.ts b/apps/admin/src/lib/database/drizzle.ts index b0e6a35..76ce95e 100644 --- a/apps/admin/src/lib/database/drizzle.ts +++ b/apps/admin/src/lib/database/drizzle.ts @@ -1318,9 +1318,14 @@ export class DrizzleDatabase implements IDatabase { membershipStatus: String( row.membershipStatus, ) as Client["membershipStatus"], - joinDate: new Date(row.joinDate as number | Date), + joinDate: + typeof row.joinDate === "number" + ? new Date(row.joinDate * 1000) + : new Date(row.joinDate as Date), lastVisit: row.lastVisit - ? new Date(row.lastVisit as number | Date) + ? typeof row.lastVisit === "number" + ? new Date(row.lastVisit * 1000) + : new Date(row.lastVisit as Date) : undefined, emergencyContact: row.emergencyContactName ? { @@ -1363,12 +1368,20 @@ export class DrizzleDatabase implements IDatabase { id: String(row.id), userId: String(row.userId), type: String(row.type) as Attendance["type"], - checkInTime: new Date(row.checkInTime as number | Date), + checkInTime: + typeof row.checkInTime === "number" + ? new Date(row.checkInTime * 1000) + : new Date(row.checkInTime as Date), checkOutTime: row.checkOutTime - ? new Date(row.checkOutTime as number | Date) + ? typeof row.checkOutTime === "number" + ? new Date(row.checkOutTime * 1000) + : new Date(row.checkOutTime as Date) : undefined, notes: row.notes ? String(row.notes) : undefined, - createdAt: new Date(row.createdAt as number | Date), + createdAt: + typeof row.createdAt === "number" + ? new Date(row.createdAt * 1000) + : new Date(row.createdAt as Date), }; }