diff --git a/db/update20.0.sql b/db/update20.0.sql
index 729a3c4b0d..73f2e83257 100644
--- a/db/update20.0.sql
+++ b/db/update20.0.sql
@@ -340,3 +340,14 @@ CREATE TABLE IF NOT EXISTS `zt_planstory` (
`order` mediumint(9) NOT NULL,
UNIQUE KEY `unique` (`plan`,`story`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `zt_acl` (
+ `id` mediumint(9) NOT NULL AUTO_INCREMENT,
+ `account` char(30) NOT NULL,
+ `objectType` char(30) NOT NULL,
+ `objectID` mediumint(9) NOT NULL DEFAULT '0',
+ `type` char(40) NOT NULL DEFAULT 'whitelist',
+ `source` char(30) NOT NULL,
+ `desc` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
diff --git a/db/zentao.sql b/db/zentao.sql
index e0ecdab67a..9519320272 100644
--- a/db/zentao.sql
+++ b/db/zentao.sql
@@ -1,3 +1,15 @@
+-- DROP TABLE IF EXISTS `zt_acllist`;
+CREATE TABLE IF NOT EXISTS `zt_acllist` (
+ `id` mediumint(9) NOT NULL AUTO_INCREMENT,
+ `account` char(30) NOT NULL,
+ `objectType` char(30) NOT NULL,
+ `objectID` mediumint(9) NOT NULL DEFAULT '0',
+ `type` char(40) NOT NULL DEFAULT 'whitelist',
+ `source` char(30) NOT NULL,
+ `desc` varchar(255) DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
-- DROP TABLE IF EXISTS `zt_action`;
CREATE TABLE IF NOT EXISTS `zt_action` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
diff --git a/module/programplan/model.php b/module/programplan/model.php
index d477da86be..947030cf8d 100644
--- a/module/programplan/model.php
+++ b/module/programplan/model.php
@@ -564,6 +564,7 @@ class programplanModel extends model
if(!dao::isError())
{
$stageID = $this->dao->lastInsertID();
+ $this->dao->update(TABLE_PROJECT)->set('`order`')->eq($stageID * 5)->where('id')->eq($stageID)->exec();
/* Add creators to stage teams and project teams. */
$member = new stdclass();
diff --git a/module/programplan/view/list.html.php b/module/programplan/view/list.html.php
index a21f2d1057..e5a2212ad4 100644
--- a/module/programplan/view/list.html.php
+++ b/module/programplan/view/list.html.php
@@ -81,7 +81,7 @@ $(function(){$('#programplanForm').table();})
$(document).on('click', '.plan-toggle', function(e)
{
var $toggle = $(this);
- var id = $(this).data('id');
+ var id = $(this).data('id');
var isCollapsed = $toggle.toggleClass('collapsed').hasClass('collapsed');
$toggle.closest('[data-ride="table"]').find('tr.parent-' + id).toggle(!isCollapsed);
diff --git a/module/project/control.php b/module/project/control.php
index c79e7d60f6..61d135df3e 100644
--- a/module/project/control.php
+++ b/module/project/control.php
@@ -2332,11 +2332,11 @@ class project extends control
return $this->send(array('result' => 'fail'));
}
- $orders = $this->post->projects;
- $idList = array_keys($orders);
+ $idList = explode(',', $this->post->projects);
$projects = $this->dao->select('id, `order`')->from(TABLE_PROJECT)
->where('id')->in($idList)
->fetchPairs('id', 'order');
+
foreach($projects as $id => $order)
{
$newOrder = $orders[$id];
@@ -2387,6 +2387,7 @@ class project extends control
public function all($status = 'undone', $projectID = 0, $orderBy = 'order_desc', $productID = 0, $recTotal = 0, $recPerPage = 10, $pageID = 1)
{
$this->app->loadLang('my');
+ $this->app->loadLang('programplan');
if($this->projects)
{
$project = $this->commonAction($projectID);
diff --git a/module/project/model.php b/module/project/model.php
index c72b9beed9..6988566517 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -936,13 +936,29 @@ class projectModel extends model
$projects = $this->getList($status, 0, $productID, $branch, $programID);
$projects = $this->dao->select('*')->from(TABLE_PROJECT)
->where('id')->in(array_keys($projects))
+ ->andWhere('grade')->eq(1)
+ ->andWhere('deleted')->eq('0')
->orderBy($orderBy)
->page($pager)
->fetchAll('id');
+
if(empty($projects)) return array();
+ /* In case of a waterfall model, obtain sub-stage data. */
+ $PRJData = $this->getById($this->session->PRJ);
+ if($PRJData->model == 'waterfall')
+ {
+ $childrens = $this->dao->select('*')->from(TABLE_PROJECT)
+ ->where('parent')->in(array_keys($projects))
+ ->andWhere('grade')->eq(2)
+ ->andWhere('deleted')->eq('0')
+ ->orderBy($orderBy)
+ ->page($pager)
+ ->fetchAll('id');
+ $projects = $projects + $childrens;
+ }
+
$projectKeys = array_keys($projects);
- $stats = array();
$hours = array();
$emptyHour = array('totalEstimate' => 0, 'totalConsumed' => 0, 'totalLeft' => 0, 'progress' => 0);
@@ -996,7 +1012,7 @@ class projectModel extends model
if($begin == '0000-00-00') $begin = $projects[$projectID]->openedDate;
$projectBurns = $this->processBurnData($projectBurns, $itemCounts, $begin, $end);
- /* Shorter names. */
+ /* Shorter names. */
foreach($projectBurns as $projectBurn)
{
$projectBurn->name = substr($projectBurn->name, 5);
@@ -1008,9 +1024,11 @@ class projectModel extends model
}
/* Process projects. */
+ $parents = array();
+ $children = array();
foreach($projects as $key => $project)
{
- // Process the end time.
+ /* Process the end time. */
$project->end = date(DT_DATE1, strtotime($project->end));
/* Judge whether the project is delayed. */
@@ -1028,10 +1046,17 @@ class projectModel extends model
/* Process the hours. */
$project->hours = isset($hours[$project->id]) ? $hours[$project->id] : (object)$emptyHour;
- $stats[] = $project;
+ $project->children = array();
+ $project->grade == 1 ? $parents[$project->id] = $project : $children[$project->parent][] = $project;
}
- return $stats;
+ /* In the case of the waterfall model, calculate the sub-stage. */
+ if($PRJData->model == 'waterfall')
+ {
+ foreach($parents as $id => $project) $project->children = isset($children[$id]) ? $children[$id] : array();
+ }
+
+ return $parents;
}
/**
diff --git a/module/project/view/all.html.php b/module/project/view/all.html.php
index 16107892b9..98868b2c0f 100644
--- a/module/project/view/all.html.php
+++ b/module/project/view/all.html.php
@@ -11,6 +11,19 @@
?>
+