Christopher Johnson (WMDE) has submitted this change and it was merged. Change subject: stats logic improvement ......................................................................
stats logic improvement SprintTableView change to look at current time fixed totals and ideal points line note: calculations are still problematic under certain circumstances. i.e. reopening and then adding a task to a sprint on the same day as sprint start. This causes a duplicate assignment. Change-Id: Ib70811ead3ac40c0b73461d3c1366f1ad1f88768 --- M src/storage/SprintBuildStats.php M src/storage/SprintTransaction.php M src/util/BurndownDataDate.php M src/view/SprintTableView.php M src/view/TasksTableView.php 5 files changed, 170 insertions(+), 27 deletions(-) Approvals: Christopher Johnson (WMDE): Verified; Looks good to me, approved diff --git a/src/storage/SprintBuildStats.php b/src/storage/SprintBuildStats.php index 2179447..d35f357 100644 --- a/src/storage/SprintBuildStats.php +++ b/src/storage/SprintBuildStats.php @@ -2,8 +2,6 @@ final class SprintBuildStats { private $timezone; - private $tasks_remaining; - private $points_remaining; public function setTimezone ($viewer) { $this->timezone = new DateTimeZone($viewer->getTimezoneIdentifier()); @@ -11,9 +9,8 @@ } public function setSprintData($dates, $before) { - $stats = id(new SprintBuildStats()); $dates = $this->sumSprintStats($dates, $before); - $sprint_data = $stats->computeIdealPoints($dates); + $sprint_data = $this->computeIdealPoints($dates, $before); return $sprint_data; } @@ -53,13 +50,73 @@ // Now that we have the data for each day, we need to loop over and sum // up the relevant columns + public function sumSprintStats($dates, $before) { - //$this->sumTasksTotal($dates, $before); - $this->calcTasksRemaining($dates, $before); - //$this->sumPointsTotal($dates, $before); +// $this->sumTasksTotal($dates, $before); + $this->sumPointsTotal($dates, $before); + $this->calcTasksRemaining($dates, $before); $this->calcPointsRemaining($dates, $before); return $dates; + } + public function sumTasksTotal($dates, $before) { + $first = true; + $previous = new BurndownDataDate($date=null); + $tasks_added_today = null; + $tasks_reopened_today = null; + $tasks_closed_today = null; + + $tasks_added_before = $before->getTasksAddedBefore(); + $tasks_reopened_before = $before->getTasksReopenedBefore(); + $tasks_closed_before = $before->getTasksClosedBefore(); + $tasks_before = $tasks_added_before + $tasks_reopened_before - $tasks_closed_before; + + foreach ($dates as $date) { + $tasks_added_today += $date->getTasksAddedToday(); + $tasks_reopened_today += $date->getTasksReopenedToday(); + $tasks_closed_today += $date->getTasksClosedToday(); + $tasks_today = $tasks_added_today + $tasks_reopened_today - $tasks_closed_today; + if ($first) { + $start_tasks = $tasks_before + $tasks_today; + $date->setTasksTotal($start_tasks); + } else { + $tasks_total = $previous->getTasksRemaining(); + $date->setTasksTotal($tasks_total); + } + $previous = $date; + $first = false; + } + return $dates; + } + + public function sumPointsTotal($dates, $before) { + $first = true; + $previous = new BurndownDataDate($date=null); + $points_added_today = null; + $points_reopened_today = null; + $points_closed_today = null; + + $points_added_before = $before->getPointsAddedBefore(); + $points_reopened_before = $before->getPointsReopenedBefore(); + $points_closed_before = $before->getPointsClosedBefore(); + $points_before = $points_added_before + $points_reopened_before - $points_closed_before; + + foreach ($dates as $date) { + $points_added_today += $date->getPointsAddedToday(); + $points_reopened_today += $date->getPointsReopenedToday(); + $points_closed_today += $date->getPointsClosedToday(); + $points_today = $points_added_today + $points_reopened_today - $points_closed_today; + if ($first) { + $start_points = $points_before + $points_today; + $date->setPointsTotal($start_points); + } else { + $points_total = $previous->getPointsTotal(); + $date->setPointsTotal($points_total); + } + $previous = $date; + $first = false; + } + return $dates; } public function calcPointsRemaining($dates, $before) { @@ -79,7 +136,7 @@ $points_today = $points_added_today + $points_reopened_today - $points_closed_today; if ($first) { $points_added_before = $before->getPointsAddedBefore(); - $points_reopened_before = $before->getPointsAddedBefore(); + $points_reopened_before = $before->getPointsReopenedBefore(); $points_closed_before = $before->getPointsClosedBefore(); $points_before = $points_added_before + $points_reopened_before - $points_closed_before; $points_remaining = $points_today + $points_before; @@ -88,12 +145,11 @@ $date->setYesterdayPointsRemaining($yesterday_points_remaining); $points_remaining = $points_today + $yesterday_points_remaining; } - if (!$points_remaining < 0) { - $date->setPointsRemaining($points_remaining); - } else { + + if ($points_remaining < 0) { $points_remaining = 0; - $date->setPointsRemaining($points_remaining); } + $date->setPointsRemaining($points_remaining); $previous = $date; $first = false; } @@ -132,7 +188,7 @@ return $dates; } - public function computeIdealPoints($dates) { + public function computeIdealPoints($dates, $before) { $total_business_days = 0; foreach ($dates as $key => $date) { $day_of_week = id(new DateTime($date->getDate()))->format('w'); diff --git a/src/storage/SprintTransaction.php b/src/storage/SprintTransaction.php index 87818d2..f760be1 100644 --- a/src/storage/SprintTransaction.php +++ b/src/storage/SprintTransaction.php @@ -28,6 +28,8 @@ $points = $query->getStoryPoints($task_phid); $date = phabricator_format_local_time($xaction_date, $this->viewer, 'D M j'); + + if ($xaction_date < $start) { switch ($event['type']) { @@ -46,9 +48,9 @@ break; case "points": // Points were changed - $old_point_value = $xaction->getOldValue(); - $this->ChangePointsBefore($before, $points, $old_point_value, $dates); - break; + $old_point_value = $xaction->getOldValue(); + $this->ChangePointsBefore($before, $points, $old_point_value, $dates); + break; } } @@ -84,12 +86,11 @@ $this->ReopenedPointsToday($date, $points, $dates); break; case "points": +// $this->transLog($event); // Points were changed - if ($this->task_in_sprint[$task_phid]) { $old_point_value = $xaction->getOldValue(); $this->changePoints($date, $task_phid, $points, $old_point_value, $dates); // $this->closePoints($date, $task_phid, $points, $old_point_value, $dates); - } break; } } @@ -197,4 +198,28 @@ private function AddTaskCreated($task_phid) { $this->task_created = $task_phid; } + + function getxActionValue($mapping, $keys) { + foreach($keys as $key) { + $output_arr[] = $mapping[$key]; + } + return $output_arr; + } + + private function transLog($event) { + list ($phid, $epoch, $key, $type, $title) = $this->getxActionValue($event, array('transactionPHID', 'epoch', 'key', 'type', 'title')); + $tmp = "/tmp/xaction.log"; + $format = "%a %b %c %d %e"; + $log = new PhutilDeferredLog($tmp, $format); + $log->setData( + array( + 'a' => $phid, + 'b' => $epoch, + 'c' => $key, + 'd' => $type, + 'e' => $title, + )); + + unset($log); + } } \ No newline at end of file diff --git a/src/util/BurndownDataDate.php b/src/util/BurndownDataDate.php index 337bd05..18fcdf1 100644 --- a/src/util/BurndownDataDate.php +++ b/src/util/BurndownDataDate.php @@ -208,4 +208,14 @@ return $current->points_total; } + public function sumTasksRemaining($current, $previous) { + $current->tasks_remaining = $previous->tasks_remaining - $current->tasks_closed_today; + return $current->tasks_remaining; + } + + public function sumPointsRemaining($current, $previous) { + $current->points_remaining = $previous->points_remaining - $current->points_closed_today; + return $current->points_remaining; + } + } diff --git a/src/view/SprintTableView.php b/src/view/SprintTableView.php index a5eb57a..edaabe0 100644 --- a/src/view/SprintTableView.php +++ b/src/view/SprintTableView.php @@ -12,27 +12,66 @@ { $tdata = array(); $pdata = array(); + $tasks_remaining = null; foreach ($sprint_data as $date) { + $start_tasks = null; + $tasks_before = $before->getTasksForwardfromBefore(); + $tasks_yesterday = $date->getYesterdayTasksRemaining(); + $today_tasks = $date->getTasksAddedToday(); + $tasks_remaining = $date->getTasksRemaining(); + + $timestamp = strtotime($date->getDate()); + $now = time(); + + if ($timestamp < $now) { + if (!$tasks_before == 0) { + $start_tasks = $before->getTasksForwardfromBefore(); + } elseif (!$tasks_yesterday == 0) { + $start_tasks = $date->getYesterdayTasksRemaining(); + } elseif (!$today_tasks == 0) { + $start_tasks = $today_tasks; + } else { + $start_tasks = $tasks_remaining; + } + } + $tdata[] = array( $date->getDate(), - $date->getYesterdayTasksRemaining() ? null : $before->getTasksForwardfromBefore(), - $date->getTasksRemaining(), + $start_tasks, + $tasks_remaining, $date->getTasksAddedToday(), $date->getTasksReopenedToday(), $date->getTasksClosedToday(), ); + + $start_points = null; + $before_points = $before->getPointsForwardfromBefore(); + $yesterday_points = $date->getYesterdayPointsRemaining(); + $today_points = $date->getPointsAddedToday(); + $points_remaining = $date->getPointsRemaining(); + + if ($timestamp < $now) { + if (!$before_points == 0) { + $start_points = $before_points; + } elseif (!$yesterday_points == 0) { + $start_points = $yesterday_points; + } elseif (!$today_points == 0) { + $start_points = $today_points; + } else { + $start_points = $points_remaining; + } + } + $pdata[] = array( $date->getDate(), - $date->getYesterdayPointsRemaining() ? null : $before->getPointsForwardfromBefore(), + $start_points, $date->getPointsRemaining(), $date->getPointsAddedToday(), $date->getPointsReopenedToday(), $date->getPointsClosedToday(), ); - } - $ttable = id(new AphrontTableView($tdata)) ->setHeaders( array( @@ -42,7 +81,7 @@ pht('Tasks Added'), pht('Tasks Reopened'), pht('Tasks Closed'), - )); + )); $ptable = id(new AphrontTableView($pdata)) ->setHeaders( array( diff --git a/src/view/TasksTableView.php b/src/view/TasksTableView.php index d3ab579..b91f4fd 100644 --- a/src/view/TasksTableView.php +++ b/src/view/TasksTableView.php @@ -44,6 +44,7 @@ array( pht('Task'), pht('Date Created'), + pht('Last Update'), pht('Assigned to'), pht('Priority'), pht('Points'), @@ -57,6 +58,7 @@ array( 'Task', 'Date Created', + 'Last Update', 'Assigned to', 'Priority', 'Points', @@ -109,8 +111,8 @@ } $row = $this->addTaskToTree($output, $task, $tasks, $map, $handles); - list ($task, $created, $assigned_to, $priority,$points, $status) = $row[0]; - $row['sort'] = $this->setSortOrder($row, $order, $task, $created, $assigned_to, $priority,$points, $status); + list ($task, $created, $last_update, $assigned_to, $priority,$points, $status) = $row[0]; + $row['sort'] = $this->setSortOrder($row, $order, $task, $created, $last_update, $assigned_to, $priority,$points, $status); $rows[] = $row; } $rows = isort($rows, 'sort'); @@ -130,7 +132,7 @@ * @param string $priority * @param string $points */ - private function setSortOrder ($row, $order, $task, $created, $assigned_to, $priority, + private function setSortOrder ($row, $order, $task, $created, $last_update, $assigned_to, $priority, $points, $status) { switch ($order) { case 'Task': @@ -138,6 +140,9 @@ break; case 'Date Created': $row['sort'] = $created; + break; + case 'Date Modified': + $row['sort'] = $last_update; break; case 'Assigned to': $row['sort'] = $assigned_to; @@ -208,6 +213,11 @@ return $date_created; } + private function getTaskModifiedDate($task) { + $last_updated = $task->getDateModified(); + return $last_updated; + } + private function getPriorityName($task) { $priority_name = new ManiphestTaskPriority; return $priority_name->getTaskPriorityName($task->getPriority()); @@ -222,6 +232,8 @@ $points = $this->getTaskPoints($task); $cdate = $this->getTaskCreatedDate($task); $date_created = phabricator_datetime($cdate, $this->viewer); + $udate = $this->getTaskModifiedDate($task); + $last_updated = phabricator_datetime($udate, $this->viewer); $status = $this->setTaskStatus($task); $depth_indent = ''; @@ -246,6 +258,7 @@ ) . ($repeat ? ' <em title="This task is a child of more than one task in this list. Children are only shown on ' . 'the first occurance">[Repeat]</em>' : '')), $date_created, + $last_updated, $owner_link, $priority_name, $points, -- To view, visit https://gerrit.wikimedia.org/r/177698 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ib70811ead3ac40c0b73461d3c1366f1ad1f88768 Gerrit-PatchSet: 2 Gerrit-Project: phabricator/extensions/Sprint Gerrit-Branch: master Gerrit-Owner: Christopher Johnson (WMDE) <christopher.john...@wikimedia.de> Gerrit-Reviewer: Christopher Johnson (WMDE) <christopher.john...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits