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.
This commit is contained in:
lorentz 2026-05-20 17:10:09 +00:00
parent 970ffe2864
commit c20d6b8f1a
2 changed files with 4 additions and 7 deletions

View file

@ -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'

View file

@ -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(', ')