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:
parent
970ffe2864
commit
c20d6b8f1a
2 changed files with 4 additions and 7 deletions
|
|
@ -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'
|
||||
|
|
|
|||
|
|
@ -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(', ')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue