Select Git revision
block-migration.c
BoardDataProvider.php 5.24 KiB
<?php
final class BoardDataProvider {
private $start;
private $end;
private $project;
private $viewer;
private $request;
private $tasks;
private $query;
private $stats;
private $timezone;
private $timeseries;
private $chartdata;
private $coldata;
public function setStart($start) {
$this->start = $start;
return $this;
}
public function setEnd($end) {
$this->end = $end;
return $this;
}
public function setProject($project) {
$this->project = $project;
return $this;
}
public function getProject() {
return $this->project;
}
public function getColumnData() {
return $this->coldata;
}
public function getChartData() {
return $this->chartdata;
}
public function setViewer($viewer) {
$this->viewer = $viewer;
return $this;
}
public function setRequest($request) {
$this->request = $request;
return $this;
}
public function setTimezone($timezone) {
$this->timezone = $timezone;
return $this;
}
public function setTimeSeries($timeseries) {
$this->timeseries = $timeseries;
return $this;
}
public function getTimeSeries() {
return $this->timeseries;
}
public function setTasks($tasks) {
$this->tasks = $tasks;
return $this;
}
public function getTasks() {
return $this->tasks;
}
public function setStats($stats) {
$this->stats = $stats;
return $this;
}
public function setQuery($query) {
$this->query = $query;
return $this;
}
public function execute() {
$this->buildBoardDataSet();
$this->buildChartfromBoardData();
return $this;
}
private function buildBoardDataSet() {
$board_columns = array();
$columns = $this->query->getProjectColumns();
$positions = $this->query->getProjectColumnPositionforTask($this->tasks,
$columns);
$task_map = array();
foreach ($this->tasks as $task) {
$task_phid = $task->getPHID();
if (empty($positions[$task_phid])) {
continue;
}
$position = $positions[$task_phid];
$task_map[$position->getColumnPHID()][] = $task_phid;
}
foreach ($columns as $column) {
$board_column = $this->buildColumnTasks($column, $task_map);
$board_columns[$column->getPHID()] = $board_column;
}
$this->coldata = $this->buildBoardColumnData($board_columns);
return $this;
}
private function buildBoardColumnData($board_columns) {
$coldata = array();
foreach ($board_columns as $column_phid => $tasks) {
$colname = $this->getColumnName($column_phid);
$task_count = count($tasks);
$task_points_total = $this->getTaskPointsSum($tasks);
$coldata[] = array(
$colname,
$task_count,
$task_points_total,
);
}
return $coldata;
}
private function buildColumnTasks($column, $task_map) {
$task_phids = idx($task_map, $column->getPHID(), array());
$column_tasks = array_select_keys($this->tasks, $task_phids);
return $column_tasks;
}
private function getColumnName($column_phid) {
$name = null;
$column = $this->query->getColumnforPHID($column_phid);
foreach ($column as $obj) {
$name = $obj->getDisplayName();
}
return $name;
}
private function getTaskPointsSum($tasks) {
$points_sum = null;
// $taskpoints = mpull($this->taskpoints, null, 'getObjectPHID');
// $column_points = array_intersect_key($taskpoints, $tasks);
// if (!empty($column_points)) {
foreach ($tasks as $task) {
$points = $task->getPoints();
$points_sum += $points;
}
if (!isset($points_sum)) {
$points_sum = '0';
}
// }
return $points_sum;
}
private function getProjectTaskStatusXactions() {
$xactions = array();
$scope_phid = $this->project->getPHID();
$task_phids = mpull($this->tasks, 'getPHID');
$query = new ManiphestTransactionQuery();
$query->withTransactionTypes(array(ManiphestTaskStatusTransaction::TRANSACTIONTYPE));
$query->withObjectPHIDs($task_phids);
$query->setViewer($this->viewer);
$stories = $query->execute();
// FIXME: This should _really_ have ManiphestTransactionQuery take a
// date range, rather than getting the entire list and filtering
// client-side ...
foreach ($stories as $xaction) {
$xaction_date = $xaction->getDateCreated();
if ($xaction_date >= $this->start && $xaction_date <= $this->end) {
$xactions[] = $xaction;
}
}
return $xactions;
}
private function buildChartfromBoardData() {
$date_array = $this->stats->buildDateArray($this->start, $this->end,
$this->timezone);
$xactions = $this->getProjectTaskStatusXactions();
$xaction_map = mpull($xactions, null, 'getPHID');
$sprint_xaction = id(new SprintColumnTransaction())
->setViewer($this->viewer)
->setTasks($this->tasks)
->setQuery($this->query)
->setProject($this->project)
->setEventsTaskStatus($xactions);
$dates = $sprint_xaction->parseEvents($date_array, $xaction_map);
$this->stats->setTasks($this->tasks);
$sprint_data = $this->stats->setSprintData($dates);
$data = $this->stats->buildDataSet($sprint_data);
$this->chartdata = $this->stats->transposeArray($data);
return $this;
}
}