From c20d6b8f1a4dd618e7aade5455a569f7ea5cab4e Mon Sep 17 00:00:00 2001 From: lorentz Date: Wed, 20 May 2026 17:10:09 +0000 Subject: [PATCH] Fix: align overdue task counts across all surfaces Manager page and workload API were bounding overdue by a configurable window (e.g. last 30 days), while the tasks page counted ANY open task past due with no lower bound. This caused Mimi/Dawn's numbers to diverge. All three surfaces now use the same definition: open task + dueDate < today. --- ondeck/src/app/api/dashboard/workload/route.ts | 7 +++---- .../src/components/manager/team-members-by-department.tsx | 4 +--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/ondeck/src/app/api/dashboard/workload/route.ts b/ondeck/src/app/api/dashboard/workload/route.ts index 6bc3650..0098ca9 100644 --- a/ondeck/src/app/api/dashboard/workload/route.ts +++ b/ondeck/src/app/api/dashboard/workload/route.ts @@ -22,7 +22,6 @@ export async function GET(request: NextRequest) { const overdueWindowSetting = await prisma.appSetting.findUnique({ where: { key: OVERDUE_WINDOW_KEY } }) const overdueWindowDays = parseInt(overdueWindowSetting?.value ?? String(OVERDUE_WINDOW_DEFAULT), 10) - const overdueFrom = new Date(today.getTime() - overdueWindowDays * 24 * 60 * 60 * 1000) // Shape client IDs for scoping const shapeClients = await prisma.client.findMany({ @@ -87,11 +86,11 @@ export async function GET(request: NextRequest) { where: deptTaskWhere, _count: { id: true }, }), - // Overdue tasks (past due within window, not completed) + // Overdue tasks (any open task past due) prisma.task.count({ where: { ...deptTaskWhere, - dueDate: { gte: overdueFrom, lt: today }, + dueDate: { lt: today }, status: { notIn: ['COMPLETED', 'CANCELLED', 'NA'] }, }, }), @@ -178,7 +177,7 @@ export async function GET(request: NextRequest) { const userMetrics = userWorkload.map((user) => { const activeTasks = user.taskAssignments.map((a) => a.task) const overdue = activeTasks.filter( - (t) => new Date(t.dueDate) >= overdueFrom && new Date(t.dueDate) < today + (t) => new Date(t.dueDate) < today ) const highPriority = activeTasks.filter( (t) => t.priority === 'HIGH' || t.priority === 'URGENT' diff --git a/ondeck/src/components/manager/team-members-by-department.tsx b/ondeck/src/components/manager/team-members-by-department.tsx index 6f13787..b2151e1 100644 --- a/ondeck/src/components/manager/team-members-by-department.tsx +++ b/ondeck/src/components/manager/team-members-by-department.tsx @@ -28,10 +28,9 @@ interface TeamMembersByDepartmentProps { overdueWindowDays: number } -export function TeamMembersByDepartment({ teamMembers, overdueWindowDays }: TeamMembersByDepartmentProps) { +export function TeamMembersByDepartment({ teamMembers, overdueWindowDays: _overdueWindowDays }: TeamMembersByDepartmentProps) { const today = new Date() today.setHours(0, 0, 0, 0) - const overdueFrom = new Date(today.getTime() - overdueWindowDays * 24 * 60 * 60 * 1000) // Group members by department const groupedByDepartment = teamMembers.reduce((acc, member) => { const dept = member.department || 'Unassigned' @@ -108,7 +107,6 @@ export function TeamMembersByDepartment({ teamMembers, overdueWindowDays }: Team const activeTasks = member.taskAssignments.length const overdue = member.taskAssignments.filter( a => a.task.dueDate && - new Date(a.task.dueDate) >= overdueFrom && new Date(a.task.dueDate) < today ).length const roles = member.userRoles.map(ur => ur.role.name).join(', ')