This commit is contained in:
holan20180123
2021-02-25 13:21:18 +08:00
31 changed files with 52 additions and 619 deletions
+1 -4
View File
@@ -188,11 +188,10 @@ define('TABLE_REPOBRANCH', '`' . $config->db->prefix . 'repobranch`');
if(!defined('TABLE_LANG')) define('TABLE_LANG', '`' . $config->db->prefix . 'lang`');
if(!defined('TABLE_DESIGN')) define('TABLE_DESIGN', '`' . $config->db->prefix . 'design`');
if(!defined('TABLE_DESIGNSPEC')) define('TABLE_DESIGNSPEC', '`' . $config->db->prefix . 'designspec`');
if(!defined('TABLE_ISSUE')) define('TABLE_ISSUE', '`' . $config->db->prefix . 'issue`');
if(!defined('TABLE_RISK')) define('TABLE_RISK', '`' . $config->db->prefix . 'risk`');
if(!defined('TABLE_PROJECTSPEC')) define('TABLE_PROJECTSPEC', '`' . $config->db->prefix . 'projectspec`');
if(!defined('TABLE_WORKESTIMATION')) define('TABLE_WORKESTIMATION', '`' . $config->db->prefix . 'workestimation`');
if(!defined('TABLE_DURATIONESTIMATION')) define('TABLE_DURATIONESTIMATION', '`' . $config->db->prefix . 'durationestimation`');
if(!defined('TABLE_BUDGET')) define('TABLE_BUDGET', '`' . $config->db->prefix . 'budget`');
if(!defined('TABLE_SEARCHINDEX')) define('TABLE_SEARCHINDEX', $config->db->prefix . 'searchindex');
if(!defined('TABLE_SEARCHDICT')) define('TABLE_SEARCHDICT', $config->db->prefix . 'searchdict');
@@ -222,8 +221,6 @@ $config->objectTables['module'] = TABLE_MODULE;
$config->objectTables['caselib'] = TABLE_TESTSUITE;
$config->objectTables['entry'] = TABLE_ENTRY;
$config->objectTables['webhook'] = TABLE_WEBHOOK;
$config->objectTables['risk'] = TABLE_RISK;
$config->objectTables['issue'] = TABLE_ISSUE;
$config->objectTables['design'] = TABLE_DESIGN;
$config->objectTables['stakeholder'] = TABLE_STAKEHOLDER;
$config->objectTables['job'] = TABLE_JOB;
-18
View File
@@ -129,24 +129,6 @@ CREATE TABLE IF NOT EXISTS `zt_projectspec` (
UNIQUE KEY `project` (`project`,`version`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_durationestimation`;
CREATE TABLE IF NOT EXISTS `zt_durationestimation` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`PRJ` mediumint(8) unsigned NOT NULL,
`stage` mediumint(9) NOT NULL,
`workload` varchar(255) NOT NULL,
`worktimeRate` varchar(255) NOT NULL,
`people` varchar(255) NOT NULL,
`startDate` date NOT NULL,
`endDate` date NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_workestimation`;
CREATE TABLE IF NOT EXISTS `zt_workestimation` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
-17
View File
@@ -423,23 +423,6 @@ CREATE TABLE IF NOT EXISTS `zt_doclib` (
KEY `product` (`product`),
KEY `project` (`project`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_durationestimation`;
CREATE TABLE IF NOT EXISTS `zt_durationestimation` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`PRJ` mediumint(8) unsigned NOT NULL,
`stage` mediumint(9) NOT NULL,
`workload` varchar(255) NOT NULL,
`worktimeRate` varchar(255) NOT NULL,
`people` varchar(255) NOT NULL,
`startDate` date NOT NULL,
`endDate` date NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_effort`;
CREATE TABLE IF NOT EXISTS `zt_effort` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
+1 -1
View File
@@ -1245,7 +1245,7 @@ class block extends control
*/
public function printWaterfallEstimateBlock()
{
$this->app->loadLang('durationestimation');
if(isset($this->config->maxVersion)) $this->app->loadLang('durationestimation');
$programID = $this->session->PRJ;
$members = $this->loadModel('project')->getTeamMemberPairs($programID);
$budget = $this->loadModel('workestimation')->getBudget($programID);
@@ -1,11 +1,13 @@
<style> .block-waterfallestimate table{margin-bottom: 15px} </style>
<table class='table table-data'>
<?php if(isset($config->maxVersion)):?>
<tr>
<th class='w-100px'><?php echo $lang->durationestimation->people;?></th>
<td><?php echo $people ? $people : 0;?></td>
<th class='w-80px'><?php echo $lang->durationestimation->members;?></th>
<td><?php echo $members;?></td>
</tr>
<?php endif;?>
<tr>
<th><?php echo $lang->workestimation->duration;?></th>
<td><?php echo zget($budget, 'duration', 0);?></td>
+5 -7
View File
@@ -683,8 +683,6 @@ $lang->navGroup->compile = 'project';
$lang->navGroup->report = 'project';
$lang->navGroup->measrecord = 'project';
$lang->navGroup->durationestimation = 'project';
$lang->navGroup->sqlbuilder = 'system';
$lang->navGroup->auditcl = 'system';
$lang->navGroup->cmcl = 'system';
@@ -919,9 +917,14 @@ $lang->menu->scrum->qa = 'QA|qa|index';
$lang->menu->scrum->ci = 'Code|repo|browse';
$lang->menu->scrum->projectbuild = array('link' => 'Build|projectbuild|browse|project={PROJECT}');
$lang->menu->scrum->projectrelease = array('link' => 'Release|projectrelease|browse');
$lang->menu->scrum->other = array('link' => 'Other|project|other', 'class' => 'dropdown dropdown-hover waterfall-list', 'subModule' => 'issue,risk,stakeholder');
$lang->menu->scrum->projectsetting = array('link' => 'Setting|program|prjview|project={PROJECT}', 'alias' => 'prjedit,prjmanageproducts,prjgroup,prjmanagemembers,prjmanageview,prjmanagepriv,prjwhitelist,prjaddwhitelist');
$lang->scrum = new stdclass();
$lang->scrum->subMenu = new stdclass();
$lang->scrum->subMenu->other = new stdclass();
$lang->scrum->subMenu->other->stakeholder = array('link' => 'Stakeholder|stakeholder|browse|', 'subModule' => 'stakeholder');
$lang->scrum->setMenu = new stdclass();
$lang->scrum->setMenu->view = array('link' => 'View|program|prjview|project={PROJECT}');
$lang->scrum->setMenu->products = array('link' => 'Product|program|PRJManageProducts|project={PROJECT}', 'alias' => 'prjmanageproducts');
@@ -940,7 +943,6 @@ $lang->cm = new stdclass();
$lang->nc = new stdclass();
$lang->pssp = new stdclass();
$lang->stakeholder = new stdclass();
$lang->durationestimation = new stdclass();
$lang->projectstory = new stdclass();
$lang->workestimation->menu = new stdclass();
@@ -953,13 +955,9 @@ $lang->cm->menu = new stdclass();
$lang->pssp->menu = new stdclass();
$lang->stakeholder->menu = new stdclass();
$lang->waterfallproduct->menu = new stdclass();
$lang->durationestimation->menu = new stdclass();
$lang->projectstory->menu = new stdclass();
$lang->workestimation->menu->workestimation = 'Work Estimation|workestimation|index|project={PROJECT}';
$lang->workestimation->menu->duration = array('link' => 'Duration Estimation|durationestimation|index|project={PROJECT}', 'subModule' => 'durationestimation');
$lang->durationestimation->menu = $lang->workestimation->menu;
$lang->stakeholder->menu->list = array('link' => 'Stakeholder List|stakeholder|browse|', 'alias' => 'create,edit,view,batchcreate');
$lang->stakeholder->menu->issue = array('link' => 'Issue|stakeholder|issue|');
+5 -7
View File
@@ -683,8 +683,6 @@ $lang->navGroup->compile = 'project';
$lang->navGroup->report = 'project';
$lang->navGroup->measrecord = 'project';
$lang->navGroup->durationestimation = 'project';
$lang->navGroup->sqlbuilder = 'system';
$lang->navGroup->auditcl = 'system';
$lang->navGroup->cmcl = 'system';
@@ -919,9 +917,14 @@ $lang->menu->scrum->qa = 'QA|qa|index';
$lang->menu->scrum->ci = 'Code|repo|browse';
$lang->menu->scrum->projectbuild = array('link' => 'Build|projectbuild|browse|project={PROJECT}');
$lang->menu->scrum->projectrelease = array('link' => 'Release|projectrelease|browse');
$lang->menu->scrum->other = array('link' => 'Other|project|other', 'class' => 'dropdown dropdown-hover waterfall-list', 'subModule' => 'issue,risk,stakeholder');
$lang->menu->scrum->projectsetting = array('link' => 'Setting|program|prjview|project={PROJECT}', 'alias' => 'prjedit,prjmanageproducts,prjgroup,prjmanagemembers,prjmanageview,prjmanagepriv,prjwhitelist,prjaddwhitelist');
$lang->scrum = new stdclass();
$lang->scrum->subMenu = new stdclass();
$lang->scrum->subMenu->other = new stdclass();
$lang->scrum->subMenu->other->stakeholder = array('link' => '干系人|stakeholder|browse|', 'subModule' => 'stakeholder');
$lang->scrum->setMenu = new stdclass();
$lang->scrum->setMenu->view = array('link' => 'View|program|prjview|project={PROJECT}');
$lang->scrum->setMenu->products = array('link' => 'Product|program|PRJManageProducts|project={PROJECT}', 'alias' => 'prjmanageproducts');
@@ -940,7 +943,6 @@ $lang->cm = new stdclass();
$lang->nc = new stdclass();
$lang->pssp = new stdclass();
$lang->stakeholder = new stdclass();
$lang->durationestimation = new stdclass();
$lang->projectstory = new stdclass();
$lang->workestimation->menu = new stdclass();
@@ -953,13 +955,9 @@ $lang->cm->menu = new stdclass();
$lang->pssp->menu = new stdclass();
$lang->stakeholder->menu = new stdclass();
$lang->waterfallproduct->menu = new stdclass();
$lang->durationestimation->menu = new stdclass();
$lang->projectstory->menu = new stdclass();
$lang->workestimation->menu->workestimation = 'Work Estimation|workestimation|index|project={PROJECT}';
$lang->workestimation->menu->duration = array('link' => 'Duration Estimation|durationestimation|index|project={PROJECT}', 'subModule' => 'durationestimation');
$lang->durationestimation->menu = $lang->workestimation->menu;
$lang->stakeholder->menu->list = array('link' => 'Stakeholder List|stakeholder|browse|', 'alias' => 'create,edit,view,batchcreate');
$lang->stakeholder->menu->issue = array('link' => 'Issue|stakeholder|issue|');
+5 -7
View File
@@ -683,8 +683,6 @@ $lang->navGroup->compile = 'project';
$lang->navGroup->report = 'project';
$lang->navGroup->measrecord = 'project';
$lang->navGroup->durationestimation = 'project';
$lang->navGroup->sqlbuilder = 'system';
$lang->navGroup->auditcl = 'system';
$lang->navGroup->cmcl = 'system';
@@ -919,9 +917,14 @@ $lang->menu->scrum->qa = 'QA|qa|index';
$lang->menu->scrum->ci = 'Code|repo|browse';
$lang->menu->scrum->projectbuild = array('link' => 'Build|projectbuild|browse|project={PROJECT}');
$lang->menu->scrum->projectrelease = array('link' => 'Release|projectrelease|browse');
$lang->menu->scrum->other = array('link' => 'Other|project|other', 'class' => 'dropdown dropdown-hover waterfall-list', 'subModule' => 'issue,risk,stakeholder');
$lang->menu->scrum->projectsetting = array('link' => 'Setting|program|prjview|project={PROJECT}', 'alias' => 'prjedit,prjmanageproducts,prjgroup,prjmanagemembers,prjmanageview,prjmanagepriv,prjwhitelist,prjaddwhitelist');
$lang->scrum = new stdclass();
$lang->scrum->subMenu = new stdclass();
$lang->scrum->subMenu->other = new stdclass();
$lang->scrum->subMenu->other->stakeholder = array('link' => 'Stakeholder|stakeholder|browse|', 'subModule' => 'stakeholder');
$lang->scrum->setMenu = new stdclass();
$lang->scrum->setMenu->view = array('link' => 'View|program|prjview|project={PROJECT}');
$lang->scrum->setMenu->products = array('link' => 'Product|program|PRJManageProducts|project={PROJECT}', 'alias' => 'prjmanageproducts');
@@ -940,7 +943,6 @@ $lang->cm = new stdclass();
$lang->nc = new stdclass();
$lang->pssp = new stdclass();
$lang->stakeholder = new stdclass();
$lang->durationestimation = new stdclass();
$lang->projectstory = new stdclass();
$lang->workestimation->menu = new stdclass();
@@ -953,13 +955,9 @@ $lang->cm->menu = new stdclass();
$lang->pssp->menu = new stdclass();
$lang->stakeholder->menu = new stdclass();
$lang->waterfallproduct->menu = new stdclass();
$lang->durationestimation->menu = new stdclass();
$lang->projectstory->menu = new stdclass();
$lang->workestimation->menu->workestimation = 'Work Estimation|workestimation|index|project={PROJECT}';
$lang->workestimation->menu->duration = array('link' => 'Duration Estimation|durationestimation|index|project={PROJECT}', 'subModule' => 'durationestimation');
$lang->durationestimation->menu = $lang->workestimation->menu;
$lang->stakeholder->menu->list = array('link' => 'Stakeholder List|stakeholder|browse|', 'alias' => 'create,edit,view,batchcreate');
$lang->stakeholder->menu->issue = array('link' => 'Issue|stakeholder|issue|');
+5 -8
View File
@@ -683,8 +683,6 @@ $lang->navGroup->compile = 'project';
$lang->navGroup->report = 'project';
$lang->navGroup->measrecord = 'project';
$lang->navGroup->durationestimation = 'project';
$lang->navGroup->sqlbuilder = 'system';
$lang->navGroup->auditcl = 'system';
$lang->navGroup->cmcl = 'system';
@@ -918,10 +916,14 @@ $lang->menu->scrum->doc = 'Doc|doc|index|';
$lang->menu->scrum->qa = 'QA|qa|index';
$lang->menu->scrum->ci = 'Code|repo|browse';
$lang->menu->scrum->projectbuild = array('link' => 'Build|projectbuild|browse|project={PROJECT}');
$lang->menu->scrum->projectrelease = array('link' => 'Release|projectrelease|browse');
$lang->menu->scrum->other = array('link' => 'Other|project|other', 'class' => 'dropdown dropdown-hover waterfall-list', 'subModule' => 'issue,risk,stakeholder');
$lang->menu->scrum->projectsetting = array('link' => 'Setting|program|prjview|project={PROJECT}', 'alias' => 'prjedit,prjmanageproducts,prjgroup,prjmanagemembers,prjmanageview,prjmanagepriv,prjwhitelist,prjaddwhitelist');
$lang->scrum = new stdclass();
$lang->scrum->subMenu = new stdclass();
$lang->scrum->subMenu->other = new stdclass();
$lang->scrum->subMenu->other->stakeholder = array('link' => 'Stakeholder|stakeholder|browse|', 'subModule' => 'stakeholder');
$lang->scrum->setMenu = new stdclass();
$lang->scrum->setMenu->view = array('link' => 'View|program|prjview|project={PROJECT}');
$lang->scrum->setMenu->products = array('link' => 'Product|program|PRJManageProducts|project={PROJECT}', 'alias' => 'prjmanageproducts');
@@ -940,7 +942,6 @@ $lang->cm = new stdclass();
$lang->nc = new stdclass();
$lang->pssp = new stdclass();
$lang->stakeholder = new stdclass();
$lang->durationestimation = new stdclass();
$lang->projectstory = new stdclass();
$lang->workestimation->menu = new stdclass();
@@ -953,13 +954,9 @@ $lang->cm->menu = new stdclass();
$lang->pssp->menu = new stdclass();
$lang->stakeholder->menu = new stdclass();
$lang->waterfallproduct->menu = new stdclass();
$lang->durationestimation->menu = new stdclass();
$lang->projectstory->menu = new stdclass();
$lang->workestimation->menu->workestimation = 'Work Estimation|workestimation|index|project={PROJECT}';
$lang->workestimation->menu->duration = array('link' => 'Duration Estimation|durationestimation|index|project={PROJECT}', 'subModule' => 'durationestimation');
$lang->durationestimation->menu = $lang->workestimation->menu;
$lang->stakeholder->menu->list = array('link' => 'Stakeholder List|stakeholder|browse|', 'alias' => 'create,edit,view,batchcreate');
$lang->stakeholder->menu->issue = array('link' => 'Issue|stakeholder|issue|');
+5 -7
View File
@@ -681,8 +681,6 @@ $lang->navGroup->compile = 'project';
$lang->navGroup->report = 'project';
$lang->navGroup->measrecord = 'project';
$lang->navGroup->durationestimation = 'project';
$lang->navGroup->sqlbuilder = 'system';
$lang->navGroup->auditcl = 'system';
$lang->navGroup->cmcl = 'system';
@@ -917,9 +915,14 @@ $lang->menu->scrum->qa = '测试|qa|index';
$lang->menu->scrum->ci = '代码|repo|browse';
$lang->menu->scrum->projectbuild = array('link' => '版本|projectbuild|browse|project={PROJECT}');
$lang->menu->scrum->projectrelease = array('link' => '发布|projectrelease|browse');
$lang->menu->scrum->other = array('link' => '其他|project|other', 'class' => 'dropdown dropdown-hover waterfall-list', 'subModule' => 'issue,risk,stakeholder');
$lang->menu->scrum->projectsetting = array('link' => '设置|program|prjview|project={PROJECT}', 'alias' => 'prjedit,prjmanageproducts,prjgroup,prjmanagemembers,prjmanageview,prjmanagepriv,prjwhitelist,prjaddwhitelist');
$lang->scrum = new stdclass();
$lang->scrum->subMenu = new stdclass();
$lang->scrum->subMenu->other = new stdclass();
$lang->scrum->subMenu->other->stakeholder = array('link' => '干系人|stakeholder|browse|', 'subModule' => 'stakeholder');
$lang->scrum->setMenu = new stdclass();
$lang->scrum->setMenu->view = array('link' => '概况|program|prjview|project={PROJECT}', 'alias' => 'prjedit');
$lang->scrum->setMenu->products = array('link' => '产品|program|PRJManageProducts|project={PROJECT}', 'alias' => 'prjmanageproducts');
@@ -938,7 +941,6 @@ $lang->cm = new stdclass();
$lang->nc = new stdclass();
$lang->pssp = new stdclass();
$lang->stakeholder = new stdclass();
$lang->durationestimation = new stdclass();
$lang->projectstory = new stdclass();
$lang->workestimation->menu = new stdclass();
@@ -951,13 +953,9 @@ $lang->cm->menu = new stdclass();
$lang->pssp->menu = new stdclass();
$lang->stakeholder->menu = new stdclass();
$lang->waterfallproduct->menu = new stdclass();
$lang->durationestimation->menu = new stdclass();
$lang->projectstory->menu = new stdclass();
$lang->workestimation->menu->workestimation = '工作量估算|workestimation|index|project={PROJECT}';
$lang->workestimation->menu->duration = array('link' => '工期估算|durationestimation|index|project={PROJECT}', 'subModule' => 'durationestimation');
$lang->durationestimation->menu = $lang->workestimation->menu;
$lang->stakeholder->menu->list = array('link' => '干系人列表|stakeholder|browse|', 'alias' => 'create,edit,view,batchcreate');
$lang->stakeholder->menu->issue = array('link' => '问题管理|stakeholder|issue|');
-6
View File
@@ -1,6 +0,0 @@
<?php
$config->durationestimation = new stdclass();
$config->durationestimation->index = new stdclass();
$config->durationestimation->index->requiredFields = 'scale,productivity,scale,duration,unitLaborCost,totalLaborCost';
$config->durationestimation->workloadTotal = 100;
-137
View File
@@ -1,137 +0,0 @@
<?php
/**
* The control file of durationestimation of ZentaoPMS.
*
* @copyright Copyright 2009-2010 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv11.html)
* @author Xiying Guan <guanxiying@xirangit.com>
* @package durationestimation
* @version $Id$
* @link http://www.zentao.net
*/
class durationestimation extends control
{
/**
* Project duration estimation.
*
* @param int $projectID
* @access public
* @return void
*/
public function index($projectID)
{
$workestimation = $this->loadModel('workestimation')->getBudget($projectID);
if(empty($workestimation))
{
echo js::alert($this->lang->durationestimation->setWorkestimation);
die(js::locate($this->createLink('workestimation', 'index', "projectID=$projectID")));
}
$this->app->loadLang('programplan');
$project = $this->loadModel('program')->getPRJByID($projectID);
$stages = $this->loadModel('stage')->getStages('id_asc');
$estimationList = $this->durationestimation->getListByProject($projectID);
if(empty($estimationList)) $this->locate(inlink('create', "projectID=$projectID"));
$this->view->title = $this->lang->durationestimation->common . $this->lang->colon . $project->name;
$this->view->position[] = $this->lang->durationestimation->common;
$this->view->workestimation = $workestimation;
$this->view->estimationList = $estimationList;
$this->view->project = $project;
$this->view->stages = $stages;
$this->display();
}
/**
* Save the project duration estimate.
*
* @param int $projectID
* @access public
* @return void
*/
public function create($projectID = 0)
{
$workestimation = $this->loadModel('workestimation')->getBudget($projectID);
if(empty($workestimation))
{
echo js::alert($this->lang->durationestimation->setWorkestimation);
die(js::locate($this->createLink('workestimation', 'index', "projectID=$projectID")));
}
$this->app->loadLang('programplan');
if(!empty($_POST))
{
$total = 0;
foreach($this->post->workload as $value) $total += $value;
$workloadTotal = $this->config->durationestimation->workloadTotal;
if($total != $workloadTotal) $this->send(array('result' => 'fail', 'message' => $this->lang->durationestimation->workloadError));
$this->durationestimation->save($projectID);
if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError()));
$this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('index', "projectID={$projectID}")));
}
$project = $this->loadModel('program')->getPRJByID($projectID);
$this->view->title = $this->lang->durationestimation->common . $this->lang->colon . $project->name;
$this->view->position[] = $this->lang->durationestimation->common;
$this->view->project = $project;
$this->view->stages = $this->loadModel('stage')->getStages('id_asc');
$this->view->estimationList = $this->durationestimation->getListByProject($projectID);
$this->view->workestimation = $workestimation;
$this->display();
}
/**
* Calculate the end time of the duration.
*
* @param int $projectID
* @param int $stage
* @param int $workload
* @param int $worktimeRate
* @param int $people
* @param string $startDate
* @access public
* @return void
*/
public function ajaxGetDuration($projectID, $stage, $workload, $worktimeRate, $people, $startDate)
{
$startDate = str_replace('_', '-', $startDate);
if($startDate == '0000-00-00') $this->send(array('result' => 'success', 'endDate' => '0000-00-00'));
$estimation = $this->loadModel('workestimation')->getBudget($projectID);
$duration = $estimation->duration * $workload / 100;
$divisor = ($people == 0 || $estimation->dayHour == 0) ? 0 : $worktimeRate / 100 * $people * $estimation->dayHour;
$duration = $divisor == 0 ? 0 : $duration / $divisor;
if(!$divisor) $this->send(array('result' => 'fail'));
$holidays = array();
$workDays = array();
$i = 0;
$this->loadModel('project');
$startedTime = strtotime($startDate);
$days = 0;
for($i = 0; $days < $duration; $i ++)
{
$day = date('N', strtotime("+ $i days", $startedTime));
if($this->config->project->weekend == 2)
{
if($day > 5) continue;
}
if($this->config->project->weekend == 1)
{
if($day > 6) continue;
}
$lastDay = date('Y-m-d', strtotime("+ $i days", $startedTime));
$days ++;
}
$this->send(array('result' => 'success', 'endDate' => $lastDay));
}
}
-55
View File
@@ -1,55 +0,0 @@
$().ready(function()
{
$(':input[name*=people]').change(function()
{
var peopleNumber = 0;
$(':input[name*=people]').each(function()
{
var people = $(this).val();
if(people) peopleNumber += parseInt(people);
});
$('#totalStaff').html(peopleNumber);
});
$(':input[name*=workload]').change(function()
{
rate = parseFloat($(this).val());
workload = estimation.scale * rate / 100;
$(this).parents('td').next().find(':input').val(workload);
totalWorkload = 0;
$(':input[name*=workload]').each(function()
{
rate = parseFloat($(this).val());
workload = estimation.scale * rate / 100;
totalWorkload += workload;
});
$('#totalWorkload').html(totalWorkload.toFixed(2));
});
$(':input').change(function()
{
var that = $(this);
projectID = project.id;
stage = $(this).parents('tr').find('[name*=stage]').val();
workload = $(this).parents('tr').find('[name*=workload]').val();
worktimeRate = $(this).parents('tr').find('[name*=worktimeRate]').val();
people = $(this).parents('tr').find('[name*=people]').val();
startDate = $(this).parents('tr').find('[name*=startDate]').val();
if(startDate) startDate = startDate.replace(/-/g, '_');
if(isNaN(workload) || isNaN(worktimeRate) || isNaN(people) || startDate == '') return false;
url = createLink('durationestimation', 'ajaxGetDuration', 'projectID=' + projectID + '&stage=' + stage + '&workload=' + workload + '&worktimeRate=' + worktimeRate + '&people=' + people + '&startDate=' + startDate),
$.getJSON(
url,
function(response)
{
if(response.result == 'success')
{
that.parents('tr').find('[name*=endDate]').val(response.endDate);
}
}
);
});
$(':input').change();
})
-24
View File
@@ -1,24 +0,0 @@
<?php
$lang->durationestimation->index = 'Duration Home';
$lang->durationestimation->create = 'Settings';
$lang->durationestimation->common = 'Estimate Duration';
$lang->durationestimation->stage = 'Stage';
$lang->durationestimation->workloadRate = 'Workload %';
$lang->durationestimation->workload = 'Workload';
$lang->durationestimation->worktimeRate = 'Full-time %';
$lang->durationestimation->people = 'Estimated Man';
$lang->durationestimation->members = 'Actual Man';
$lang->durationestimation->startDate = 'Begin';
$lang->durationestimation->endDate = 'End';
$lang->durationestimation->setting = 'Settings';
$lang->durationestimation->setWorkestimation = "Enter the estimated workload information first.";
$lang->durationestimation->summary = "Project scale: <strong class='text-danger'> %s {$lang->hourCommon}</strong>; Estimated workload: <strong id='totalWorkload' class='text-danger'>0</strong>; Total number of men: <strong id='totalStaff' class='text-danger'>0</strong>";
$lang->durationestimation->workloadError = "The sum of the workload % should be 100%.";
$lang->durationestimation->placeholder = new stdclass();
$lang->durationestimation->placeholder->scale = '';
$lang->durationestimation->placeholder->productivity = '';
$lang->durationestimation->placeholder->duration = '';
$lang->durationestimation->placeholder->unitLaborCost = '';
$lang->durationestimation->placeholder->totalLaborCost = '';
-24
View File
@@ -1,24 +0,0 @@
<?php
$lang->durationestimation->index = 'Duration Home';
$lang->durationestimation->create = 'Settings';
$lang->durationestimation->common = 'Estimate Duration';
$lang->durationestimation->stage = 'Stage';
$lang->durationestimation->workloadRate = 'Workload %';
$lang->durationestimation->workload = 'Workload';
$lang->durationestimation->worktimeRate = 'Full-time %';
$lang->durationestimation->people = 'Estimated Man';
$lang->durationestimation->members = 'Actual Man';
$lang->durationestimation->startDate = 'Begin';
$lang->durationestimation->endDate = 'End';
$lang->durationestimation->setting = 'Settings';
$lang->durationestimation->setWorkestimation = "Enter the estimated workload information first.";
$lang->durationestimation->summary = "Project scale: <strong class='text-danger'> %s {$lang->hourCommon}</strong>; Estimated workload: <strong id='totalWorkload' class='text-danger'>0</strong>; Total number of men: <strong id='totalStaff' class='text-danger'>0</strong>";
$lang->durationestimation->workloadError = "The sum of the workload % should be 100%.";
$lang->durationestimation->placeholder = new stdclass();
$lang->durationestimation->placeholder->scale = '';
$lang->durationestimation->placeholder->productivity = '';
$lang->durationestimation->placeholder->duration = '';
$lang->durationestimation->placeholder->unitLaborCost = '';
$lang->durationestimation->placeholder->totalLaborCost = '';
-24
View File
@@ -1,24 +0,0 @@
<?php
$lang->durationestimation->index = 'Duration Home';
$lang->durationestimation->create = 'Settings';
$lang->durationestimation->common = 'Estimate Duration';
$lang->durationestimation->stage = 'Stage';
$lang->durationestimation->workloadRate = 'Workload %';
$lang->durationestimation->workload = 'Workload';
$lang->durationestimation->worktimeRate = 'Full-time %';
$lang->durationestimation->people = 'Estimated Man';
$lang->durationestimation->members = 'Actual Man';
$lang->durationestimation->startDate = 'Begin';
$lang->durationestimation->endDate = 'End';
$lang->durationestimation->setting = 'Settings';
$lang->durationestimation->setWorkestimation = "Enter the estimated workload information first.";
$lang->durationestimation->summary = "Project scale: <strong class='text-danger'> %s {$lang->hourCommon}</strong>; Estimated workload: <strong id='totalWorkload' class='text-danger'>0</strong>; Total number of men: <strong id='totalStaff' class='text-danger'>0</strong>";
$lang->durationestimation->workloadError = "The sum of the workload % should be 100%.";
$lang->durationestimation->placeholder = new stdclass();
$lang->durationestimation->placeholder->scale = '';
$lang->durationestimation->placeholder->productivity = '';
$lang->durationestimation->placeholder->duration = '';
$lang->durationestimation->placeholder->unitLaborCost = '';
$lang->durationestimation->placeholder->totalLaborCost = '';
-24
View File
@@ -1,24 +0,0 @@
<?php
$lang->durationestimation->index = 'Duration Home';
$lang->durationestimation->create = 'Settings';
$lang->durationestimation->common = 'Estimate Duration';
$lang->durationestimation->stage = 'Stage';
$lang->durationestimation->workloadRate = 'Workload %';
$lang->durationestimation->workload = 'Workload';
$lang->durationestimation->worktimeRate = 'Full-time %';
$lang->durationestimation->people = 'Estimated Man';
$lang->durationestimation->members = 'Actual Man';
$lang->durationestimation->startDate = 'Begin';
$lang->durationestimation->endDate = 'End';
$lang->durationestimation->setting = 'Settings';
$lang->durationestimation->setWorkestimation = "Enter the estimated workload information first.";
$lang->durationestimation->summary = "Project scale: <strong class='text-danger'> %s {$lang->hourCommon}</strong>; Estimated workload: <strong id='totalWorkload' class='text-danger'>0</strong>; Total number of men: <strong id='totalStaff' class='text-danger'>0</strong>";
$lang->durationestimation->workloadError = "The sum of the workload % should be 100%.";
$lang->durationestimation->placeholder = new stdclass();
$lang->durationestimation->placeholder->scale = '';
$lang->durationestimation->placeholder->productivity = '';
$lang->durationestimation->placeholder->duration = '';
$lang->durationestimation->placeholder->unitLaborCost = '';
$lang->durationestimation->placeholder->totalLaborCost = '';
-24
View File
@@ -1,24 +0,0 @@
<?php
$lang->durationestimation->index = '工期估算首页';
$lang->durationestimation->create = '工期估算设置';
$lang->durationestimation->common = '项目工期估算';
$lang->durationestimation->stage = '阶段';
$lang->durationestimation->workloadRate = '工作量占比';
$lang->durationestimation->workload = '工作量';
$lang->durationestimation->worktimeRate = '全时率';
$lang->durationestimation->people = '估算人数';
$lang->durationestimation->members = '投入人数';
$lang->durationestimation->startDate = '开始日期';
$lang->durationestimation->endDate = '结束日期';
$lang->durationestimation->setting = '设置';
$lang->durationestimation->setWorkestimation = "请先录入工作量估算信息";
$lang->durationestimation->summary = "项目规模: <strong class='text-danger'> %s {$lang->hourCommon}</strong>, 估算工作量: <strong id='totalWorkload' class='text-danger'>0</strong>, 总投入人数: <strong id='totalStaff' class='text-danger'>0</strong>";
$lang->durationestimation->workloadError = "工作量占比之和必须是100%";
$lang->durationestimation->placeholder = new stdclass();
$lang->durationestimation->placeholder->scale = '';
$lang->durationestimation->placeholder->productivity = '';
$lang->durationestimation->placeholder->duration = '';
$lang->durationestimation->placeholder->unitLaborCost = '';
$lang->durationestimation->placeholder->totalLaborCost = '';
-24
View File
@@ -1,24 +0,0 @@
<?php
$lang->durationestimation->index = '工期估算首頁';
$lang->durationestimation->create = '工期估算設置';
$lang->durationestimation->common = '項目工期估算';
$lang->durationestimation->stage = '階段';
$lang->durationestimation->workloadRate = '工作量占比';
$lang->durationestimation->workload = '工作量';
$lang->durationestimation->worktimeRate = '全時率';
$lang->durationestimation->people = '估算人數';
$lang->durationestimation->members = '投入人數';
$lang->durationestimation->startDate = '開始日期';
$lang->durationestimation->endDate = '結束日期';
$lang->durationestimation->setting = '設置';
$lang->durationestimation->setWorkestimation = "請先錄入工作量估算信息";
$lang->durationestimation->summary = "項目規模: <strong class='text-danger'> %s {$lang->hourCommon}</strong>, 估算工作量: <strong id='totalWorkload' class='text-danger'>0</strong>, 總投入人數: <strong id='totalStaff' class='text-danger'>0</strong>";
$lang->durationestimation->workloadError = "工作量占比之和必須是100%";
$lang->durationestimation->placeholder = new stdclass();
$lang->durationestimation->placeholder->scale = '';
$lang->durationestimation->placeholder->productivity = '';
$lang->durationestimation->placeholder->duration = '';
$lang->durationestimation->placeholder->unitLaborCost = '';
$lang->durationestimation->placeholder->totalLaborCost = '';
-51
View File
@@ -1,51 +0,0 @@
<?php
/**
* The model file of durationestimation of ZentaoPMS.
*
* @copyright Copyright 2009-2010 QingDao Nature Easy Soft Network Technology Co,LTD (www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv11.html)
* @author Xiying Guan <guanxiying@xirangit.com>
* @package durationestimation
* @version $Id$
* @link http://www.zentao.net
*/
class durationestimationModel extends model
{
/**
* Get the project duration estimate.
*
* @param int $projectID
* @access public
* @return void
*/
public function getListByProject($projectID)
{
return $this->dao->select('*')->from(TABLE_DURATIONESTIMATION)->where('PRJ')->eq($projectID)->fetchAll('stage');
}
/**
* Save the project duration estimate.
*
* @param int $projectID
* @access public
* @return void
*/
public function save($projectID)
{
$this->dao->delete()->from(TABLE_DURATIONESTIMATION)->where('PRJ')->eq($projectID);
foreach($this->post->stage as $i => $stage)
{
$data = new stdclass;
$data->PRJ = $projectID;
$data->stage = $stage;
$data->workload = $this->post->workload[$i];
$data->worktimeRate = $this->post->worktimeRate[$i];
$data->people = $this->post->people[$i];
$data->startDate = $this->post->startDate[$i];
$data->endDate = $this->post->endDate[$i];
$this->dao->insert(TABLE_DURATIONESTIMATION)->data($data)->exec();
}
return !dao::isError();
}
}
@@ -1,66 +0,0 @@
<?php include '../../common/view/header.html.php';?>
<?php js::set('project', $project);?>
<?php js::set('estimation', $workestimation);?>
<div id='mainContent' class='main-content'>
<form class='main-form form-ajax' method='post' id='stageForm' enctype='multipart/form-data'>
<table class='table table-bordered table-form'>
<thead>
<tr class='text-center'>
<th><?php echo $lang->durationestimation->stage;?></th>
<th><?php echo $lang->durationestimation->workloadRate;?></th>
<th><?php echo $lang->durationestimation->workload;?></th>
<th><?php echo $lang->durationestimation->worktimeRate;?></th>
<th><?php echo $lang->durationestimation->people;?></th>
<th><?php echo $lang->durationestimation->startDate;?></th>
<th><?php echo $lang->durationestimation->endDate;?></th>
</tr>
</thead>
<tbody>
<?php $i = 0;?>
<?php if(!empty($stages)):?>
<?php foreach($stages as $stage):?>
<?php $estimation = zget($estimationList, $stage->id, array());?>
<tr>
<td>
<?php echo $stage->name;?>
<?php echo html::hidden('stage[]', $stage->id);?>
</td>
<td>
<div class='input-group'>
<input type='text' name='workload[]' id='workload<?php echo $i;?>' value='<?php echo zget($estimation, 'workload', $stage->percent); ?>' class='form-control' />
<span class='input-group-addon'>%</span>
</div>
</td>
<td>
<div class='input-group'>
<input type='text' value='' class='form-control' />
<span class='input-group-addon'><?php echo $lang->hourCommon;?></span>
</div>
</td>
<td>
<div class='input-group'>
<input type='text' name='worktimeRate[]' id='<?php echo $i;?>' value='<?php echo zget($estimation, 'worktimeRate', '100');?>' class='form-control' />
<span class='input-group-addon'>%</span>
</div>
</td>
<td><input type='text' name='people[]' id='people<?php echo $i;?>' value='<?php echo zget($estimation, 'people', 0);?>' class='form-control' /></td>
<td><input type='text' name='startDate[]' id='startDate<?php echo $i;?>' value='<?php echo zget($estimation, 'startDate', '');?>' class='form-control form-date' /></td>
<td><input type='text' name='endDate[]' id='endDate<?php echo $i;?>' value='<?php echo zget($estimation, 'endDate', '');?>' class='form-control form-date' /></td>
</tr>
<?php $i ++;?>
<?php endforeach;?>
<?php endif;?>
<tr>
<td colspan='7'><?php printf($lang->durationestimation->summary, zget($workestimation, 'scale', ''));?></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan='7' class='text-center form-actions'><?php echo html::submitButton() . ' ' . html::backButton(); ?></td>
</tr>
</tfoot>
</table>
<?php js::set('i', $i);?>
</form>
</div>
<?php include '../../common/view/footer.html.php';?>
@@ -1,43 +0,0 @@
<?php include '../../common/view/header.html.php';?>
<div id='mainContent' class='main-content'>
<form class='main-form form-ajax' method='post' id='planForm' enctype='multipart/form-data'>
<table class='table table-list table-bordered'>
<thead>
<tr class='text-center'>
<th><?php echo $lang->durationestimation->stage;?></th>
<th><?php echo $lang->durationestimation->workload;?></th>
<th><?php echo $lang->durationestimation->worktimeRate;?></th>
<th><?php echo $lang->durationestimation->people;?></th>
<th><?php echo $lang->durationestimation->startDate;?></th>
<th><?php echo $lang->durationestimation->endDate;?></th>
</tr>
</thead>
<tbody>
<?php $i = 0;?>
<?php foreach($stages as $plan):?>
<?php $estimation = zget($estimationList, $plan->id, 0);?>
<tr class='text-center'>
<td>
<?php echo $plan->name;?>
<?php echo html::hidden('stage[]', $plan->id);?>
</td>
<td><?php echo zget($estimation, 'workload', ''); ?>% </td>
<td><?php echo zget($estimation, 'worktimeRate', '');?>% </td>
<td><?php echo zget($estimation, 'people', '');?></td>
<td><?php echo zget($estimation, 'startDate', '');?></td>
<td><?php echo zget($estimation, 'endDate', '');?></td>
</tr>
<?php $i ++;?>
<?php endforeach;?>
</tbody>
<tfoot>
<tr>
<td colspan='6' class='form-actions text-center'>
<?php echo html::a(inlink('create', "projectID={$project->id}"), $lang->durationestimation->setting, '', "class='btn btn-primary'");?>
</td>
</tr>
</tfoot>
</table>
</form>
</div>
<?php include '../../common/view/footer.html.php';?>
-9
View File
@@ -65,7 +65,6 @@ $lang->moduleOrder[210] = 'design';
$lang->moduleOrder[215] = 'programplan';
$lang->moduleOrder[240] = 'workestimation';
$lang->moduleOrder[245] = 'durationestimation';
$lang->resource = new stdclass();
@@ -1197,14 +1196,6 @@ $lang->resource->workestimation->index = 'index';
$lang->workestimation->methodOrder[0] = 'index';
/* Duration estimation. */
$lang->resource->durationestimation = new stdclass();
$lang->resource->durationestimation->index = 'index';
$lang->resource->durationestimation->create = 'create';
$lang->durationestimation->methodOrder[0] = 'index';
$lang->durationestimation->methodOrder[5] = 'create';
/* Department. */
$lang->resource->dept = new stdclass();
$lang->resource->dept->browse = 'browse';
+9 -1
View File
@@ -141,7 +141,15 @@ $lang->product->statusList[''] = '';
$lang->product->statusList['normal'] = '正常';
$lang->product->statusList['closed'] = '结束';
$lang->product->aclList['private'] = "私有({$lang->productCommon}相关负责人、所属项目集的干系人、相关联项目的团队成员和干系人可访问)";
global $config;
if($config->systemMode == 'new')
{
$lang->product->aclList['private'] = "私有({$lang->productCommon}相关负责人、所属项目集的干系人、相关联项目的团队成员和干系人可访问)";
}
else
{
$lang->product->aclList['private'] = "私有({$lang->productCommon}相关负责人、相关联{$lang->executionCommon}的团队成员可访问)";
}
$lang->product->aclList['open'] = "公开(有{$lang->productCommon}视图权限,即可访问)";
//$lang->product->aclList['custom'] = '自定义白名单(团队成员和白名单的成员可以访问)';
View File
-8
View File
@@ -1,8 +0,0 @@
<?php
class productset extends control
{
public function browse()
{
$this->display();
}
}
-5
View File
@@ -1,5 +0,0 @@
<?php
class productsetModel extends model
{
}
-15
View File
@@ -1,15 +0,0 @@
<?php
/**
* The browse view file of productset module of ZenTaoPMS.
*
* @copyright Copyright 2009-2015 青岛易软天创网络科技有限公司(QingDao Nature Easy Soft Network Technology Co,LTD, www.cnezsoft.com)
* @license ZPL (http://zpl.pub/page/zplv12.html)
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
* @package productset
* @version $Id: browse.html.php 4707 2013-05-02 06:57:41Z chencongzhi520@gmail.com $
* @link http://www.zentao.net
*/
?>
<?php include '../../common/view/header.html.php';?>
<?php include '../../common/view/footer.html.php';?>
+1 -1
View File
@@ -21,7 +21,7 @@
<span class='input-group-addon'><?php echo $lang->project->selectDept?></span>
<?php echo html::select('dept', $depts, $dept, "class='form-control chosen' onchange='setDeptUsers(this)' data-placeholder='{$lang->project->selectDeptTitle}'");?>
</div>
<?php if($project->parent):?>
<?php if($project->parent and $config->systemMode == 'new'):?>
<?php echo html::a($this->createLink('stakeholder', 'batchcreate', "dept=&parent=$project->parent"), $lang->program->importStakeholder, '', 'class="btn btn-primary"');?>
<?php endif;?>
</div>
+12 -1
View File
@@ -458,6 +458,11 @@ class story extends control
$showFields = str_replace(array(0 => ",branch,", 1 => ",platform,"), '', ",$showFields,");
$showFields = trim($showFields, ',');
}
if($type == 'requirement')
{
unset($customFields['plan']);
$showFields = str_replace('plan', '', $showFields);
}
$this->view->customFields = $customFields;
$this->view->showFields = $showFields;
@@ -705,8 +710,14 @@ class story extends control
/* Set Custom*/
foreach(explode(',', $this->config->story->list->customBatchEditFields) as $field) $customFields[$field] = $this->lang->story->$field;
$showFields = $this->config->story->custom->batchEditFields;
if($storyType == 'requirement')
{
unset($customFields['plan']);
$showFields = str_replace('plan', '', $showFields);
}
$this->view->customFields = $customFields;
$this->view->showFields = $this->config->story->custom->batchEditFields;
$this->view->showFields = $showFields;
/* Judge whether the editedStories is too large and set session. */
$countInputVars = count($stories) * (count(explode(',', $this->config->story->custom->batchEditFields)) + 3);
+1 -1
View File
@@ -141,7 +141,7 @@
</div>
<?php else:?>
<div class="table-empty-tip">
<p><span class="text-muted"><?php echo $lang->testcase->noCase;?></span> <?php if($canBeChanged) common::printLink('testtask', 'linkCase', "taskID={$taskID}", "<i class='icon icon-plus'></i> " . $lang->testtask->linkCase, '', "class='btn btn-info'");?></p>
<p><span class="text-muted"><?php echo $lang->testcase->noCase;?></span> <?php if($canBeChanged) common::printLink('testtask', 'linkCase', "taskID={$taskID}", "<i class='icon icon-link'></i> " . $lang->testtask->linkCase, '', "class='btn btn-info'");?></p>
</div>
<?php endif;?>
</form>