From 6a69e5a055a258c7e97f674ad0e22bec65056859 Mon Sep 17 00:00:00 2001 From: Muhammad Zhafran Ilham Date: Fri, 26 Jun 2026 00:09:15 +0700 Subject: [PATCH] feat(project): menambahkan perhitungan task_done sebuah project untuk intern & admin --- .../repositories/project.repository.js | 24 +++++++++++++ .../project/services/project.service.js | 35 +++++++++++++++++++ src/routes/project.routes.js | 4 +++ 3 files changed, 63 insertions(+) diff --git a/src/modules/project/repositories/project.repository.js b/src/modules/project/repositories/project.repository.js index eb75e4b..e140deb 100644 --- a/src/modules/project/repositories/project.repository.js +++ b/src/modules/project/repositories/project.repository.js @@ -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, + }, + }, }, }, }, diff --git a/src/modules/project/services/project.service.js b/src/modules/project/services/project.service.js index 03ab73f..699ce83 100644 --- a/src/modules/project/services/project.service.js +++ b/src/modules/project/services/project.service.js @@ -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(); diff --git a/src/routes/project.routes.js b/src/routes/project.routes.js index aafac85..e5ac423 100644 --- a/src/routes/project.routes.js +++ b/src/routes/project.routes.js @@ -165,6 +165,10 @@ const router = express.Router(); * total_tasks: * type: integer * example: 3 + * task_done: + * type: integer + * example: 2 + * description: Number of completed tasks. For interns, this counts tasks submitted by the logged-in intern. For admin/mentor, this counts tasks submitted by all active project members. * created_at: * type: string * format: date-time