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 ? '&nbsp;&nbsp;<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

Reply via email to