Skip to content
Snippets Groups Projects
Commit 2d8790d0 authored by Alvaro Soliverez's avatar Alvaro Soliverez Committed by Daniel Stone
Browse files

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
parent a7d797b4
No related branches found
No related tags found
No related merge requests found
......@@ -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);
}
if ($event_type !== null) {
$events[] = array(
'transactionPHID' => $xaction->getPHID(),
......
......@@ -62,21 +62,48 @@ final class SprintStats {
}
public function sumTotalPoints($dates) {
$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_total = $sprintpoints->sumTotalTaskPoints();
$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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment