From c16909f7b16a35bd54627d14df5284cbd0c2faef Mon Sep 17 00:00:00 2001
From: Roland Bernard <rolbernard@unibz.it>
Date: Mon, 24 May 2021 17:10:04 +0200
Subject: [PATCH] Fixed completion computation

---
 server/src/v1/project.ts |  9 ++++++---
 server/src/v1/team.ts    |  9 ++++++---
 server/src/v1/user.ts    | 11 +++++++----
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/server/src/v1/project.ts b/server/src/v1/project.ts
index 6a33e99..b285bcb 100644
--- a/server/src/v1/project.ts
+++ b/server/src/v1/project.ts
@@ -282,13 +282,16 @@ project.get('/:uuid/completion', async (req, res) => {
                     database('team_members')
                         .innerJoin('team_projects', 'team_members.team_id', 'team_projects.team_id')
                         .innerJoin('tasks', 'team_projects.project_id', 'tasks.project_id')
-                        .leftJoin('task_requirements', 'tasks.id', 'task_requirements.task_id')
-                        .leftJoin('workhours', 'tasks.id', 'workhours.task_id')
                         .select({
                             id: 'tasks.id',
                             status: database.raw(
                                 'Case When `tasks`.`status` = \'open\' '
-                                + 'And Sum(`task_requirements`.`time` * 60 * 1000) < Sum(`workhours`.`finished` - `workhours`.`started`) '
+                                + 'And (Select '
+                                        + 'Sum(`task_requirements`.`time` * 60 * 1000) '
+                                        + 'from `task_requirements` where `task_requirements`.`task_id` = `tasks`.`id`) '
+                                    + '< (Select '
+                                        + 'Sum(`workhours`.`finished` - `workhours`.`started`) '
+                                        + 'from `workhours` where `workhours`.`task_id` = `tasks`.`id`) '
                                 + 'Then \'overdue\' Else `tasks`.`status` End'),
                         })
                         .where({
diff --git a/server/src/v1/team.ts b/server/src/v1/team.ts
index a106fe7..3257771 100644
--- a/server/src/v1/team.ts
+++ b/server/src/v1/team.ts
@@ -400,13 +400,16 @@ team.get('/:uuid/completion', async (req, res) => {
                     database('team_members')
                         .innerJoin('team_projects', 'team_members.team_id', 'team_projects.team_id')
                         .innerJoin('tasks', 'team_projects.project_id', 'tasks.project_id')
-                        .leftJoin('task_requirements', 'tasks.id', 'task_requirements.task_id')
-                        .leftJoin('workhours', 'tasks.id', 'workhours.task_id')
                         .select({
                             id: 'tasks.id',
                             status: database.raw(
                                 'Case When `tasks`.`status` = \'open\' '
-                                + 'And Sum(`task_requirements`.`time` * 60 * 1000) < Sum(`workhours`.`finished` - `workhours`.`started`) '
+                                + 'And (Select '
+                                        + 'Sum(`task_requirements`.`time` * 60 * 1000) '
+                                        + 'from `task_requirements` where `task_requirements`.`task_id` = `tasks`.`id`) '
+                                    + '< (Select '
+                                        + 'Sum(`workhours`.`finished` - `workhours`.`started`) '
+                                        + 'from `workhours` where `workhours`.`task_id` = `tasks`.`id`) '
                                 + 'Then \'overdue\' Else `tasks`.`status` End'),
                         })
                         .where({
diff --git a/server/src/v1/user.ts b/server/src/v1/user.ts
index 43e9244..0496464 100644
--- a/server/src/v1/user.ts
+++ b/server/src/v1/user.ts
@@ -221,14 +221,17 @@ user.get('/completion', async (req, res) => {
         const to = new Date(parseInt(req.query.to as string ?? Date.now()));
         const completion = await database(
                 database('task_assignees')
-                    .leftJoin('tasks', 'task_assignees.task_id', 'tasks.id')
-                    .leftJoin('task_requirements', 'tasks.id', 'task_requirements.task_id')
-                    .leftJoin('workhours', 'tasks.id', 'workhours.task_id')
+                    .innerJoin('tasks', 'task_assignees.task_id', 'tasks.id')
                     .select({
                         id: 'tasks.id',
                         status: database.raw(
                             'Case When `tasks`.`status` = \'open\' '
-                            + 'And Sum(`task_requirements`.`time` * 60 * 1000) < Sum(`workhours`.`finished` - `workhours`.`started`) '
+                            + 'And (Select '
+                                    + 'Sum(`task_requirements`.`time` * 60 * 1000) '
+                                    + 'from `task_requirements` where `task_requirements`.`task_id` = `tasks`.`id`) '
+                                + '< (Select '
+                                    + 'Sum(`workhours`.`finished` - `workhours`.`started`) '
+                                    + 'from `workhours` where `workhours`.`task_id` = `tasks`.`id`) '
                             + 'Then \'overdue\' Else `tasks`.`status` End'),
                     })
                     .where({
-- 
GitLab