feat(project): menambahkan perhitungan task_done sebuah project untuk intern & admin
This commit is contained in:
@@ -100,11 +100,18 @@ class ProjectRepository {
|
|||||||
},
|
},
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
|
id_user: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
tasks: {
|
tasks: {
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
|
submissions: {
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
id_user: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -239,11 +246,21 @@ class ProjectRepository {
|
|||||||
},
|
},
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
|
id_user: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
tasks: {
|
tasks: {
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
|
submissions: {
|
||||||
|
where: {
|
||||||
|
id_user: parseInt(internId),
|
||||||
|
},
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
id_user: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -315,11 +332,18 @@ class ProjectRepository {
|
|||||||
},
|
},
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
|
id_user: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
tasks: {
|
tasks: {
|
||||||
select: {
|
select: {
|
||||||
id: true,
|
id: true,
|
||||||
|
submissions: {
|
||||||
|
select: {
|
||||||
|
id: true,
|
||||||
|
id_user: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ class ProjectService {
|
|||||||
admin: this.mapAdmin(project.admin),
|
admin: this.mapAdmin(project.admin),
|
||||||
total_members: project.members?.length || 0,
|
total_members: project.members?.length || 0,
|
||||||
total_tasks: project.tasks?.length || 0,
|
total_tasks: project.tasks?.length || 0,
|
||||||
|
task_done: this.getProjectTaskDone(project, actor),
|
||||||
created_at: project.created_at,
|
created_at: project.created_at,
|
||||||
updated_at: project.updated_at,
|
updated_at: project.updated_at,
|
||||||
}));
|
}));
|
||||||
@@ -387,6 +388,7 @@ class ProjectService {
|
|||||||
admin: this.mapAdmin(project.admin),
|
admin: this.mapAdmin(project.admin),
|
||||||
total_members: project.members?.length || 0,
|
total_members: project.members?.length || 0,
|
||||||
total_tasks: project.tasks?.length || 0,
|
total_tasks: project.tasks?.length || 0,
|
||||||
|
task_done: this.getProjectTaskDone(project, actor),
|
||||||
created_at: project.created_at,
|
created_at: project.created_at,
|
||||||
updated_at: project.updated_at,
|
updated_at: project.updated_at,
|
||||||
}));
|
}));
|
||||||
@@ -470,6 +472,7 @@ class ProjectService {
|
|||||||
admin: this.mapAdmin(project.admin),
|
admin: this.mapAdmin(project.admin),
|
||||||
total_members: project.members?.length || 0,
|
total_members: project.members?.length || 0,
|
||||||
total_tasks: project.tasks?.length || 0,
|
total_tasks: project.tasks?.length || 0,
|
||||||
|
task_done: this.getProjectTaskDone(project, actor),
|
||||||
created_at: project.created_at,
|
created_at: project.created_at,
|
||||||
updated_at: project.updated_at,
|
updated_at: project.updated_at,
|
||||||
}));
|
}));
|
||||||
@@ -581,6 +584,38 @@ class ProjectService {
|
|||||||
|
|
||||||
return slug;
|
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();
|
module.exports = new ProjectService();
|
||||||
|
|||||||
@@ -165,6 +165,10 @@ const router = express.Router();
|
|||||||
* total_tasks:
|
* total_tasks:
|
||||||
* type: integer
|
* type: integer
|
||||||
* example: 3
|
* 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:
|
* created_at:
|
||||||
* type: string
|
* type: string
|
||||||
* format: date-time
|
* format: date-time
|
||||||
|
|||||||
Reference in New Issue
Block a user