This commit is contained in:
Yagami
2020-08-25 16:38:02 +08:00
14 changed files with 382 additions and 74 deletions
+8 -2
View File
@@ -1114,7 +1114,13 @@ class block extends control
*/
public function printCmmiGanttBlock()
{
$this->view->program = $this->loadModel('project')->getByID($this->session->program);
$products = $this->loadModel('product')->getPairs();
$productID = isset($this->session->product) ? 0 : $this->session->product;
if($productID && !array_key_exists($productID, $products)) $productID = 0;
$this->view->plans = $this->loadModel('programplan')->getDataForGantt($this->session->program, $productID);
$this->view->products = $products;
$this->view->productID = $productID;
}
/**
@@ -1192,7 +1198,7 @@ class block extends control
$start = $begin;
$longProgram = helper::diffDate($today, $begin) / 7 > 10;
while($start < $end)
{
{
$charts['labels'][] = $longProgram ? $this->lang->milestone->chart->time . $i . $this->lang->milestone->chart->month : $this->lang->milestone->chart->time . $i . $this->lang->milestone->chart->week;
$stageEnd = $longProgram ? date('Y-m-t', strtotime($start)) : $this->weekly->getThisSunday($start);
$charts['PV'] .= $this->milestone->getPV($projectIdList, $begin, $stageEnd) . ',';
+167
View File
@@ -0,0 +1,167 @@
<div class="panel-body">
<div id='cmmiGantt'>
<?php echo html::select('cmmiGanttProductID', $products, $productID, "class='form-control chosen'"); ?>
<div class='gantt clearfix'>
<div class='gantt-plans pull-left'></div>
<div class='gantt-container scrollbar-hover'>
<div class='gantt-canvas'></div>
</div>
</div>
</div>
<style>
.block-cmmigantt > .panel-body {overflow: visible!important;}
#cmmiGantt {position: relative;}
#cmmiGanttProductID_chosen {position: absolute; top: -39px; left: 120px; width: 150px!important;}
[lang="zh-cn"] #cmmiGanttProductID_chosen {left: 85px}
.gantt-plans {padding: 20px 0 12px}
.gantt-plan {margin-top: 10px; line-height: 20px;}
.gantt-container {position: absolute; left: 100px; top: 0; right: 0; bottom: -10px; overflow-x: auto; padding-top: 20px;}
.gantt-canvas {border: 1px solid #dddee4; border-style: solid dotted; position: relative}
.gantt-row {height: 50px; position: relative; z-index: 1}
.gantt-row:hover {background-color: rgba(0,0,0,.05);}
.gantt-bar {height: 15px; background: #dddee4; position: absolute; left: 0; top: 10px}
.gantt-bar-progress {height: 15px; margin-bottom: 5px}
.gantt-task-info {white-space: nowrap; width: 100%; overflow: visible;}
.gantt-col {position: absolute; z-index: 0; top: 0; border-right: 1px dotted #dddee4;}
.gantt-col-time {position: absolute; top: -18px; left: 0}
</style>
<script>
function initCmmiGanttBlock()
{
var ganttData = <?php echo $plans; ?>;
if(!ganttData.data) ganttData = {data: []};
var plans = [];
var tasks = [];
var plansMap = {};
var startDatetime = Number.MAX_SAFE_INTEGER;
var endDatetime = 0;
var minTimeGap = Number.MAX_SAFE_INTEGER;
var $gantt = $('#cmmiGantt');
var ONE_DAY = 24 * 3600 * 1000;
var TIME_GAP_STEP = 7;
var MIN_COL_WIDTH = 60;
$.each(ganttData.data, function(index, item)
{
plansMap[item.id] = item;
if(item.type === 'plan' && item.parent === '0')
{
item.startDatetime = createDatetime(item.start_date);
item.endDatetime = createDatetime(item.deadline);
startDatetime = Math.min(startDatetime, item.startDatetime);
endDatetime = Math.max(endDatetime, item.endDatetime);
minTimeGap = Math.min(minTimeGap, endDatetime - startDatetime);
item.tasks = [];
item.completeTasks = [];
item.progress = 0;
plans.push(item);
}
else if(item.type === 'task')
{
item.progress = Number.parseInt(item.taskProgress.replace('%', ''), 10);
tasks.push(item);
}
});
$.each(tasks, function(index, task)
{
var plan = plansMap[task.parent];
while(plan.parent !== '0') plan = plansMap[plan.parent];
plan.progress += task.progress;
if(task.progress === 100) plan.completeTasks.push(task);
plan.tasks.push(task);
});
var $plans = $gantt.find('.gantt-plans');
var $ganttContainer = $gantt.find('.gantt-container');
var $ganttCanvas = $gantt.find('.gantt-canvas');
var themeColor = $.getThemeColor('primary');
var days = Math.ceil((endDatetime - startDatetime) / ONE_DAY);
var canvasHeight = plans.length * 50 + 10;
minTimeGap = Math.max(1, Math.ceil(minTimeGap / ONE_DAY));
// Update gantt plans and bars
$.each(plans, function(index, plan)
{
plan.progress = !plan.tasks.length ? 0 : plan.progress / plan.tasks.length;
var $plan = $('<div class="gantt-plan"></div>');
$plan.append('<div class="strong">' + plan.text + '</div>');
$plan.append('<div class="text-muted small"><?php echo $lang->programplan->planPercent?> ' + plan.percent + '%</div>');
$plans.append($plan);
var $bar = $('<div class="gantt-bar"></div>');
$('<div class="gantt-bar-progress bg-primary"></div>').css(
{
width: plan.progress + '%',
background: themeColor,
}).appendTo($bar);
$bar.append('<div class="gantt-task-info text-muted small"><?php echo $lang->programplan->task;?> ' + plan.completeTasks.length + '/' + plan.tasks.length + '</div>').attr('title', $.zui.formatDate(plan.startDatetime, 'yyyy-MM-dd') + '~' + $.zui.formatDate(plan.endDatetime, 'yyyy-MM-dd'));
var $row = $('<div class="gantt-row" data-id="' + plan.id + '"></div>').append($bar);
$ganttCanvas.append($row);
});
// Layout gantt container
$ganttContainer.css('left', $plans.width() + 15);
$ganttCanvas.css('height', canvasHeight);
var $cmmiGanttProductID = $('#cmmiGanttProductID');
if(!$cmmiGanttProductID.data('chosen')) $cmmiGanttProductID.chosen();
$cmmiGanttProductID.on('change', function()
{
$.get(createLink('product', 'ajaxSetState', 'productID=' + $cmmiGanttProductID.val()), function()
{
refreshBlock($cmmiGanttProductID.closest('.panel'));
});
});
layoutGantt();
$(window).on('resize', layoutGantt);
setTimeout(layoutGantt, 100);
function layoutGantt()
{
var minWidth = $ganttContainer.width();
var timeGap = minTimeGap < TIME_GAP_STEP ? minTimeGap : Math.floor(minTimeGap / TIME_GAP_STEP) * TIME_GAP_STEP;
var colsCount = Math.ceil(days / timeGap);
var canvasWidth = Math.max(minWidth, colsCount * MIN_COL_WIDTH);
var colWidth = Math.floor(canvasWidth / colsCount);
var pxPerMs = colWidth / (timeGap * ONE_DAY);
$ganttCanvas.css('width', canvasWidth).find('.gantt-col').remove();
for (var i = 0; i < colsCount; ++i)
{
var $col = $('<div class="gantt-col"></div>');
$col.css(
{
left: i * colWidth,
width: colWidth,
height: canvasHeight
});
var colTime = startDatetime + i * timeGap * ONE_DAY;
$col.append('<div class="gantt-col-time text-muted small">' + $.zui.formatDate(colTime, 'MM/dd') + '</div>');
$ganttCanvas.append($col);
}
$.each(plans, function(index, plan)
{
var $planRow = $gantt.find('.gantt-row[data-id="' + plan.id + '"]');
$planRow.find('.gantt-bar').css(
{
left: Math.floor((plan.startDatetime - startDatetime) * pxPerMs),
width: Math.floor((plan.endDatetime - plan.startDatetime) * pxPerMs)
});
});
}
function createDatetime(dateStr)
{
dateStr = dateStr.split('-');
var year = Number.parseInt(dateStr[0].length > 3 ? dateStr[0] : dateStr[2], 10);
var month = Number.parseInt(dateStr[1], 10);
var day = Number.parseInt(dateStr[2].length > 3 ? dateStr[0] : dateStr[2], 10);
return new Date(year, month - 1, day).getTime();
}
}
initCmmiGanttBlock();
</script>
</div>
@@ -63,7 +63,7 @@ html[lang="en"] .product-info .type-info {color: #A6AAB8; text-align: center; po
.status-count{margin:auto}
.status-count tr:first-child td:last-child{color:#000;font-weight:bold}
.block-statistic .progress-group{margin-top: 20px; height: 65px;}
.block-statistic .progress-group{margin-top: 20px; margin-bottom: 10px; height: 65px;}
.block-statistic .weekly-title{font-weight: bold; font-size:14px; color: #3C4253;}
.block-statistic .weekly-small{font-size:12px; color: #838A9D;}
.block-statistic .weekly-progress {font-weight: bold; font-size:24px;}
+24
View File
@@ -0,0 +1,24 @@
<?php
$lang->durationestimation->index = 'Estimated lead time home';
$lang->durationestimation->create = 'Time estimate setting';
$lang->durationestimation->common = 'Estimation of project duration';
$lang->durationestimation->stage = 'Stage';
$lang->durationestimation->workloadRate = 'Workload share';
$lang->durationestimation->workload = 'Workload';
$lang->durationestimation->worktimeRate = 'Full-time rate';
$lang->durationestimation->people = 'Estimated number';
$lang->durationestimation->members = 'Number of people invested';
$lang->durationestimation->startDate = 'Start date';
$lang->durationestimation->endDate = 'End Date';
$lang->durationestimation->setting = 'Set Up';
$lang->durationestimation->setWorkestimation = "Please enter the estimated workload information first";
$lang->durationestimation->summary = "Project scale: <strong class='text-danger'> %s {$lang->hourCommon}</strong>, Estimate workload: <strong id='totalWorkload' class='text-danger'>0</strong>, Total number of participants: <strong id='totalStaff' class='text-danger'>0</strong>";
$lang->durationestimation->workloadError = "The sum of the workload must 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 = '';
+4 -2
View File
@@ -16,10 +16,12 @@ class milestone extends control
die;
}
$productID = $this->loadModel('product')->getProductIDByProject($projectID);
$stageList = $this->loadModel('programplan')->getPairs($programID, $productID);
unset($stageList[0]);
$this->view->projectID = $projectID;
$this->view->programID = $programID;
$this->view->stageList = $stageList;
@@ -54,7 +56,7 @@ class milestone extends control
public function ajaxSaveEstimate()
{
$taskID = $this->post->taskID;
$estimate = $this->post->estimate;
$estimate = $this->post->estimate;
$re = $this->milestone->ajaxSaveEstimate($taskID,$estimate);
$this->send(array('result' => 'success','message' => $this->lang->saveSuccess));
}
+1 -2
View File
@@ -109,8 +109,7 @@ function initMilestoneChart()
});
}
if(betterWidth > 200) setTimeout(renderChart, 100);
else renderChart();
setTimeout(renderChart, betterWidth > 200 ? 100 : 10);
}
initMilestoneChart();
</script>
+16 -3
View File
@@ -622,9 +622,9 @@ class product extends control
/**
* Ajax set unfoldID.
*
* @param int $productID
* @param string $action
*
* @param int $productID
* @param string $action
* @access public
* @return void
*/
@@ -834,4 +834,17 @@ class product extends control
$this->display();
}
/**
* Set product id to session in ajax
*
* @param int $productID
* @access public
* @return void
*/
public function ajaxSetState($productID)
{
$this->session->set('product', (int)$productID);
$this->send(array('result' => 'success', 'productID' => $this->session->product));
}
}
+44 -44
View File
@@ -11,7 +11,7 @@ class program extends control
/**
* Program index view.
*
*
* @param int $programID
* @access public
* @return void
@@ -31,7 +31,7 @@ class program extends control
/**
* Program list.
*
*
* @param varchar $status
* @param varchar $orderBy
* @param int $recTotal
@@ -53,7 +53,7 @@ class program extends control
if($programType === 'bygrid')
{
$programs = $this->program->getProgramStats('all', 20, $orderBy, $pager);
$programs = $this->program->getProgramStats($status, 20, $orderBy, $pager);
}
else
{
@@ -73,7 +73,7 @@ class program extends control
/**
* Program create guide.
*
*
* @access public
* @return void
*/
@@ -84,10 +84,10 @@ class program extends control
/**
* Create a program.
*
* @param string $template
* @param int $programID
* @param int $copyProgramID
*
* @param string $template
* @param int $programID
* @param int $copyProgramID
* @access public
* @return void
*/
@@ -152,7 +152,7 @@ class program extends control
/**
* Edit a program.
*
*
* @param int $programID
* @access public
* @return void
@@ -189,8 +189,8 @@ class program extends control
/**
* Browse groups.
*
* @param int $companyID
*
* @param int $companyID
* @access public
* @return void
*/
@@ -215,7 +215,7 @@ class program extends control
/**
* Create a group.
*
*
* @access public
* @return void
*/
@@ -236,8 +236,8 @@ class program extends control
/**
* Edit a group.
*
* @param int $groupID
*
* @param int $groupID
* @access public
* @return void
*/
@@ -260,8 +260,8 @@ class program extends control
/**
* Copy a group.
*
* @param int $groupID
*
* @param int $groupID
* @access public
* @return void
*/
@@ -283,9 +283,9 @@ class program extends control
}
/**
* manageView
*
* @param int $groupID
* manageView
*
* @param int $groupID
* @access public
* @return void
*/
@@ -305,7 +305,7 @@ class program extends control
$this->view->title = $group->name . $this->lang->colon . $this->lang->group->manageView;
$this->view->position[] = $group->name;
$this->view->position[] = $this->lang->group->manageView;
$this->view->group = $group;
$this->view->products = $this->dao->select('*')->from(TABLE_PRODUCT)->where('deleted')->eq('0')->andWhere('program')->eq($group->program)->orderBy('order_desc')->fetchPairs('id', 'name');
$this->view->projects = $this->dao->select('*')->from(TABLE_PROJECT)->where('deleted')->eq('0')->andWhere('program')->eq($group->program)->orderBy('order_desc')->fetchPairs('id', 'name');
@@ -322,7 +322,7 @@ class program extends control
*/
public function managePriv($type = 'byGroup', $param = 0, $menu = '', $version = '')
{
if($type == 'byGroup')
if($type == 'byGroup')
{
$groupID = $param;
$group = $this->group->getById($groupID);
@@ -366,7 +366,7 @@ class program extends control
$this->view->version = $version;
$program = $this->project->getByID($group->program);
/* Unset not program privs. */
foreach($this->lang->resource as $method => $label)
foreach($this->lang->resource as $method => $label)
{
if(!in_array($method, $this->config->programPriv->{$program->template})) unset($this->lang->resource->$method);
}
@@ -377,8 +377,8 @@ class program extends control
/**
* Manage members of a group.
*
* @param int $groupID
*
* @param int $groupID
* @param int $deptID
* @access public
* @return void
@@ -412,7 +412,7 @@ class program extends control
/**
* Manage program members.
*
*
* @param int $projectID
* @param int $dept
* @access public
@@ -422,12 +422,12 @@ class program extends control
{
$this->session->set('program', $projectID);
if(!empty($_POST))
{
{
$this->project->manageMembers($projectID);
die(js::locate($this->createLink('program', 'browse'), 'parent'));
}
}
/* Load model. */
/* Load model. */
$this->loadModel('user');
$this->loadModel('dept');
@@ -489,7 +489,7 @@ class program extends control
/**
* Delete a program.
*
*
* @param int $projectID
* @param varchar $confirm
* @access public
@@ -511,7 +511,7 @@ class program extends control
/**
* Suspend a program.
*
*
* @param int $projectID
* @access public
* @return void
@@ -545,7 +545,7 @@ class program extends control
/**
* Activate a program.
*
*
* @param int $projectID
* @access public
* @return void
@@ -586,7 +586,7 @@ class program extends control
/**
* Close a program.
*
*
* @param int $projectID
* @access public
* @return void
@@ -671,7 +671,7 @@ class program extends control
/**
* Process program errors.
*
*
* @param array $errors
* @access public
* @return void
@@ -688,14 +688,14 @@ class program extends control
/**
* Ajax get program drop menu.
*
*
* @param int $programID
* @param varchar $module
* @access public
* @return void
*/
public function ajaxGetDropMenu($programID, $module, $method, $extra)
{
{
$this->loadModel('project');
$this->view->link = $this->createLink('program', 'index', "programID=$programID", '', '', $programID);
$this->view->programID = $programID;
@@ -704,7 +704,7 @@ class program extends control
$this->view->extra = $extra;
$programs = $this->dao->select('*')->from(TABLE_PROJECT)->where('id')->in(array_keys($this->programs))->orderBy('order desc')->fetchAll();
$programPairs = array();
$programPairs = array();
foreach($programs as $program) $programPairs[$program->id] = $program->name;
$this->view->programs = $programs;
$this->display();
@@ -712,25 +712,25 @@ class program extends control
/**
* Ajax get program enter link.
*
*
* @param int $programID
* @access public
* @return void
*/
public function ajaxGetEnterLink($programID = 0)
{
$program = $this->project->getByID($programID);
{
$program = $this->project->getByID($programID);
$programProjects = $this->project->getPairs();
$programProject = key($programProjects);
if($program->template == 'cmmi')
{
{
$link = $this->createLink('programplan', 'browse', 'programID=' . $programID);
}
}
if($program->template == 'scrum')
{
$link = $programProject ? $this->createLink('project', 'task', 'projectID=' . $programProject) : $this->createLink('project', 'create', '', '', '', $programID);
}
{
$link = $programProject ? $this->createLink('project', 'task', 'projectID=' . $programProject) : $this->createLink('project', 'create', '', '', '', $programID);
}
die($link);
}
+47 -11
View File
@@ -1,5 +1,28 @@
<?php
/* Actions. */
$lang->program->index = 'Project';
$lang->program->create = 'Create';
$lang->program->createGuide = 'Select The Project Template';
$lang->program->edit = 'Edit';
$lang->program->browse = 'Project List';
$lang->program->all = 'All';
$lang->program->start = 'Start';
$lang->program->finish = 'Finish';
$lang->program->suspend = 'Suspend';
$lang->program->delete = 'Delete';
$lang->program->close = 'Close';
$lang->program->activate = 'Activate';
$lang->program->group = 'Group';
$lang->program->createGroup = 'Create Group';
$lang->program->editGroup = 'Edit Group';
$lang->program->copyGroup = 'Copy Group';
$lang->program->manageView = 'Manage View';
$lang->program->managePriv = 'Manage Priv';
$lang->program->manageMembers = 'Project Team';
$lang->program->export = 'Export';
$lang->program->manageGroupMember = 'Manage Grop';
/* Fields. */
$lang->program->common = 'Project';
$lang->program->stage = 'Stage';
$lang->program->name = 'Name';
@@ -13,6 +36,8 @@ $lang->program->end = 'End';
$lang->program->status = 'Status';
$lang->program->PM = 'Project Manager';
$lang->program->create = 'Create';
$lang->program->createGuide = 'Select the project template';
$lang->program->browse = 'Program List';
$lang->program->edit = 'Edit';
$lang->program->all = 'All';
$lang->program->start = 'Start';
@@ -29,16 +54,7 @@ $lang->program->realStarted = 'Real started';
$lang->program->bygrid = 'Grid';
$lang->program->bylist = 'List';
$lang->program->mine = 'Participated';
$lang->program->group = 'Group';
$lang->program->createGroup = 'Create Group';
$lang->program->editGroup = 'Edit Group';
$lang->program->copyGroup = 'Copy Group';
$lang->program->manageView = 'Manage View';
$lang->program->managePriv = 'Manage Priv';
$lang->program->manageMembers = 'Manage Members';
$lang->program->transfer = 'Transfer';
$lang->program->setPlanduration = 'Set Planduration';
$lang->program->export = 'Export';
$lang->program->privway = 'Priv Way';
$lang->program->durationEstimation = 'Duration Estimation';
$lang->program->progress = 'Program Progress';
@@ -53,6 +69,8 @@ $lang->program->doneStories = 'Done stories';
$lang->program->leftStories = 'Left stories';
$lang->program->allInput = 'All Input';
$lang->program->weekly = 'Program Weekly';
$lang->program->pv = 'PV';
$lang->program->ev = 'EV';
$lang->program->sv = 'SV%';
@@ -61,8 +79,10 @@ $lang->program->cv = 'CV%';
$lang->program->pm = 'PM';
$lang->program->manageGroupMember = 'Manage Group Members';
$lang->program->durationEstimation = 'Workload estimate';
$lang->program->noProgram = 'No projects';
$lang->program->durationEstimation = 'Workload estimate';
$lang->program->noProgram = 'No projects';
$lang->program->accessDenied = 'You do not have access to this project!';
$lang->program->teamCount = 'The Number Of Team';
$lang->program->unitList[''] = '';
$lang->program->unitList['yuan'] = 'Yuan';
@@ -87,6 +107,13 @@ $lang->program->aclList['custom'] = 'Custom (Team members and the whitelist use
$lang->program->privwayList['extend'] = 'Extend(Mix program priv and common priv.)';
$lang->program->privwayList['reset'] = 'Reset(Only program prive.)';
$lang->program->statusList['wait'] = 'Wait';
$lang->program->statusList['doing'] = 'Doing';
$lang->program->statusList['suspended'] = 'Suspended';
$lang->program->statusList['closed'] = 'Closed';
$lang->program->noProgram = 'No Program';
$lang->program->accessDenied = 'Has No Access To The Program';
$lang->program->chooseProgramType = 'Choose management type';
$lang->program->nextStep = 'Next step';
$lang->program->hoursUnit = '%s hours';
@@ -99,4 +126,13 @@ $lang->program->scrumDesc = '<strong>Introduction: </strong>Iterate in s
$lang->program->cmmi = 'CMMI';
$lang->program->cmmiTitle = 'CMMI management';
$lang->program->cmmiDesc = '<strong>Introduction: </strong>Standardized management by stages<br><strong>Contains function points: </strong>Estimate, plan, stage, report, etc.';
$lang->program->cannotCreateChild = 'The project already has actual content and can not add subprojects directly. You can create a parent project for the current project and then add a child project under the new parent project.';
$lang->program->hasChildren = 'This project has a subproject and can not be deleted.';
$lang->program->confirmDelete = 'Do you want to delete this project?';
$lang->program->emptyPM = 'No program manager';
$lang->program->hasChildren = 'This project has a subproject and can not be deleted.';
$lang->program->confirmDelete = "Are you sure you want to delete the item [% s ] ?";
$lang->program->cannotChangeToCat = "The project already has the actual content and can not be modified as a parent project";
$lang->program->cannotCancelCat = "There are already children under this project. You can not unmark the parent project";
$lang->program->cannotChangeToCat = "The project already has the actual content and can not be modified as a parent project";
$lang->program->cannotCancelCat = "There are already children under this project. You can not unmark the parent project";
+2
View File
@@ -14,9 +14,11 @@ $lang->programplan->emptyParent = '无';
$lang->programplan->name = '名称';
$lang->programplan->percent = '计划工作量';
$lang->programplan->percentAB = '计划工作量';
$lang->programplan->planPercent = '工作量';
$lang->programplan->attribute = '阶段';
$lang->programplan->milestone = '里程碑';
$lang->programplan->taskProgress = '任务进度';
$lang->programplan->task = '任务';
$lang->programplan->begin = '计划开始';
$lang->programplan->end = '计划完成';
$lang->programplan->realStarted = '实际开始';
+4 -2
View File
@@ -133,6 +133,7 @@ class programplanModel extends model
$data = new stdclass();
$data->id = $plan->id;
$data->type = 'plan';
$data->text = empty($plan->milestone) ? $plan->name : $isMilestone . $plan->name;
$data->percent = $plan->percent;
$data->attribute = zget($this->lang->stage->typeList, $plan->attribute);
@@ -141,7 +142,7 @@ class programplanModel extends model
$data->deadline = $end;
$data->realStarted = $plan->realStarted == '0000-00-00' ? '' : $plan->realStarted;
$data->realFinished = $plan->realFinished == '0000-00-00' ? '' : $plan->realFinished;
$data->duration = helper::diffDate($plan->end, $plan->begin) + 1;;
$data->duration = helper::diffDate($plan->end, $plan->begin) + 1;;
$data->parent = $plan->parent;
$data->open = true;
@@ -192,6 +193,7 @@ class programplanModel extends model
$data = new stdclass();
$data->id = $task->project . '-' . $task->id;
$data->type = 'task';
$data->text = $taskSign . $priIcon . $task->name;
$data->percent = '';
$data->attribute = '';
@@ -287,7 +289,7 @@ class programplanModel extends model
return $plan;
}
public function getDuration($begin, $end)
{
$duration = $this->loadModel('holiday')->getActualWorkingDays($begin, $end);
+28
View File
@@ -0,0 +1,28 @@
<?php
/* Actions. */
$lang->stage->browse = 'Stage List';
$lang->stage->create = 'Create Stage';
$lang->stage->batchCreate = 'Batch Create';
$lang->stage->edit = 'Edit Stage';
$lang->stage->delete = 'Delete Stage';
$lang->stage->view = 'Stage Details';
/* Fields. */
$lang->stage->common = 'Stage';
$lang->stage->id = 'ID';
$lang->stage->name = 'Name';
$lang->stage->type = 'Type';
$lang->stage->percent = 'Workload ratio';
$lang->stage->setType = 'Set type';
$lang->stage->typeList['request'] = 'Story';
$lang->stage->typeList['design'] = 'Design';
$lang->stage->typeList['dev'] = 'Development';
$lang->stage->typeList['qa'] = 'Test';
$lang->stage->typeList['release'] = 'Release';
$lang->stage->typeList['review'] = 'Summary Review';
$lang->stage->typeList['other'] = 'Other';
$lang->stage->viewList = 'Stage List';
$lang->stage->noStage = 'There`s no phase yet';
$lang->stage->confirmDelete = 'Are you sure you want to do this?';
+29
View File
@@ -0,0 +1,29 @@
<?php
$lang->weekly->common = 'Project Weekly';
$lang->weekly->index = 'Weekly newspaper overview';
$lang->weekly->progress = 'Percent Completed';
$lang->weekly->workload = 'Workload';
$lang->weekly->total = 'Total';
$lang->weekly->reportTtitle = 'ITEM: Weekly Report% s (week% s)';
$lang->weekly->summary = 'Project status';
$lang->weekly->finished = 'Completion of work this week (100% of work completed)';
$lang->weekly->postponed = 'The work is not finished this week';
$lang->weekly->nextWeek = 'Schedule of work for next week';
$lang->weekly->workloadByType = 'Workload statistics';
$lang->weekly->term = 'Reporting Cycle';
$lang->weekly->program = 'Project Name';
$lang->weekly->master = 'Project Manager ';
$lang->weekly->staff = 'The numbers in this week';
$lang->weekly->weekDesc = 'Week% s (% s ~% s)';
$lang->weekly->progress = 'Current status of the project';
$lang->weekly->analysisResult = 'Analysis results';
$lang->weekly->cost = 'Project cost';
$lang->weekly->pv = 'The work to be done(PV)';
$lang->weekly->ev = 'Actual work done(EV)';
$lang->weekly->ac = 'Actual cost(AC)';
$lang->weekly->sv = 'Rate of progress deviation(SV%)';
$lang->weekly->cv = 'Cost deviation rate(CV%)';
+7 -7
View File
File diff suppressed because one or more lines are too long