feat(project): menambahkan perhitungan task_done sebuah project untuk intern & admin

This commit is contained in:
Muhammad Zhafran Ilham
2026-06-26 00:09:15 +07:00
parent 119ab42afb
commit 6a69e5a055
3 changed files with 63 additions and 0 deletions
@@ -100,11 +100,18 @@ class ProjectRepository {
},
select: {
id: true,
id_user: true,
},
},
tasks: {
select: {
id: true,
submissions: {
select: {
id: true,
id_user: true,
},
},
},
},
},
@@ -239,11 +246,21 @@ class ProjectRepository {
},
select: {
id: true,
id_user: true,
},
},
tasks: {
select: {
id: true,
submissions: {
where: {
id_user: parseInt(internId),
},
select: {
id: true,
id_user: true,
},
},
},
},
},
@@ -315,11 +332,18 @@ class ProjectRepository {
},
select: {
id: true,
id_user: true,
},
},
tasks: {
select: {
id: true,
submissions: {
select: {
id: true,
id_user: true,
},
},
},
},
},
@@ -127,6 +127,7 @@ class ProjectService {
admin: this.mapAdmin(project.admin),
total_members: project.members?.length || 0,
total_tasks: project.tasks?.length || 0,
task_done: this.getProjectTaskDone(project, actor),
created_at: project.created_at,
updated_at: project.updated_at,
}));
@@ -387,6 +388,7 @@ class ProjectService {
admin: this.mapAdmin(project.admin),
total_members: project.members?.length || 0,
total_tasks: project.tasks?.length || 0,
task_done: this.getProjectTaskDone(project, actor),
created_at: project.created_at,
updated_at: project.updated_at,
}));
@@ -470,6 +472,7 @@ class ProjectService {
admin: this.mapAdmin(project.admin),
total_members: project.members?.length || 0,
total_tasks: project.tasks?.length || 0,
task_done: this.getProjectTaskDone(project, actor),
created_at: project.created_at,
updated_at: project.updated_at,
}));
@@ -581,6 +584,38 @@ class ProjectService {
return slug;
}
getProjectTaskDone(project, actor = {}) {
const tasks = project.tasks || [];
if (tasks.length === 0) {
return 0;
}
if (actor.role === "intern") {
return tasks.filter((task) =>
task.submissions?.some(
(submission) => submission.id_user === parseInt(actor.id)
)
).length;
}
const activeMembers = project.members || [];
if (activeMembers.length === 0) {
return 0;
}
return tasks.filter((task) => {
const submittedUserIds = new Set(
(task.submissions || []).map((submission) => submission.id_user)
);
return activeMembers.every((member) =>
submittedUserIds.has(member.id_user)
);
}).length;
}
}
module.exports = new ProjectService();