diff --git a/src/storage/SprintColumnTransaction.php b/src/storage/SprintColumnTransaction.php index 32e8cfe17ab190312ce770f5582125566f086003..6307639e4fa93aa41e8b89467f648cd52d1ad906 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 d2dece99a777ee19b05ddebf61ffaa8da8354754..912d3c0eb6971298f125923b5ba29a86442d72cc 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;