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 overdueWindowSetting = await prisma.appSetting.findUnique({ where: { key: OVERDUE_WINDOW_KEY } })
|
||||||
const overdueWindowDays = parseInt(overdueWindowSetting?.value ?? String(OVERDUE_WINDOW_DEFAULT), 10)
|
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
|
// Shape client IDs for scoping
|
||||||
const shapeClients = await prisma.client.findMany({
|
const shapeClients = await prisma.client.findMany({
|
||||||
|
|
@ -87,11 +86,11 @@ export async function GET(request: NextRequest) {
|
||||||
where: deptTaskWhere,
|
where: deptTaskWhere,
|
||||||
_count: { id: true },
|
_count: { id: true },
|
||||||
}),
|
}),
|
||||||
// Overdue tasks (past due within window, not completed)
|
// Overdue tasks (any open task past due)
|
||||||
prisma.task.count({
|
prisma.task.count({
|
||||||
where: {
|
where: {
|
||||||
...deptTaskWhere,
|
...deptTaskWhere,
|
||||||
dueDate: { gte: overdueFrom, lt: today },
|
dueDate: { lt: today },
|
||||||
status: { notIn: ['COMPLETED', 'CANCELLED', 'NA'] },
|
status: { notIn: ['COMPLETED', 'CANCELLED', 'NA'] },
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
|
|
@ -178,7 +177,7 @@ export async function GET(request: NextRequest) {
|
||||||
const userMetrics = userWorkload.map((user) => {
|
const userMetrics = userWorkload.map((user) => {
|
||||||
const activeTasks = user.taskAssignments.map((a) => a.task)
|
const activeTasks = user.taskAssignments.map((a) => a.task)
|
||||||
const overdue = activeTasks.filter(
|
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(
|
const highPriority = activeTasks.filter(
|
||||||
(t) => t.priority === 'HIGH' || t.priority === 'URGENT'
|
(t) => t.priority === 'HIGH' || t.priority === 'URGENT'
|
||||||
|
|
|
||||||
|
|
@ -28,10 +28,9 @@ interface TeamMembersByDepartmentProps {
|
||||||
overdueWindowDays: number
|
overdueWindowDays: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export function TeamMembersByDepartment({ teamMembers, overdueWindowDays }: TeamMembersByDepartmentProps) {
|
export function TeamMembersByDepartment({ teamMembers, overdueWindowDays: _overdueWindowDays }: TeamMembersByDepartmentProps) {
|
||||||
const today = new Date()
|
const today = new Date()
|
||||||
today.setHours(0, 0, 0, 0)
|
today.setHours(0, 0, 0, 0)
|
||||||
const overdueFrom = new Date(today.getTime() - overdueWindowDays * 24 * 60 * 60 * 1000)
|
|
||||||
// Group members by department
|
// Group members by department
|
||||||
const groupedByDepartment = teamMembers.reduce((acc, member) => {
|
const groupedByDepartment = teamMembers.reduce((acc, member) => {
|
||||||
const dept = member.department || 'Unassigned'
|
const dept = member.department || 'Unassigned'
|
||||||
|
|
@ -108,7 +107,6 @@ export function TeamMembersByDepartment({ teamMembers, overdueWindowDays }: Team
|
||||||
const activeTasks = member.taskAssignments.length
|
const activeTasks = member.taskAssignments.length
|
||||||
const overdue = member.taskAssignments.filter(
|
const overdue = member.taskAssignments.filter(
|
||||||
a => a.task.dueDate &&
|
a => a.task.dueDate &&
|
||||||
new Date(a.task.dueDate) >= overdueFrom &&
|
|
||||||
new Date(a.task.dueDate) < today
|
new Date(a.task.dueDate) < today
|
||||||
).length
|
).length
|
||||||
const roles = member.userRoles.map(ur => ur.role.name).join(', ')
|
const roles = member.userRoles.map(ur => ur.role.name).join(', ')
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue