From 2d8790d0a696515a644540c1fea06cbebe3e2c5e Mon Sep 17 00:00:00 2001 From: Alvaro Soliverez <alvaro.soliverez@collabora.com> Date: Wed, 7 Dec 2016 15:12:48 +0000 Subject: [PATCH] Show total points changes over time in the burndown chart Instead of using the current total points, this calculates how the total changes over time as new tasks are added. It does, however, only use the current points of a task, and it doesn't track that change over time. The ideal points and remaining points calculation have been updated to deal with the change. Differential Revision: https://phabricator.collabora.co.uk/D986 --- src/storage/SprintColumnTransaction.php | 27 ++++++++-- src/storage/SprintStats.php | 69 ++++++++++++++++++------- 2 files changed, 74 insertions(+), 22 deletions(-) diff --git a/src/storage/SprintColumnTransaction.php b/src/storage/SprintColumnTransaction.php index 32e8cfe..6307639 100644 --- a/src/storage/SprintColumnTransaction.php +++ b/src/storage/SprintColumnTransaction.php @@ -61,6 +61,10 @@ final class SprintColumnTransaction { $this->closeTasksToday($date, $dates); $this->closePointsToday($date, $points, $dates); break; + case 'open': + $this->openTasksToday($date, $dates); + $this->openPointsToday($date, $points, $dates); + break; case 'reopen': $this->reopenedTasksToday($date, $dates); $this->reopenedPointsToday($date, $points, $dates); @@ -80,6 +84,16 @@ final class SprintColumnTransaction { return $dates; } + private function openTasksToday($date, $dates) { + $dates[$date]->setTasksAddedToday(); + return $dates; + } + + private function openPointsToday($date, $points, $dates) { + $dates[$date]->setPointsAddedToday($points); + return $dates; + } + private function reopenedPointsToday($date, $points, $dates) { $dates[$date]->setPointsReopenedToday($points); return $dates; @@ -106,11 +120,16 @@ final class SprintColumnTransaction { $events = array(); foreach ($xactions as $xaction) { if ($xaction->getOldValue() == null) { - continue; + if (ManiphestTaskStatus::isOpenStatus($xaction->getNewValue())) { + $event_type = 'open'; + } else { + $event_type = 'close'; + } + } else { + $was_open = ManiphestTaskStatus::isOpenStatus($xaction->getOldValue()); + $is_open = ManiphestTaskStatus::isOpenStatus($xaction->getNewValue()); + $event_type = $this->setXActionTaskStatusEventType($was_open, $is_open); } - $was_open = ManiphestTaskStatus::isOpenStatus($xaction->getOldValue()); - $is_open = ManiphestTaskStatus::isOpenStatus($xaction->getNewValue()); - $event_type = $this->setXActionTaskStatusEventType($was_open, $is_open); if ($event_type !== null) { $events[] = array( 'transactionPHID' => $xaction->getPHID(), diff --git a/src/storage/SprintStats.php b/src/storage/SprintStats.php index d2dece9..912d3c0 100644 --- a/src/storage/SprintStats.php +++ b/src/storage/SprintStats.php @@ -62,21 +62,48 @@ final class SprintStats { } public function sumTotalPoints($dates) { - $sprintpoints = id(new SprintPoints()) - ->setTasks($this->tasks); - $points_total = $sprintpoints->sumTotalTaskPoints(); + $first = true; + $previous = new BurndownDataDate($date = null); foreach ($dates as $date) { + if ($first) { + $points_total = $date->getPointsAddedToday(); + $first = false; + } else { + $points_today = $date->getPointsAddedToday(); + $yesterday_points_total = $previous->getPointsTotal(); + $points_total = $points_today + $yesterday_points_total; + } $date->setPointsTotal($points_total); + $previous = $date; + } + + $sprintpoints = id(new SprintPoints()) + ->setTasks($this->tasks); + $points_overall = $sprintpoints->sumTotalTaskPoints(); + if ($previous->getPointsTotal() < $points_overall) { + $points_diff = $points_overall - $previous->getPointsTotal(); + foreach ($dates as $date) { + $points_total = $date->getPointsTotal() + $points_diff; + $date->setPointsTotal($points_total); + } } return $dates; } public function sumTotalTasks($dates) { - $sprintpoints = id(new SprintPoints()) - ->setTaskPoints($this->tasks); - $points_total = $sprintpoints->sumTotalTasks(); + $first = true; + $previous = new BurndownDataDate($date = null); foreach ($dates as $date) { - $date->setTasksTotal($points_total); + if ($first) { + $tasks_total = $date->getTasksAddedToday(); + $first = false; + } else { + $tasks_today = $date->getTasksAddedToday(); + $yesterday_tasks_total = $previous->getTasksTotal(); + $tasks_total = $tasks_today + $yesterday_tasks_total; + } + $date->setTasksTotal($tasks_total); + $previous = $date; } return $dates; } @@ -84,27 +111,34 @@ final class SprintStats { public function calcPointsRemaining($dates) { $first = true; $previous = new BurndownDataDate($date = null); - $sprintpoints = id(new SprintPoints()) - ->setTasks($this->tasks); - $points_total = $sprintpoints->sumTotalTaskPoints(); - foreach ($dates as $date) { + $points_added_today = $date->getPointsAddedToday(); $points_closed_today = $date->getPointsClosedToday(); $points_reopened_today = $date->getPointsReopenedToday(); $points_today = $points_reopened_today - $points_closed_today; if ($first) { - $points_remaining = $points_today + $points_total; + $points_remaining = $points_today + $date->getPointsTotal(); + $first = false; } else { $yesterday_points_remaining = $previous->getPointsRemaining(); $date->setYesterdayPointsRemaining($yesterday_points_remaining); - $points_remaining = $points_today + $yesterday_points_remaining; + $points_remaining = $points_today + $yesterday_points_remaining + $points_added_today; } if ($points_remaining < 0) { $points_remaining = 0; } $date->setPointsRemaining($points_remaining); $previous = $date; - $first = false; + } + $sprintpoints = id(new SprintPoints()) + ->setTasks($this->tasks); + list($task_open_status_sum, $task_closed_status_sum) = $sprintpoints->getStatusSums(); + if ($previous->getPointsRemaining() > $task_open_status_sum) { + $points_diff = $previous->getPointsRemaining() - $task_open_status_sum; + foreach ($dates as $date) { + $points_remaining = $date->getPointsRemaining() - $points_diff; + $date->setPointsRemaining($points_remaining); + } } return $dates; } @@ -112,10 +146,8 @@ final class SprintStats { public function calcTasksRemaining($dates) { $first = true; $previous = new BurndownDataDate($date = null); - $sprintpoints = id(new SprintPoints()) - ->setTasks($this->tasks); - $tasks_total = $sprintpoints->sumTotalTasks(); foreach ($dates as $date) { + $tasks_total = $date->getTasksTotal(); $tasks_closed_today = $date->getTasksClosedToday(); $tasks_reopened_today = $date->getTasksReopenedToday(); $tasks_today = $tasks_reopened_today - $tasks_closed_today; @@ -124,7 +156,8 @@ final class SprintStats { } else { $yesterday_tasks_remaining = $previous->getTasksRemaining(); $date->setYesterdayTasksRemaining($yesterday_tasks_remaining); - $tasks_remaining = $tasks_today + $yesterday_tasks_remaining; + $tasks_added_today = $date->getTasksAddedToday(); + $tasks_remaining = $tasks_today + $yesterday_tasks_remaining + $tasks_added_today; } $date->setTasksRemaining($tasks_remaining); $previous = $date; -- GitLab