diff --git a/api/v1/entries/products.php b/api/v1/entries/products.php index 6aa0ca75f7..aad54b2939 100644 --- a/api/v1/entries/products.php +++ b/api/v1/entries/products.php @@ -24,150 +24,73 @@ class productsEntry extends entry if(strpos(strtolower(",{$fields},"), ',dropmenu,') !== false) return $this->getDropMenu(); if(!$programID) $programID = $this->param('program', 0); + $mergeChildren = $this->param('mergeChildren', ''); if($programID) { $control = $this->loadController('program', 'product'); - $control->product($programID, $this->param('status', 'all'), $this->param('order', 'order_asc'), 0, 10000); + $control->product($programID, $this->param('status', 'all'), $this->param('order', 'order_asc'), 0, $this->param('limit', '20'), $this->param('page', '1')); /* Response */ $data = $this->getData(); - if(isset($data->status) and $data->status == 'success') - { - $result = array(); - $products = $data->data->products; - foreach($products as $product) $result[] = $this->format($product, 'createdDate:time'); + if(!$data or !isset($data->status)) return $this->sendError(400, 'error'); + if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message); + + $products = $data->data->products; - return $this->send(200, array('products' => $result)); - } } else { - $mergeChildren = $this->param('mergeChildren', ''); - $control = $this->loadController('product', 'all'); $control->all($this->param('status', 'all'), $this->param('order', 'order_asc')); /* Response */ $data = $this->getData(); - if(isset($data->status) and $data->status == 'success') - { - $result = array(); - if($mergeChildren) - { - $programs = array(); - foreach($data->data->productStructure as $programID => $program) - { - $programs[$programID] = new stdclass(); - if(!empty($programID)) - { - $programs[$programID]->id = $programID; - $programs[$programID]->name = $program->programName; - $programs[$programID]->type = 'program'; - } + if(!$data or !isset($data->status)) return $this->sendError(400, 'error'); + if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message); - $unclosedTotal = 0; - foreach($program as $field => $value) - { - if(!isset($programs[$programID]->children)) $programs[$programID]->children = array(); - if(isset($value->products)) - { - $lineID = $field; - if(empty($lineID)) - { - foreach($value->products as $product) - { - unset($product->desc); - $product->stories = (array)$product->stories; - $product->requirements = (array)$product->requirements; - $closedTotal = ($product->stories['closed'] + $product->requirements['closed']); - $allTotal = (array_sum($product->stories) + array_sum($product->requirements)); - $product->progress = empty($closedTotal) ? 0 : round($closedTotal / $allTotal * 100, 1); - $programs[$programID]->children[$product->id] = $product; - if($product->status != 'closed') $unclosedTotal += 1; - } - } - else - { - $line = new stdclass(); - $line->id = $lineID; - $line->name = $value->lineName; - $line->type = 'line'; - - $line->children = array(); - foreach($value->products as $product) - { - unset($product->desc); - $product->stories = (array)$product->stories; - $product->requirements = (array)$product->requirements; - $closedTotal = ($product->stories['closed'] + $product->requirements['closed']); - $allTotal = (array_sum($product->stories) + array_sum($product->requirements)); - $product->progress = empty($closedTotal) ? 0 : round($closedTotal / $allTotal * 100, 1); - $line->children[$product->id] = $product; - if($product->status != 'closed') $unclosedTotal += 1; - } - if(isset($line->children)) $line->children = array_values($line->children); - - $programs[$programID]->children[$lineID] = $line; - } - if(isset($programs[$programID]->children)) $programs[$programID]->children = array_values($programs[$programID]->children); - $programs[$programID]->unclosedTotal = $unclosedTotal; - } - } - - } - - $topProducts = array(); - if(isset($programs[0])) - { - $topProducts = $programs[0]->children; - unset($programs[0]); - } - - $programs = array_values($programs); - foreach($topProducts as $product) $programs[] = $product; - - return $this->send(200, $programs); - } - else - { - $products = $data->data->productStats; - $accounts = array(); - foreach($products as $product) - { - $accounts[$product->PO] = $product->PO; - $accounts[$product->QD] = $product->QD; - $accounts[$product->RD] = $product->RD; - $accounts[$product->createdBy] = $product->createdBy; - if(isset($product->feedback)) $accounts[$product->feedback] = $product->feedback; - if(!empty($product->mailto)) - { - foreach(explode(',', $product->mailto) as $account) - { - $account = trim($account); - if(empty($account)) continue; - $accounts[$account] = $account; - } - } - - $result[] = $this->format($product, 'createdDate:time'); - } - - $data = array(); - $data['total'] = count($result); - $data['products'] = $result; - - $withUser = $this->param('withUser', ''); - if(!empty($withUser)) $data['users'] = $this->loadModel('user')->getListByAccounts($accounts, 'account'); - - return $this->send(200, $data); - } - } + $products = $data->data->productStats; + if($mergeChildren) $products = $data->data->productStructure; } - if(isset($data->status) and $data->status == 'fail') return $this->sendError(400, $data->message); + $result = array(); + if($mergeChildren) + { + $programs = $this->mergeChildren($products); + return $this->send(200, $programs); + } + else + { + $accounts = array(); + foreach($products as $product) + { + $accounts[$product->PO] = $product->PO; + $accounts[$product->QD] = $product->QD; + $accounts[$product->RD] = $product->RD; + $accounts[$product->createdBy] = $product->createdBy; + if(isset($product->feedback)) $accounts[$product->feedback] = $product->feedback; + if(!empty($product->mailto)) + { + foreach(explode(',', $product->mailto) as $account) + { + $account = trim($account); + if(empty($account)) continue; + $accounts[$account] = $account; + } + } - return $this->sendError(400, 'error'); + $result[] = $this->format($product, 'createdDate:time'); + } + + $data = array(); + $data['total'] = count($result); + $data['products'] = $result; + + $withUser = $this->param('withUser', ''); + if(!empty($withUser)) $data['users'] = $this->loadModel('user')->getListByAccounts($accounts, 'account'); + + return $this->send(200, $data); + } } /** @@ -236,4 +159,77 @@ class productsEntry extends entry } $this->send(200, $dropMenu); } + + /** + * Merge children products. + * + * @param array $products + * @access public + * @return void + */ + public function mergeChildren($products) + { + $programs = array(); + foreach($products as $programID => $program) + { + $programs[$programID] = new stdclass(); + if(!empty($programID)) + { + $programs[$programID]->id = $programID; + $programs[$programID]->name = $program->programName; + $programs[$programID]->type = 'program'; + } + + $unclosedTotal = 0; + foreach($program as $field => $value) + { + if(!isset($programs[$programID]->children)) $programs[$programID]->children = array(); + if(isset($value->products)) + { + $lineID = $field; + if(empty($lineID)) + { + foreach($value->products as $product) + { + unset($product->desc); + $programs[$programID]->children[$product->id] = $product; + if($product->status != 'closed') $unclosedTotal += 1; + } + } + else + { + $line = new stdclass(); + $line->id = $lineID; + $line->name = $value->lineName; + $line->type = 'line'; + + $line->children = array(); + foreach($value->products as $product) + { + unset($product->desc); + $line->children[$product->id] = $product; + if($product->status != 'closed') $unclosedTotal += 1; + } + if(isset($line->children)) $line->children = array_values($line->children); + + $programs[$programID]->children[$lineID] = $line; + } + if(isset($programs[$programID]->children)) $programs[$programID]->children = array_values($programs[$programID]->children); + $programs[$programID]->unclosedTotal = $unclosedTotal; + } + } + } + + $topProducts = array(); + if(isset($programs[0])) + { + $topProducts = $programs[0]->children; + unset($programs[0]); + } + + $programs = array_values($programs); + foreach($topProducts as $product) $programs[] = $product; + + return $programs; + } } diff --git a/module/product/model.php b/module/product/model.php index 59ab28e38f..23fd17ea4c 100644 --- a/module/product/model.php +++ b/module/product/model.php @@ -1510,7 +1510,7 @@ class productModel extends model if(empty($programID)) { - $programKeys = array(0=>0); + $programKeys = array(0 => 0); foreach($products as $product) $programKeys[] = $product->program; $programs = $this->dao->select('id,name')->from(TABLE_PROGRAM) ->where('id')->in(array_unique($programKeys)) @@ -1533,6 +1533,11 @@ class productModel extends model $product->fixedBugs = isset($fixedBugs[$product->id]) ? $fixedBugs[$product->id] : 0; $product->thisWeekBugs = isset($thisWeekBugs[$product->id]) ? $thisWeekBugs[$product->id] : 0; $product->assignToNull = isset($assignToNull[$product->id]) ? $assignToNull[$product->id] : 0; + + $closedTotal = $product->stories['closed'] + $product->requirements['closed']; + $allTotal = array_sum($product->stories) + array_sum($product->requirements); + $product->progress = empty($closedTotal) ? 0 : round($closedTotal / $allTotal * 100, 1); + $stats[] = $product; }