diff --git a/db/update20.0.sql b/db/update20.0.sql index f65b35f90e..32e8cbc50b 100644 --- a/db/update20.0.sql +++ b/db/update20.0.sql @@ -1,7 +1,8 @@ ALTER TABLE `zt_project` DROP `isCat`, DROP `catID`, -ADD `model` char(30) NOT NULL AFTER `id`, +ADD `project` mediumint(8) NOT NULL DEFAULT 0 AFTER `id`; +ADD `model` char(30) NOT NULL AFTER `project`, CHANGE `type` `type` char(30) NOT NULL DEFAULT 'sprint' AFTER `model`, ADD `product` varchar(20) NOT NULL DEFAULT 'single' AFTER `type`, ADD `lifetime` char(30) NOT NULL AFTER `product`, diff --git a/module/common/lang/en.php b/module/common/lang/en.php index fde5f2430f..189deaf6af 100644 --- a/module/common/lang/en.php +++ b/module/common/lang/en.php @@ -170,19 +170,19 @@ $lang->productplan->menu = $lang->product->menu; /* System menu. */ $lang->system = new stdclass(); $lang->system->menu = new stdclass(); -$lang->system->menu->estimate = array('link' => 'Estimate|custom|estimate|'); -$lang->system->menu->stage = array('link' => 'Stage|stage|browse|', 'subModule' => 'stage'); -$lang->system->menu->subject = array('link' => 'Subject|subject|browse|'); -$lang->system->menu->holiday = array('link' => 'Holiday|holiday|browse|'); -$lang->system->menu->custom = array('link' => 'Custom|custom|configurewaterfall|'); -$lang->system->dividerMenu = ',auditcl,subject,'; +$lang->system->menu->estimate = array('link' => 'Estimate|custom|estimate|'); +$lang->system->menu->stage = array('link' => 'Stage|stage|browse|', 'subModule' => 'stage'); +$lang->system->menu->subject = array('link' => 'Subject|subject|browse|'); +$lang->system->menu->holiday = array('link' => 'Holiday|holiday|browse|'); +$lang->system->menu->custom = array('link' => 'Custom|custom|configurewaterfall|'); +$lang->system->dividerMenu = ',auditcl,subject,'; if(isset($_COOKIE['systemModel']) and $_COOKIE['systemModel'] == 'scrum') { $lang->system->menu = new stdclass(); - $lang->system->menu->subject = array('link' => 'Subject|subject|browse|'); - $lang->system->menu->holiday = array('link' => 'Holiday|holiday|browse|'); - $lang->system->menu->custom = array('link' => 'Custom|custom|configurescrum|'); + $lang->system->menu->subject = array('link' => 'Subject|subject|browse|'); + $lang->system->menu->holiday = array('link' => 'Holiday|holiday|browse|'); + $lang->system->menu->custom = array('link' => 'Custom|custom|configurescrum|'); $lang->mainNav->system = ' System|subject|browse|'; unset($lang->system->dividerMenu); diff --git a/module/personnel/control.php b/module/personnel/control.php index 217ac5006a..6b75be1b9d 100644 --- a/module/personnel/control.php +++ b/module/personnel/control.php @@ -84,6 +84,7 @@ class personnel extends control $this->program->setPGMViewMenu($programID); $inputPersonnel = $this->personnel->getInputPersonnel($programID, $browseType, $orderBy); +echo array_keys($inputPersonnel); $this->view->title = $this->lang->personnel->putInto; $this->view->position[] = $this->lang->personnel->putInto; diff --git a/module/personnel/lang/en.php b/module/personnel/lang/en.php new file mode 100644 index 0000000000..0dcbc7a704 --- /dev/null +++ b/module/personnel/lang/en.php @@ -0,0 +1,20 @@ +personnel->accessible = '可访问人员列表'; +$lang->personnel->putInto = '投入人员列表'; +$lang->personnel->department = '部门'; +$lang->personnel->realName = '真实姓名'; +$lang->personnel->userName = '用户名'; +$lang->personnel->job = '岗位'; +$lang->personnel->genders = '性别'; +$lang->personnel->project = '项目'; +$lang->personnel->sprint = '迭代/阶段'; +$lang->personnel->user = '用户'; +$lang->personnel->role = '角色'; +$lang->personnel->search = '搜索'; +$lang->personnel->program = '项目集'; +$lang->personnel->emptyTip = '暂无'; + +$lang->personnel->inputLabel['all'] = '全部'; +$lang->personnel->inputLabel['parent'] = '直属项目'; +$lang->personnel->inputLabel['exist'] = '非空项目'; + diff --git a/module/personnel/lang/zh-cn.php b/module/personnel/lang/zh-cn.php index 23614e6d52..0dcbc7a704 100644 --- a/module/personnel/lang/zh-cn.php +++ b/module/personnel/lang/zh-cn.php @@ -1,18 +1,18 @@ personnel->accessible = '可访问人员列表'; -$lang->personnel->putInto = '投入人员列表'; -$lang->personnel->department = '部门'; -$lang->personnel->realName = '真实姓名'; -$lang->personnel->userName = '用户名'; -$lang->personnel->job = '岗位'; -$lang->personnel->genders = '性别'; -$lang->personnel->project = '项目'; -$lang->personnel->sprint = '迭代/阶段'; -$lang->personnel->user = '用户'; -$lang->personnel->role = '角色'; -$lang->personnel->search = '搜索'; -$lang->personnel->program = '项目集'; -$lang->personnel->emptyTip = '暂无'; +$lang->personnel->accessible = '可访问人员列表'; +$lang->personnel->putInto = '投入人员列表'; +$lang->personnel->department = '部门'; +$lang->personnel->realName = '真实姓名'; +$lang->personnel->userName = '用户名'; +$lang->personnel->job = '岗位'; +$lang->personnel->genders = '性别'; +$lang->personnel->project = '项目'; +$lang->personnel->sprint = '迭代/阶段'; +$lang->personnel->user = '用户'; +$lang->personnel->role = '角色'; +$lang->personnel->search = '搜索'; +$lang->personnel->program = '项目集'; +$lang->personnel->emptyTip = '暂无'; $lang->personnel->inputLabel['all'] = '全部'; $lang->personnel->inputLabel['parent'] = '直属项目'; diff --git a/module/personnel/lang/zh-tw.php b/module/personnel/lang/zh-tw.php new file mode 100644 index 0000000000..0bbcf09d07 --- /dev/null +++ b/module/personnel/lang/zh-tw.php @@ -0,0 +1,20 @@ +personnel->accessible = '可訪問人員列表'; +$lang->personnel->putInto = '投入人員列表'; +$lang->personnel->department = '部門'; +$lang->personnel->realName = '真實姓名'; +$lang->personnel->userName = '用戶名'; +$lang->personnel->job = '崗位'; +$lang->personnel->genders = '性別'; +$lang->personnel->project = '項目'; +$lang->personnel->sprint = '迭代/階段'; +$lang->personnel->user = '用戶'; +$lang->personnel->role = '角色'; +$lang->personnel->search = '搜索'; +$lang->personnel->program = '項目集'; +$lang->personnel->emptyTip = '暫無'; + +$lang->personnel->inputLabel['all'] = '全部'; +$lang->personnel->inputLabel['parent'] = '直屬項目'; +$lang->personnel->inputLabel['exist'] = '非空項目'; + diff --git a/module/personnel/model.php b/module/personnel/model.php index b88c99c6ca..fb06de8f4a 100644 --- a/module/personnel/model.php +++ b/module/personnel/model.php @@ -49,6 +49,7 @@ class personnelModel extends model return $personnelList; } + /** * Access to program set input staff. * @@ -73,30 +74,13 @@ class personnelModel extends model $personnelList['projects'] = $projects; if(empty($projects)) return $personnelList; - /* Get the sprint or stage under the project. */ - $projectKeys = array_keys($projects); - $sprints = $this->dao->select('id,model,type,template,parent,path,name')->from(TABLE_PROJECT) - ->where('type')->in('stage,sprint') - ->andWhere('parent')->in($projectKeys) - ->andWhere('deleted')->eq('0') - ->fetchGroup('parent', 'id'); - - /* Get team members for projects, stage, sprints. */ - $sprintKeys = array(0); - foreach($sprints as $sprint) - { - foreach($sprint as $id => $data) $sprintKeys[] = $id; - } - $teams = $this->dao->select('id,root,type,role,account')->from(TABLE_TEAM) - ->where('root')->in($sprintKeys) - ->andWhere('type')->in('project,stage,sprint') - ->fetchGroup('root', 'id'); - - $programNameList = $this->getProgramPairs(); - $personnelList['sprints'] = $sprints; - $personnelList['teams'] = $teams; + $teams = $this->getTeams($projects); + $personnelList['stages'] = $teams['stages']; + $personnelList['sprints'] = $teams['sprints']; + $personnelList['teams'] = $teams['teams']; /* Get the program name for each level. */ + $programNameList = $this->getProgramPairs(); foreach($personnelList['projects'] as $id => $project) { $path = explode(',', $project->path); @@ -114,6 +98,65 @@ class personnelModel extends model return $personnelList; } + /** + * Get team members for projects, stage, sprints. + * + * @param string $projects + * @access public + * @return object + */ + public function getTeams($projects) + { + $sprintParent = array(); + $stageParent = array(); + foreach($projects as $project) + { + $project->model == 'scrum' ? $sprintParent[] = $project->id : $stageParent[] = $project->id; + } + + $sprints = $this->dao->select('id,model,type,template,parent,path,name')->from(TABLE_PROJECT) + ->where('type')->eq('sprint') + ->andWhere('parent')->in($sprintParent) + ->andWhere('deleted')->eq('0') + ->fetchGroup('parent', 'id'); + + $stages = $this->dao->select('id,model,type,template,parent,path,name')->from(TABLE_PROJECT) + ->where('type')->eq('stage') + ->andWhere('parent')->in($stageParent) + ->andWhere('deleted')->eq('0') + ->fetchGroup('parent', 'id'); + + $rootIDList = array(); + foreach($stages as $stage) + { + foreach($stage as $stageFields) + { + $stageFields->children = $this->dao->select('id,model,type,template,parent,path,name')->from(TABLE_PROJECT) + ->where('type')->eq('stage') + ->andWhere('grade')->eq('2') + ->andWhere('path')->like(",$stageFields->id,%") + ->andWhere('deleted')->eq('0') + ->fetchAll('id'); + $childrenIDList = array_keys($stageFields->children); + $rootIDList = array_merge($childrenIDList, $rootIDList); + $rootIDList[] = $stageFields->id; + } + } + + foreach($sprints as $sprint) + { + foreach($sprint as $id => $data) $rootIDList[] = $id; + } + + $teams = $this->dao->select('t1.id,t1.root,t1.type,t1.role,t1.account,t2.realname')->from(TABLE_TEAM)->alias('t1') + ->leftJoin(TABLE_USER)->alias('t2')->on('t1.root=t2.id') + ->where('t1.root')->in($rootIDList) + ->andWhere('t1.type')->in('stage,sprint') + ->fetchGroup('root', 'id'); + + return array('sprints' => $sprints, 'stages' => $stages, 'teams' => $teams); + } + /** * Get all program set names. * diff --git a/module/personnel/view/putinto.html.php b/module/personnel/view/putinto.html.php index 110c71cf12..8a6efd2d97 100644 --- a/module/personnel/view/putinto.html.php +++ b/module/personnel/view/putinto.html.php @@ -1,6 +1,6 @@
- +
@@ -44,44 +44,73 @@ id]) ? count($inputPersonnel['sprints'][$project->id]) : 0; - $teamMemberRow = 0; + $stageRow = isset($inputPersonnel['stages'][$project->id]) ? count($inputPersonnel['stages'][$project->id]) : 0; + if($browseType == 'exist' && $sprintRow == 0 && $stageRow == 0) continue; // If the stage or sprint is empty, skip it. - if($browseType == 'exist' && $sprintRow == 0) continue; // If the stage or sprint is empty, skip it. + $teamMemberRow = 0; if($sprintRow > 0) { foreach($inputPersonnel['sprints'][$project->id] as $sprint) { - $teamMemberRow += isset($inputPersonnel['teams'][$sprint->id]) ? count($inputPersonnel['teams'][$sprint->id]) : 0; + $teamMemberRow += isset($inputPersonnel['teams'][$sprint->id]) ? count($inputPersonnel['teams'][$sprint->id]) : 0; } } - $projectRow = $sprintRow + $teamMemberRow; + if($stageRow > 0) + { + foreach($inputPersonnel['stages'][$project->id] as $stages) + { + $teamMemberRow += isset($inputPersonnel['teams'][$stages->id]) ? count($inputPersonnel['teams'][$stages->id]) : 0; + } + } + $projectRow = $sprintRow + $stageRow + $teamMemberRow; ?> programName;?> name;?> - + - - id] as $sprint):?> - - name;?> - id])):?> - - + 0):;?> + id] as $sprint):?> + id]) ? $inputPersonnel['teams'][$sprint->id] : 0;?> + + name;?> + + + + + id] as $team):?> + + realname;?> + role;?> + + + + + + + 0):?> + id] as $stages):?> + id]) ? $inputPersonnel['teams'][$stages->id] : 0;?> + + name;?> + + + + + id] as $team):?> + + realname;?> + role;?> + + - - id])) continue;?> - id] as $team):?> - - account;?> - role;?> - - - + + + diff --git a/module/program/lang/de.php b/module/program/lang/de.php new file mode 100644 index 0000000000..36f5bee47c --- /dev/null +++ b/module/program/lang/de.php @@ -0,0 +1,211 @@ +program->createGuide = 'Select Template'; +$lang->program->PRJIndex = 'Dashboard'; +$lang->program->PRJHome = 'Home'; +$lang->program->PRJCreate = 'Create Project'; +$lang->program->PRJEdit = 'Edit'; +$lang->program->PRJBatchEdit = 'Batch Edit'; +$lang->program->PRJBrowse = 'Projects'; +$lang->program->PRJAll = 'All'; +$lang->program->PRJStart = 'Start'; +$lang->program->PRJFinish = 'Finish'; +$lang->program->PRJSuspend = 'Suspend'; +$lang->program->PRJDelete = 'Delete'; +$lang->program->PRJClose = 'Close'; +$lang->program->PRJActivate = 'Activate'; +$lang->program->PRJGroup = 'Privilege Group'; +$lang->program->PRJCreateGroup = 'Create Group'; +$lang->program->PRJEditGroup = 'Edit Group'; +$lang->program->PRJCopyGroup = 'Copy Group'; +$lang->program->PRJManageView = 'Manage View'; +$lang->program->PRJManagePriv = 'Manage Privilege'; +$lang->program->PRJManageMembers = 'Manage Team'; +$lang->program->export = 'Export'; +$lang->program->PRJManageGroupMember = 'Manage Group'; +$lang->program->PRJModuleSetting = 'Program Settings'; +$lang->program->PRJModuleOpen = 'Program Name'; +$lang->program->PRJUpdateOrder = 'Order'; +$lang->program->PRJSort = 'Order'; + +/* Fields. */ +$lang->program->common = 'Project'; +$lang->program->stage = 'Stage'; +$lang->program->PRJName = 'Name'; +$lang->program->PRJModel = 'Template'; +$lang->program->PRJCategory = 'Category'; +$lang->program->PRJDesc = 'Description'; +$lang->program->PRJCode = 'Code'; +$lang->program->PRJCopy = 'Copy'; +$lang->program->begin = 'Begin'; +$lang->program->end = 'End'; +$lang->program->PRJStatus = 'Status'; +$lang->program->PRJPM = 'Manager'; +$lang->program->PRJBudget = 'Budget'; +$lang->program->PRJTemplate = 'Template'; +$lang->program->PRJEstimate = 'Estimates'; +$lang->program->PRJConsume = 'Cost'; +$lang->program->PRJSurplus = 'Left'; +$lang->program->PRJProgress = 'Progress'; +$lang->program->dateRange = 'Duration'; +$lang->program->to = ' to '; +$lang->program->realEnd = 'Actual End'; +$lang->program->realBegan = 'Actual Began'; +$lang->program->bygrid = 'Kanban'; +$lang->program->bylist = 'List'; +$lang->program->mine = 'My'; +$lang->program->setPlanduration = 'Set Duration'; +$lang->program->auth = 'Access Control'; +$lang->program->durationEstimation = 'Estimated Workload'; +$lang->program->teamCount = 'Man'; +$lang->program->leftStories = 'Left Stories'; +$lang->program->leftTasks = 'Left Tasks'; +$lang->program->leftBugs = 'Left Bugs'; +$lang->program->PRJChildren = 'Child Project'; +$lang->program->PRJParent = 'Parent Project'; +$lang->program->allStories = 'All Stories'; +$lang->program->doneStories = 'Finished Stories'; +$lang->program->allInput = 'Total Input'; +$lang->program->weekly = 'Program Weekly'; +$lang->program->pv = 'PV'; +$lang->program->ev = 'EV'; +$lang->program->sv = 'SV%'; +$lang->program->ac = 'AC'; +$lang->program->cv = 'CV%'; +$lang->program->PRJTeamCount = 'Team'; +$lang->program->PRJLongTime = 'Long-Term Project'; + +$lang->program->unitList[''] = ''; +$lang->program->unitList['yuan'] = 'Yuan'; +$lang->program->unitList['dollar'] = 'Dollars'; + +$lang->program->modelList['scrum'] = "Scrum"; +$lang->program->modelList['waterfall'] = "CMMI"; + +$lang->program->PRJCategoryList['single'] = "Single product"; +$lang->program->PRJCategoryList['multiple'] = "Multiple products"; + +$lang->program->PRJLifeTimeList['short'] = "Short-Term"; +$lang->program->PRJLifeTimeList['long'] = "Long-Term"; +$lang->program->PRJLifeTimeList['ops'] = "DevOps"; + +$lang->program->featureBar['all'] = 'All'; +$lang->program->featureBar['doing'] = 'Going'; +$lang->program->featureBar['wait'] = 'Waiting'; +$lang->program->featureBar['suspended'] = 'Suspended'; +$lang->program->featureBar['closed'] = 'Closed'; + +$lang->program->PRJAclList['open'] = "Default (Users who can visit {$lang->projectCommon} can access it)"; +$lang->program->PRJAclList['private'] = 'Private (For team members only)'; +$lang->program->PRJAclList['custom'] = 'Custom (Team members and the whitelist users can access it)'; + +$lang->program->PRJPrivwayList['extend'] = 'Inherit (program privilege and company privilege)'; +$lang->program->PRJPrivwayList['reset'] = 'Reset (program privilege only)'; + +$lang->program->statusList['wait'] = 'Waiting'; +$lang->program->statusList['doing'] = 'Doing'; +$lang->program->statusList['suspended'] = 'Suspended'; +$lang->program->statusList['closed'] = 'Closed'; + +$lang->program->noPRJ = 'No project.'; +$lang->program->accessDenied = 'Access denied!'; +$lang->program->chooseProgramType = 'Select a method'; +$lang->program->nextStep = 'Next step'; +$lang->program->hoursUnit = '%s hours'; +$lang->program->membersUnit = '%s men'; +$lang->program->lastIteration = 'Recent iterations'; +$lang->program->ongoingStage = 'Ongoing stage'; +$lang->program->scrum = 'Scrum'; +$lang->program->waterfall = 'CMMI'; +$lang->program->waterfallTitle = 'CMMI'; +$lang->program->cannotCreateChild = 'It is not empty, so you cannot add a child. You can add a parent for it, and then create a child.'; +$lang->program->hasChildren = 'It has child projects. You cannot delete it.'; +$lang->program->confirmDelete = "Do you want to delete [%s]?"; +$lang->program->emptyPM = 'No manager'; +$lang->program->cannotChangeToCat = "It is not empty, so you cannot change it to a parent."; +$lang->program->cannotCancelCat = "It has child projects, so you cannot unmark the parent."; +$lang->program->parentBeginEnd = "Parent begin&end date: %s ~ %s"; +$lang->program->parentBudget = "Parent budget: %s"; +$lang->program->beginLetterParent = "Parent begin date: %s, begin date should be >= parent begin date."; +$lang->program->endGreaterParent = "Parent end date: %s, end date should be <= parent end date."; +$lang->program->beginGreateChild = "Child earliest begin: %s, parent begin date <= child earliest begin date."; +$lang->program->endLetterChild = "Child latest end: %s, parent end date >= child latest end date."; +$lang->program->childLongTime = "If a child as long-term projects, the parent should be long-term too."; +$lang->program->readjustTime = 'Change the project begin&end date.'; + +$lang->program->PRJProgramTitle['0'] = 'Hide'; +$lang->program->PRJProgramTitle['base'] = 'Base-level program only'; +$lang->program->PRJProgramTitle['end'] = 'End-level program only'; + +$lang->program->PRJNoProgram = 'No program'; +$lang->program->PRJAccessDenied = 'Access denied to this program'; +$lang->program->PRJChooseProgramType = 'Select management type'; +$lang->program->scrumTitle = 'Agile Development Management'; +$lang->program->PRJCannotCreateChild = 'The project has contents, so you cannot add a child project. You can create a parent project for this one and then add a child project for the parent project.'; +$lang->program->PRJHasChildren = 'This project has a child project, so it cannot be deleted.'; +$lang->program->PRJConfirmDelete = 'Do you want to delete this project?'; +$lang->program->PRJCannotChangeToCat = "The project has contents, so you cannot it to a parent project."; +$lang->program->PRJCannotCancelCat = "There are child projects of this project. You cannot cancel the parent project mark."; +$lang->program->PRJParentBeginEnd = "The begin and end date of the parent project: %s ~ %s"; +$lang->program->PRJParentBudget = "The budget of the parent project: %s"; +$lang->program->PRJBeginLetterParent = "The begin date of the parent project: %s. It cannot be < the begin date of its parent project."; +$lang->program->PRJEndGreaterParent = "The end date of the parent project: %s. It cannot be > the end date of its parent project."; +$lang->program->PRJBeginGreateChild = "The earliest begin date of a child project: %s. The begin date of its parent project cannot be > the earliest begin date of a child project."; +$lang->program->PRJEndLetterChild = "The latest end date of a child project: %s. The end date of its parent project cannot be < the latest end date of child project."; +$lang->program->PRJChildLongTime = "There are long-term projects in the child project, and the parent project should also be a long-term project."; + +/* Actions. */ +$lang->program->PGMCommon = 'Program'; +$lang->program->PGMIndex = 'Home'; +$lang->program->PGMCreate = 'Create Program'; +$lang->program->PGMCreateGuide = 'Select Template'; +$lang->program->PGMEdit = 'Edit Program'; +$lang->program->PGMBrowse = 'Programs'; +$lang->program->PGMProduct = 'Products'; +$lang->program->PGMProject = 'Projects'; +$lang->program->PGMAll = 'All Programs'; +$lang->program->PGMStart = 'Start'; +$lang->program->PGMFinish = 'Finish'; +$lang->program->PGMSuspend = 'Suspend'; +$lang->program->PGMDelete = 'Delete'; +$lang->program->PGMClose = 'Close'; +$lang->program->PGMView = 'Overview'; +$lang->program->PGMActivate = 'Activate'; +$lang->program->PGMGroup = 'Privilege Group'; +$lang->program->PGMCreateGroup = 'Create Group'; +$lang->program->PGMEditGroup = 'Edit Group'; +$lang->program->PGMCopyGroup = 'Copy Group'; +$lang->program->PGMManageView = 'Manage View'; +$lang->program->PGMManagePriv = 'Manage Privilege'; +$lang->program->PGMManageMembers = 'Program Team'; +$lang->program->PGMExport = 'Export'; +$lang->program->PGMManageGroupMember = 'Manage Group'; + +/* Fields. */ +$lang->program->PGMName = 'Name'; +$lang->program->PGMTemplate = 'Template'; +$lang->program->PGMCategory = 'Type'; +$lang->program->PGMDesc = 'Description'; +$lang->program->PGMCode = 'Code'; +$lang->program->PGMCopy = 'Copy Program'; +$lang->program->PGMStatus = 'Status'; +$lang->program->PGMPM = 'Manager'; +$lang->program->PGMBudget = 'Budget'; +$lang->program->PGMProgress = 'Progress'; +$lang->program->PGMChildren = 'Child'; +$lang->program->PGMParent = 'Parent'; +$lang->program->PGMAllInput = 'Input'; +$lang->program->PGMTeamCount = 'Team'; +$lang->program->PGMLongTime = 'Long-Term'; + +$lang->program->noPGM = 'No program.'; +$lang->program->PGMShowClosed = 'Closed programs.';i + +$lang->program->PGMAclList['open'] = "Default(user who can visit the program can access it)"; +$lang->program->PGMAclList['private'] = "Private(for the program team only)"; +$lang->program->PGMAclList['custom'] = "Custom(the program team and the whitelist users can access it)"; + +$lang->program->PGMAuthList['extend'] = 'Inherit(program privileges and company privileges)'; +$lang->program->PGMAuthList['reset'] = 'Reset(program privileges only)'; + +$lang->program->PGMFeatureBar['all'] = 'All'; diff --git a/module/program/lang/fr.php b/module/program/lang/fr.php new file mode 100644 index 0000000000..36f5bee47c --- /dev/null +++ b/module/program/lang/fr.php @@ -0,0 +1,211 @@ +program->createGuide = 'Select Template'; +$lang->program->PRJIndex = 'Dashboard'; +$lang->program->PRJHome = 'Home'; +$lang->program->PRJCreate = 'Create Project'; +$lang->program->PRJEdit = 'Edit'; +$lang->program->PRJBatchEdit = 'Batch Edit'; +$lang->program->PRJBrowse = 'Projects'; +$lang->program->PRJAll = 'All'; +$lang->program->PRJStart = 'Start'; +$lang->program->PRJFinish = 'Finish'; +$lang->program->PRJSuspend = 'Suspend'; +$lang->program->PRJDelete = 'Delete'; +$lang->program->PRJClose = 'Close'; +$lang->program->PRJActivate = 'Activate'; +$lang->program->PRJGroup = 'Privilege Group'; +$lang->program->PRJCreateGroup = 'Create Group'; +$lang->program->PRJEditGroup = 'Edit Group'; +$lang->program->PRJCopyGroup = 'Copy Group'; +$lang->program->PRJManageView = 'Manage View'; +$lang->program->PRJManagePriv = 'Manage Privilege'; +$lang->program->PRJManageMembers = 'Manage Team'; +$lang->program->export = 'Export'; +$lang->program->PRJManageGroupMember = 'Manage Group'; +$lang->program->PRJModuleSetting = 'Program Settings'; +$lang->program->PRJModuleOpen = 'Program Name'; +$lang->program->PRJUpdateOrder = 'Order'; +$lang->program->PRJSort = 'Order'; + +/* Fields. */ +$lang->program->common = 'Project'; +$lang->program->stage = 'Stage'; +$lang->program->PRJName = 'Name'; +$lang->program->PRJModel = 'Template'; +$lang->program->PRJCategory = 'Category'; +$lang->program->PRJDesc = 'Description'; +$lang->program->PRJCode = 'Code'; +$lang->program->PRJCopy = 'Copy'; +$lang->program->begin = 'Begin'; +$lang->program->end = 'End'; +$lang->program->PRJStatus = 'Status'; +$lang->program->PRJPM = 'Manager'; +$lang->program->PRJBudget = 'Budget'; +$lang->program->PRJTemplate = 'Template'; +$lang->program->PRJEstimate = 'Estimates'; +$lang->program->PRJConsume = 'Cost'; +$lang->program->PRJSurplus = 'Left'; +$lang->program->PRJProgress = 'Progress'; +$lang->program->dateRange = 'Duration'; +$lang->program->to = ' to '; +$lang->program->realEnd = 'Actual End'; +$lang->program->realBegan = 'Actual Began'; +$lang->program->bygrid = 'Kanban'; +$lang->program->bylist = 'List'; +$lang->program->mine = 'My'; +$lang->program->setPlanduration = 'Set Duration'; +$lang->program->auth = 'Access Control'; +$lang->program->durationEstimation = 'Estimated Workload'; +$lang->program->teamCount = 'Man'; +$lang->program->leftStories = 'Left Stories'; +$lang->program->leftTasks = 'Left Tasks'; +$lang->program->leftBugs = 'Left Bugs'; +$lang->program->PRJChildren = 'Child Project'; +$lang->program->PRJParent = 'Parent Project'; +$lang->program->allStories = 'All Stories'; +$lang->program->doneStories = 'Finished Stories'; +$lang->program->allInput = 'Total Input'; +$lang->program->weekly = 'Program Weekly'; +$lang->program->pv = 'PV'; +$lang->program->ev = 'EV'; +$lang->program->sv = 'SV%'; +$lang->program->ac = 'AC'; +$lang->program->cv = 'CV%'; +$lang->program->PRJTeamCount = 'Team'; +$lang->program->PRJLongTime = 'Long-Term Project'; + +$lang->program->unitList[''] = ''; +$lang->program->unitList['yuan'] = 'Yuan'; +$lang->program->unitList['dollar'] = 'Dollars'; + +$lang->program->modelList['scrum'] = "Scrum"; +$lang->program->modelList['waterfall'] = "CMMI"; + +$lang->program->PRJCategoryList['single'] = "Single product"; +$lang->program->PRJCategoryList['multiple'] = "Multiple products"; + +$lang->program->PRJLifeTimeList['short'] = "Short-Term"; +$lang->program->PRJLifeTimeList['long'] = "Long-Term"; +$lang->program->PRJLifeTimeList['ops'] = "DevOps"; + +$lang->program->featureBar['all'] = 'All'; +$lang->program->featureBar['doing'] = 'Going'; +$lang->program->featureBar['wait'] = 'Waiting'; +$lang->program->featureBar['suspended'] = 'Suspended'; +$lang->program->featureBar['closed'] = 'Closed'; + +$lang->program->PRJAclList['open'] = "Default (Users who can visit {$lang->projectCommon} can access it)"; +$lang->program->PRJAclList['private'] = 'Private (For team members only)'; +$lang->program->PRJAclList['custom'] = 'Custom (Team members and the whitelist users can access it)'; + +$lang->program->PRJPrivwayList['extend'] = 'Inherit (program privilege and company privilege)'; +$lang->program->PRJPrivwayList['reset'] = 'Reset (program privilege only)'; + +$lang->program->statusList['wait'] = 'Waiting'; +$lang->program->statusList['doing'] = 'Doing'; +$lang->program->statusList['suspended'] = 'Suspended'; +$lang->program->statusList['closed'] = 'Closed'; + +$lang->program->noPRJ = 'No project.'; +$lang->program->accessDenied = 'Access denied!'; +$lang->program->chooseProgramType = 'Select a method'; +$lang->program->nextStep = 'Next step'; +$lang->program->hoursUnit = '%s hours'; +$lang->program->membersUnit = '%s men'; +$lang->program->lastIteration = 'Recent iterations'; +$lang->program->ongoingStage = 'Ongoing stage'; +$lang->program->scrum = 'Scrum'; +$lang->program->waterfall = 'CMMI'; +$lang->program->waterfallTitle = 'CMMI'; +$lang->program->cannotCreateChild = 'It is not empty, so you cannot add a child. You can add a parent for it, and then create a child.'; +$lang->program->hasChildren = 'It has child projects. You cannot delete it.'; +$lang->program->confirmDelete = "Do you want to delete [%s]?"; +$lang->program->emptyPM = 'No manager'; +$lang->program->cannotChangeToCat = "It is not empty, so you cannot change it to a parent."; +$lang->program->cannotCancelCat = "It has child projects, so you cannot unmark the parent."; +$lang->program->parentBeginEnd = "Parent begin&end date: %s ~ %s"; +$lang->program->parentBudget = "Parent budget: %s"; +$lang->program->beginLetterParent = "Parent begin date: %s, begin date should be >= parent begin date."; +$lang->program->endGreaterParent = "Parent end date: %s, end date should be <= parent end date."; +$lang->program->beginGreateChild = "Child earliest begin: %s, parent begin date <= child earliest begin date."; +$lang->program->endLetterChild = "Child latest end: %s, parent end date >= child latest end date."; +$lang->program->childLongTime = "If a child as long-term projects, the parent should be long-term too."; +$lang->program->readjustTime = 'Change the project begin&end date.'; + +$lang->program->PRJProgramTitle['0'] = 'Hide'; +$lang->program->PRJProgramTitle['base'] = 'Base-level program only'; +$lang->program->PRJProgramTitle['end'] = 'End-level program only'; + +$lang->program->PRJNoProgram = 'No program'; +$lang->program->PRJAccessDenied = 'Access denied to this program'; +$lang->program->PRJChooseProgramType = 'Select management type'; +$lang->program->scrumTitle = 'Agile Development Management'; +$lang->program->PRJCannotCreateChild = 'The project has contents, so you cannot add a child project. You can create a parent project for this one and then add a child project for the parent project.'; +$lang->program->PRJHasChildren = 'This project has a child project, so it cannot be deleted.'; +$lang->program->PRJConfirmDelete = 'Do you want to delete this project?'; +$lang->program->PRJCannotChangeToCat = "The project has contents, so you cannot it to a parent project."; +$lang->program->PRJCannotCancelCat = "There are child projects of this project. You cannot cancel the parent project mark."; +$lang->program->PRJParentBeginEnd = "The begin and end date of the parent project: %s ~ %s"; +$lang->program->PRJParentBudget = "The budget of the parent project: %s"; +$lang->program->PRJBeginLetterParent = "The begin date of the parent project: %s. It cannot be < the begin date of its parent project."; +$lang->program->PRJEndGreaterParent = "The end date of the parent project: %s. It cannot be > the end date of its parent project."; +$lang->program->PRJBeginGreateChild = "The earliest begin date of a child project: %s. The begin date of its parent project cannot be > the earliest begin date of a child project."; +$lang->program->PRJEndLetterChild = "The latest end date of a child project: %s. The end date of its parent project cannot be < the latest end date of child project."; +$lang->program->PRJChildLongTime = "There are long-term projects in the child project, and the parent project should also be a long-term project."; + +/* Actions. */ +$lang->program->PGMCommon = 'Program'; +$lang->program->PGMIndex = 'Home'; +$lang->program->PGMCreate = 'Create Program'; +$lang->program->PGMCreateGuide = 'Select Template'; +$lang->program->PGMEdit = 'Edit Program'; +$lang->program->PGMBrowse = 'Programs'; +$lang->program->PGMProduct = 'Products'; +$lang->program->PGMProject = 'Projects'; +$lang->program->PGMAll = 'All Programs'; +$lang->program->PGMStart = 'Start'; +$lang->program->PGMFinish = 'Finish'; +$lang->program->PGMSuspend = 'Suspend'; +$lang->program->PGMDelete = 'Delete'; +$lang->program->PGMClose = 'Close'; +$lang->program->PGMView = 'Overview'; +$lang->program->PGMActivate = 'Activate'; +$lang->program->PGMGroup = 'Privilege Group'; +$lang->program->PGMCreateGroup = 'Create Group'; +$lang->program->PGMEditGroup = 'Edit Group'; +$lang->program->PGMCopyGroup = 'Copy Group'; +$lang->program->PGMManageView = 'Manage View'; +$lang->program->PGMManagePriv = 'Manage Privilege'; +$lang->program->PGMManageMembers = 'Program Team'; +$lang->program->PGMExport = 'Export'; +$lang->program->PGMManageGroupMember = 'Manage Group'; + +/* Fields. */ +$lang->program->PGMName = 'Name'; +$lang->program->PGMTemplate = 'Template'; +$lang->program->PGMCategory = 'Type'; +$lang->program->PGMDesc = 'Description'; +$lang->program->PGMCode = 'Code'; +$lang->program->PGMCopy = 'Copy Program'; +$lang->program->PGMStatus = 'Status'; +$lang->program->PGMPM = 'Manager'; +$lang->program->PGMBudget = 'Budget'; +$lang->program->PGMProgress = 'Progress'; +$lang->program->PGMChildren = 'Child'; +$lang->program->PGMParent = 'Parent'; +$lang->program->PGMAllInput = 'Input'; +$lang->program->PGMTeamCount = 'Team'; +$lang->program->PGMLongTime = 'Long-Term'; + +$lang->program->noPGM = 'No program.'; +$lang->program->PGMShowClosed = 'Closed programs.';i + +$lang->program->PGMAclList['open'] = "Default(user who can visit the program can access it)"; +$lang->program->PGMAclList['private'] = "Private(for the program team only)"; +$lang->program->PGMAclList['custom'] = "Custom(the program team and the whitelist users can access it)"; + +$lang->program->PGMAuthList['extend'] = 'Inherit(program privileges and company privileges)'; +$lang->program->PGMAuthList['reset'] = 'Reset(program privileges only)'; + +$lang->program->PGMFeatureBar['all'] = 'All'; diff --git a/module/program/lang/vi.php b/module/program/lang/vi.php new file mode 100644 index 0000000000..36f5bee47c --- /dev/null +++ b/module/program/lang/vi.php @@ -0,0 +1,211 @@ +program->createGuide = 'Select Template'; +$lang->program->PRJIndex = 'Dashboard'; +$lang->program->PRJHome = 'Home'; +$lang->program->PRJCreate = 'Create Project'; +$lang->program->PRJEdit = 'Edit'; +$lang->program->PRJBatchEdit = 'Batch Edit'; +$lang->program->PRJBrowse = 'Projects'; +$lang->program->PRJAll = 'All'; +$lang->program->PRJStart = 'Start'; +$lang->program->PRJFinish = 'Finish'; +$lang->program->PRJSuspend = 'Suspend'; +$lang->program->PRJDelete = 'Delete'; +$lang->program->PRJClose = 'Close'; +$lang->program->PRJActivate = 'Activate'; +$lang->program->PRJGroup = 'Privilege Group'; +$lang->program->PRJCreateGroup = 'Create Group'; +$lang->program->PRJEditGroup = 'Edit Group'; +$lang->program->PRJCopyGroup = 'Copy Group'; +$lang->program->PRJManageView = 'Manage View'; +$lang->program->PRJManagePriv = 'Manage Privilege'; +$lang->program->PRJManageMembers = 'Manage Team'; +$lang->program->export = 'Export'; +$lang->program->PRJManageGroupMember = 'Manage Group'; +$lang->program->PRJModuleSetting = 'Program Settings'; +$lang->program->PRJModuleOpen = 'Program Name'; +$lang->program->PRJUpdateOrder = 'Order'; +$lang->program->PRJSort = 'Order'; + +/* Fields. */ +$lang->program->common = 'Project'; +$lang->program->stage = 'Stage'; +$lang->program->PRJName = 'Name'; +$lang->program->PRJModel = 'Template'; +$lang->program->PRJCategory = 'Category'; +$lang->program->PRJDesc = 'Description'; +$lang->program->PRJCode = 'Code'; +$lang->program->PRJCopy = 'Copy'; +$lang->program->begin = 'Begin'; +$lang->program->end = 'End'; +$lang->program->PRJStatus = 'Status'; +$lang->program->PRJPM = 'Manager'; +$lang->program->PRJBudget = 'Budget'; +$lang->program->PRJTemplate = 'Template'; +$lang->program->PRJEstimate = 'Estimates'; +$lang->program->PRJConsume = 'Cost'; +$lang->program->PRJSurplus = 'Left'; +$lang->program->PRJProgress = 'Progress'; +$lang->program->dateRange = 'Duration'; +$lang->program->to = ' to '; +$lang->program->realEnd = 'Actual End'; +$lang->program->realBegan = 'Actual Began'; +$lang->program->bygrid = 'Kanban'; +$lang->program->bylist = 'List'; +$lang->program->mine = 'My'; +$lang->program->setPlanduration = 'Set Duration'; +$lang->program->auth = 'Access Control'; +$lang->program->durationEstimation = 'Estimated Workload'; +$lang->program->teamCount = 'Man'; +$lang->program->leftStories = 'Left Stories'; +$lang->program->leftTasks = 'Left Tasks'; +$lang->program->leftBugs = 'Left Bugs'; +$lang->program->PRJChildren = 'Child Project'; +$lang->program->PRJParent = 'Parent Project'; +$lang->program->allStories = 'All Stories'; +$lang->program->doneStories = 'Finished Stories'; +$lang->program->allInput = 'Total Input'; +$lang->program->weekly = 'Program Weekly'; +$lang->program->pv = 'PV'; +$lang->program->ev = 'EV'; +$lang->program->sv = 'SV%'; +$lang->program->ac = 'AC'; +$lang->program->cv = 'CV%'; +$lang->program->PRJTeamCount = 'Team'; +$lang->program->PRJLongTime = 'Long-Term Project'; + +$lang->program->unitList[''] = ''; +$lang->program->unitList['yuan'] = 'Yuan'; +$lang->program->unitList['dollar'] = 'Dollars'; + +$lang->program->modelList['scrum'] = "Scrum"; +$lang->program->modelList['waterfall'] = "CMMI"; + +$lang->program->PRJCategoryList['single'] = "Single product"; +$lang->program->PRJCategoryList['multiple'] = "Multiple products"; + +$lang->program->PRJLifeTimeList['short'] = "Short-Term"; +$lang->program->PRJLifeTimeList['long'] = "Long-Term"; +$lang->program->PRJLifeTimeList['ops'] = "DevOps"; + +$lang->program->featureBar['all'] = 'All'; +$lang->program->featureBar['doing'] = 'Going'; +$lang->program->featureBar['wait'] = 'Waiting'; +$lang->program->featureBar['suspended'] = 'Suspended'; +$lang->program->featureBar['closed'] = 'Closed'; + +$lang->program->PRJAclList['open'] = "Default (Users who can visit {$lang->projectCommon} can access it)"; +$lang->program->PRJAclList['private'] = 'Private (For team members only)'; +$lang->program->PRJAclList['custom'] = 'Custom (Team members and the whitelist users can access it)'; + +$lang->program->PRJPrivwayList['extend'] = 'Inherit (program privilege and company privilege)'; +$lang->program->PRJPrivwayList['reset'] = 'Reset (program privilege only)'; + +$lang->program->statusList['wait'] = 'Waiting'; +$lang->program->statusList['doing'] = 'Doing'; +$lang->program->statusList['suspended'] = 'Suspended'; +$lang->program->statusList['closed'] = 'Closed'; + +$lang->program->noPRJ = 'No project.'; +$lang->program->accessDenied = 'Access denied!'; +$lang->program->chooseProgramType = 'Select a method'; +$lang->program->nextStep = 'Next step'; +$lang->program->hoursUnit = '%s hours'; +$lang->program->membersUnit = '%s men'; +$lang->program->lastIteration = 'Recent iterations'; +$lang->program->ongoingStage = 'Ongoing stage'; +$lang->program->scrum = 'Scrum'; +$lang->program->waterfall = 'CMMI'; +$lang->program->waterfallTitle = 'CMMI'; +$lang->program->cannotCreateChild = 'It is not empty, so you cannot add a child. You can add a parent for it, and then create a child.'; +$lang->program->hasChildren = 'It has child projects. You cannot delete it.'; +$lang->program->confirmDelete = "Do you want to delete [%s]?"; +$lang->program->emptyPM = 'No manager'; +$lang->program->cannotChangeToCat = "It is not empty, so you cannot change it to a parent."; +$lang->program->cannotCancelCat = "It has child projects, so you cannot unmark the parent."; +$lang->program->parentBeginEnd = "Parent begin&end date: %s ~ %s"; +$lang->program->parentBudget = "Parent budget: %s"; +$lang->program->beginLetterParent = "Parent begin date: %s, begin date should be >= parent begin date."; +$lang->program->endGreaterParent = "Parent end date: %s, end date should be <= parent end date."; +$lang->program->beginGreateChild = "Child earliest begin: %s, parent begin date <= child earliest begin date."; +$lang->program->endLetterChild = "Child latest end: %s, parent end date >= child latest end date."; +$lang->program->childLongTime = "If a child as long-term projects, the parent should be long-term too."; +$lang->program->readjustTime = 'Change the project begin&end date.'; + +$lang->program->PRJProgramTitle['0'] = 'Hide'; +$lang->program->PRJProgramTitle['base'] = 'Base-level program only'; +$lang->program->PRJProgramTitle['end'] = 'End-level program only'; + +$lang->program->PRJNoProgram = 'No program'; +$lang->program->PRJAccessDenied = 'Access denied to this program'; +$lang->program->PRJChooseProgramType = 'Select management type'; +$lang->program->scrumTitle = 'Agile Development Management'; +$lang->program->PRJCannotCreateChild = 'The project has contents, so you cannot add a child project. You can create a parent project for this one and then add a child project for the parent project.'; +$lang->program->PRJHasChildren = 'This project has a child project, so it cannot be deleted.'; +$lang->program->PRJConfirmDelete = 'Do you want to delete this project?'; +$lang->program->PRJCannotChangeToCat = "The project has contents, so you cannot it to a parent project."; +$lang->program->PRJCannotCancelCat = "There are child projects of this project. You cannot cancel the parent project mark."; +$lang->program->PRJParentBeginEnd = "The begin and end date of the parent project: %s ~ %s"; +$lang->program->PRJParentBudget = "The budget of the parent project: %s"; +$lang->program->PRJBeginLetterParent = "The begin date of the parent project: %s. It cannot be < the begin date of its parent project."; +$lang->program->PRJEndGreaterParent = "The end date of the parent project: %s. It cannot be > the end date of its parent project."; +$lang->program->PRJBeginGreateChild = "The earliest begin date of a child project: %s. The begin date of its parent project cannot be > the earliest begin date of a child project."; +$lang->program->PRJEndLetterChild = "The latest end date of a child project: %s. The end date of its parent project cannot be < the latest end date of child project."; +$lang->program->PRJChildLongTime = "There are long-term projects in the child project, and the parent project should also be a long-term project."; + +/* Actions. */ +$lang->program->PGMCommon = 'Program'; +$lang->program->PGMIndex = 'Home'; +$lang->program->PGMCreate = 'Create Program'; +$lang->program->PGMCreateGuide = 'Select Template'; +$lang->program->PGMEdit = 'Edit Program'; +$lang->program->PGMBrowse = 'Programs'; +$lang->program->PGMProduct = 'Products'; +$lang->program->PGMProject = 'Projects'; +$lang->program->PGMAll = 'All Programs'; +$lang->program->PGMStart = 'Start'; +$lang->program->PGMFinish = 'Finish'; +$lang->program->PGMSuspend = 'Suspend'; +$lang->program->PGMDelete = 'Delete'; +$lang->program->PGMClose = 'Close'; +$lang->program->PGMView = 'Overview'; +$lang->program->PGMActivate = 'Activate'; +$lang->program->PGMGroup = 'Privilege Group'; +$lang->program->PGMCreateGroup = 'Create Group'; +$lang->program->PGMEditGroup = 'Edit Group'; +$lang->program->PGMCopyGroup = 'Copy Group'; +$lang->program->PGMManageView = 'Manage View'; +$lang->program->PGMManagePriv = 'Manage Privilege'; +$lang->program->PGMManageMembers = 'Program Team'; +$lang->program->PGMExport = 'Export'; +$lang->program->PGMManageGroupMember = 'Manage Group'; + +/* Fields. */ +$lang->program->PGMName = 'Name'; +$lang->program->PGMTemplate = 'Template'; +$lang->program->PGMCategory = 'Type'; +$lang->program->PGMDesc = 'Description'; +$lang->program->PGMCode = 'Code'; +$lang->program->PGMCopy = 'Copy Program'; +$lang->program->PGMStatus = 'Status'; +$lang->program->PGMPM = 'Manager'; +$lang->program->PGMBudget = 'Budget'; +$lang->program->PGMProgress = 'Progress'; +$lang->program->PGMChildren = 'Child'; +$lang->program->PGMParent = 'Parent'; +$lang->program->PGMAllInput = 'Input'; +$lang->program->PGMTeamCount = 'Team'; +$lang->program->PGMLongTime = 'Long-Term'; + +$lang->program->noPGM = 'No program.'; +$lang->program->PGMShowClosed = 'Closed programs.';i + +$lang->program->PGMAclList['open'] = "Default(user who can visit the program can access it)"; +$lang->program->PGMAclList['private'] = "Private(for the program team only)"; +$lang->program->PGMAclList['custom'] = "Custom(the program team and the whitelist users can access it)"; + +$lang->program->PGMAuthList['extend'] = 'Inherit(program privileges and company privileges)'; +$lang->program->PGMAuthList['reset'] = 'Reset(program privileges only)'; + +$lang->program->PGMFeatureBar['all'] = 'All'; diff --git a/module/program/lang/zh-tw.php b/module/program/lang/zh-tw.php new file mode 100644 index 0000000000..d12892d3d9 --- /dev/null +++ b/module/program/lang/zh-tw.php @@ -0,0 +1,215 @@ +program->createGuide = '選擇項目模板'; +$lang->program->PRJIndex = '項目儀表盤'; +$lang->program->PRJHome = '項目主頁'; +$lang->program->PRJCreate = '創建項目'; +$lang->program->PRJEdit = '編輯項目'; +$lang->program->PRJBatchEdit = '批量編輯'; +$lang->program->PRJBrowse = '項目列表'; +$lang->program->PRJAll = '所有項目'; +$lang->program->PRJStart = '啟動項目'; +$lang->program->PRJFinish = '完成項目'; +$lang->program->PRJSuspend = '掛起項目'; +$lang->program->PRJDelete = '刪除項目'; +$lang->program->PRJClose = '關閉項目'; +$lang->program->PRJActivate = '激活項目'; +$lang->program->PRJGroup = '項目權限分組'; +$lang->program->PRJCreateGroup = '項目創建分組'; +$lang->program->PRJEditGroup = '項目編輯分組'; +$lang->program->PRJCopyGroup = '項目複製分組'; +$lang->program->PRJManageView = '項目維護視圖'; +$lang->program->PRJManagePriv = '項目維護權限'; +$lang->program->PRJManageMembers = '項目團隊'; +$lang->program->export = '導出'; +$lang->program->PRJManageGroupMember = '維護分組用戶'; +$lang->program->PRJModuleSetting = '項目集設置'; +$lang->program->PRJModuleOpen = '顯示項目集名'; +$lang->program->PRJUpdateOrder = '排序'; +$lang->program->PRJSort = '項目排序'; + +/* Fields. */ +$lang->program->common = '項目'; +$lang->program->stage = '階段'; +$lang->program->PRJName = '項目名稱'; +$lang->program->PRJModel = '管理類型'; +$lang->program->PRJCategory = '項目類型'; +$lang->program->PRJDesc = '項目描述'; +$lang->program->PRJCode = '項目代號'; +$lang->program->PRJCopy = '複製項目'; +$lang->program->begin = '計劃開始日期'; +$lang->program->end = '計劃完成日期'; +$lang->program->PRJStatus = '項目狀態'; +$lang->program->PRJPM = '項目負責人'; +$lang->program->PO = '產品負責人'; +$lang->program->PRJBudget = '項目預算'; +$lang->program->PRJTemplate = '項目模板'; +$lang->program->PRJEstimate = '預計'; +$lang->program->PRJConsume = '消耗'; +$lang->program->PRJSurplus = '剩餘'; +$lang->program->PRJProgress = '進度'; +$lang->program->dateRange = '起止時間'; +$lang->program->to = '至'; +$lang->program->realEnd = '實際完成日期'; +$lang->program->realBegan = '實際開始日期'; +$lang->program->bygrid = '看板'; +$lang->program->bylist = '列表'; +$lang->program->mine = '我參與的'; +$lang->program->setPlanduration = '設置工期'; +$lang->program->auth = '權限控制'; +$lang->program->durationEstimation = '工作量估算'; +$lang->program->teamCount = '投入人數'; +$lang->program->leftStories = '剩餘需求'; +$lang->program->leftTasks = '剩餘任務'; +$lang->program->leftBugs = '剩餘Bug'; +$lang->program->PRJChildren = '子項目'; +$lang->program->PRJParent = '父項目'; +$lang->program->allStories = '總需求'; +$lang->program->doneStories = '已完成'; +$lang->program->allInput = '項目總投入'; +$lang->program->weekly = '項目周報'; +$lang->program->pv = 'PV'; +$lang->program->ev = 'EV'; +$lang->program->sv = 'SV%'; +$lang->program->ac = 'AC'; +$lang->program->cv = 'CV%'; +$lang->program->PRJTeamCount = '項目成員'; +$lang->program->PRJLongTime = '長期項目'; + +$lang->program->unitList[''] = ''; +$lang->program->unitList['yuan'] = '元'; +$lang->program->unitList['dollar'] = 'Dollars'; + +$lang->program->modelList['scrum'] = "Scrum"; +$lang->program->modelList['waterfall'] = "瀑布"; + +$lang->program->PRJCategoryList['single'] = "單產品項目"; +$lang->program->PRJCategoryList['multiple'] = "多產品項目"; + +$lang->program->PRJLifeTimeList['short'] = "短期"; +$lang->program->PRJLifeTimeList['long'] = "長期"; +$lang->program->PRJLifeTimeList['ops'] = "運維"; + +$lang->program->featureBar['all'] = '所有'; +$lang->program->featureBar['doing'] = '進行中'; +$lang->program->featureBar['wait'] = '未開始'; +$lang->program->featureBar['suspended'] = '已掛起'; +$lang->program->featureBar['closed'] = '已關閉'; + +$lang->program->PRJAclList['open'] = "預設設置(有項目視圖權限,即可訪問)"; +$lang->program->PRJAclList['private'] = "私有項目(只有項目團隊成員才能訪問)"; +$lang->program->PRJAclList['custom'] = "自定義白名單(團隊成員和白名單的成員可以訪問)"; + +$lang->program->PRJAuthList['extend'] = '繼承(取項目權限與組織權限的並集)'; +$lang->program->PRJAuthList['reset'] = '重新定義(只取項目權限)'; + +$lang->program->statusList['wait'] = '未開始'; +$lang->program->statusList['doing'] = '進行中'; +$lang->program->statusList['suspended'] = '已掛起'; +$lang->program->statusList['closed'] = '已關閉'; + +$lang->program->noPRJ = '暫時沒有項目'; +$lang->program->accessDenied = '您無權訪問該項目!'; +$lang->program->chooseProgramType = '選擇項目管理方式'; +$lang->program->nextStep = '下一步'; +$lang->program->hoursUnit = '%s工時'; +$lang->program->membersUnit = '%s人'; +$lang->program->lastIteration = '近期迭代'; +$lang->program->ongoingStage = '進行中的階段'; +$lang->program->scrum = 'Scrum'; +$lang->program->waterfall = '瀑布'; +$lang->program->waterfallTitle = '瀑布式項目管理'; +$lang->program->cannotCreateChild = '該項目已經有實際的內容,無法直接添加子項目。您可以為當前項目創建一個父項目,然後在新的父項目下面添加子項目。'; +$lang->program->hasChildren = '該項目有子項目存在,不能刪除。'; +$lang->program->confirmDelete = "您確定要刪除嗎?"; +$lang->program->emptyPM = '暫無'; +$lang->program->cannotChangeToCat = "該項目已經有實際的內容,無法修改為父項目"; +$lang->program->cannotCancelCat = "該項目下已經有子項目,無法取消父項目標記"; +$lang->program->parentBeginEnd = "父項目起止時間:%s ~ %s"; +$lang->program->parentBudget = "父項目預算:%s"; +$lang->program->beginLetterParent = "父項目的開始日期:%s,開始日期不能小於父項目的開始日期"; +$lang->program->endGreaterParent = "父項目的完成日期:%s,完成日期不能大於父項目的完成日期"; +$lang->program->beginGreateChild = "子項目的最小開始日期:%s,父項目的開始日期不能大於子項目的最小開始日期"; +$lang->program->endLetterChild = "子項目的最大完成日期:%s,父項目的完成日期不能小於子項目的最大完成日期"; +$lang->program->childLongTime = "子項目中有長期項目,父項目也應該是長期項目"; +$lang->program->readjustTime = '重新調整項目起止時間'; + +$lang->program->PRJProgramTitle['0'] = '不顯示'; +$lang->program->PRJProgramTitle['base'] = '只顯示一級項目集'; +$lang->program->PRJProgramTitle['end'] = '只顯示最後一級項目集'; + +$lang->program->PRJNoProgram = '暫時沒有項目'; +$lang->program->PRJAccessDenied = '您無權訪問該項目!'; +$lang->program->PRJChooseProgramType = '選擇項目管理方式'; +$lang->program->scrumTitle = '敏捷開發全流程項目管理'; +$lang->program->PRJCannotCreateChild = '該項目已經有實際的內容,無法直接添加子項目。您可以為當前項目創建一個父項目,然後在新的父項目下面添加子項目。'; +$lang->program->PRJHasChildren = '該項目有子項目存在,不能刪除。'; +$lang->program->PRJConfirmDelete = "您確定刪除項目[%s]嗎?"; +$lang->program->PRJCannotChangeToCat = "該項目已經有實際的內容,無法修改為父項目"; +$lang->program->PRJCannotCancelCat = "該項目下已經有子項目,無法取消父項目標記"; +$lang->program->PRJParentBeginEnd = "父項目起止時間:%s ~ %s"; +$lang->program->PRJParentBudget = "父項目預算:%s"; +$lang->program->PRJBeginLetterParent = "父項目的開始日期:%s,開始日期不能小於父項目的開始日期"; +$lang->program->PRJEndGreaterParent = "父項目的完成日期:%s,完成日期不能大於父項目的完成日期"; +$lang->program->PRJBeginGreateChild = "項目的最小開始日期:%s,項目集的開始日期不能大於項目的最小開始日期"; +$lang->program->PRJEndLetterChild = "項目的最大完成日期:%s,項目集的完成日期不能小於項目的最大完成日期"; +$lang->program->PRJChildLongTime = "子項目中有長期項目,父項目也應該是長期項目"; + +/* Actions. */ +$lang->program->PGMCommon = '項目集'; +$lang->program->PGMIndex = '項目集主頁'; +$lang->program->PGMCreate = '添加項目集'; +$lang->program->PGMCreateGuide = '選擇項目模板'; +$lang->program->PGMEdit = '編輯項目集'; +$lang->program->PGMBrowse = '項目集列表'; +$lang->program->PGMProduct = '產品列表'; +$lang->program->PGMProject = '項目列表'; +$lang->program->PGMAll = '所有項目集'; +$lang->program->PGMStart = '啟動項目集'; +$lang->program->PGMFinish = '完成項目集'; +$lang->program->PGMSuspend = '掛起項目集'; +$lang->program->PGMDelete = '刪除項目集'; +$lang->program->PGMClose = '關閉項目集'; +$lang->program->PGMView = '項目集概況'; +$lang->program->PGMActivate = '激活項目集'; +$lang->program->PGMGroup = '權限分組'; +$lang->program->PGMCreateGroup = '創建分組'; +$lang->program->PGMEditGroup = '編輯分組'; +$lang->program->PGMCopyGroup = '複製分組'; +$lang->program->PGMManageView = '維護視圖'; +$lang->program->PGMManagePriv = '維護權限'; +$lang->program->PGMManageMembers = '項目集團隊'; +$lang->program->PGMExport = '導出'; +$lang->program->PGMManageGroupMember = '維護分組用戶'; +$lang->program->PGMStakeholder = '干係人列表'; +$lang->program->createStakeholder = '添加干係人'; +$lang->program->importStakeholder = '從父項目導入'; + +/* Fields. */ +$lang->program->PGMName = '項目集名稱'; +$lang->program->PGMTemplate = '項目集模板'; +$lang->program->PGMCategory = '項目集類型'; +$lang->program->PGMDesc = '項目集描述'; +$lang->program->PGMCode = '項目集代號'; +$lang->program->PGMCopy = '複製項目集'; +$lang->program->PGMStatus = '項目集狀態'; +$lang->program->PGMPM = '項目集負責人'; +$lang->program->PGMBudget = '項目集預算'; +$lang->program->PGMProgress = '項目進度'; +$lang->program->PGMChildren = '子項目集'; +$lang->program->PGMParent = '父項目集'; +$lang->program->PGMAllInput = '項目集總投入'; +$lang->program->PGMTeamCount = '項目整合員'; +$lang->program->PGMLongTime = '長期項目'; + +$lang->program->noPGM = '暫時沒有項目集'; +$lang->program->PGMShowClosed = '顯示已關閉'; + +$lang->program->PGMAclList['open'] = "預設設置(有項目視圖權限,即可訪問)"; +$lang->program->PGMAclList['private'] = "私有項目(只有項目團隊成員才能訪問)"; +$lang->program->PGMAclList['custom'] = "自定義白名單(團隊成員和白名單的成員可以訪問)"; + +$lang->program->PGMAuthList['extend'] = '繼承(取項目權限與組織權限的並集)'; +$lang->program->PGMAuthList['reset'] = '重新定義(只取項目權限)'; + +$lang->program->PGMFeatureBar['all'] = '所有'; diff --git a/module/programplan/control.php b/module/programplan/control.php index d36d2314a6..bfc23b1b6b 100644 --- a/module/programplan/control.php +++ b/module/programplan/control.php @@ -58,7 +58,9 @@ class programplan extends control { $this->app->loadLang('stage'); $this->commonAction($programID, $productID, $type); - $this->session->set('programplanList', $this->app->getURI(true)); + $this->session->set('programPlanList', $this->app->getURI(true)); + + if(common::hasPriv('programplan', 'create')) $this->lang->modulePageActions = html::a($this->createLink('programplan', 'create', "programID=$programID"), " " . $this->lang->programplan->create, '', "class='btn btn-primary'"); $selectCustom = 0; $dateDetails = 1; @@ -111,30 +113,37 @@ class programplan extends control $this->commonAction($programID, $productID); if($_POST) { - $this->programplan->create($programID, $planID, $this->productID); + $this->programplan->create($programID, $this->productID, $planID); if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError())); - $locate = $this->session->PRJplanList ? $this->session->PRJplanList : $this->createLink('programplan', 'browse', "program=$programID"); + $locate = $this->session->programPlanList ? $this->session->programPlanList : $this->createLink('programplan', 'browse', "program=$programID"); $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => $locate)); } + $stages = array(); + $browseType = 'parent'; + if($planID) + { + $stages = $this->loadModel('stage')->getStages('id_asc'); + $browseType = 'children'; + } + $this->app->loadLang('stage'); $program = $this->loadModel('project')->getById($programID); - $stages = $planID ? array() : $this->loadModel('stage')->getStages('id_asc'); - $plans = $this->programplan->getList($programID, $this->productID, $planID); + $plans = $this->programplan->getList($programID, $this->productID, $planID, $browseType); $title = $this->lang->programplan->create . $this->lang->colon . $program->name; $position[] = html::a($this->createLink('programplan', 'browse', "program=$programID"), $program->name); $position[] = $this->lang->programplan->create; - $this->view->title = $title; - $this->view->position = $position; - $this->view->program = $program; - $this->view->stages = $stages; - $this->view->plans = $plans; - $this->view->planID = $planID; - $this->view->type = 'lists'; + $this->view->title = $title; + $this->view->position = $position; + $this->view->program = $program; + $this->view->stages = $stages; + $this->view->plans = $plans; + $this->view->planID = $planID; + $this->view->type = 'lists'; $this->display(); } @@ -143,17 +152,18 @@ class programplan extends control * Edit a programplan. * * @param int $planID + * @param int $programID * @access public * @return void */ - public function edit($planID = 0) + public function edit($planID = 0, $programID = 0) { $plan = $this->programplan->getByID($planID); $this->commonAction($plan->program, $plan->product); if($_POST) { - $changes = $this->programplan->update($planID); + $changes = $this->programplan->update($planID, $programID); if(dao::isError()) $this->send(array('result' => 'fail', 'message' => dao::getError())); if($changes) { @@ -168,9 +178,9 @@ class programplan extends control $this->view->title = $this->lang->programplan->edit; $this->view->position[] = $this->lang->programplan->edit; $this->view->parentStage = $this->programplan->getParentStageList($this->session->PRJ, $planID, $plan->product); - $this->view->plan = $plan; $this->view->isParent = $this->programplan->isParent($planID); $this->view->isCreateTask = $this->programplan->isCreateTask($planID); + $this->view->plan = $plan; $this->display(); } diff --git a/module/programplan/lang/de.php b/module/programplan/lang/de.php new file mode 100644 index 0000000000..a58599572e --- /dev/null +++ b/module/programplan/lang/de.php @@ -0,0 +1,69 @@ + + * @package programplan + * @version $Id: en.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $ + * @link http://www.zentao.net + */ +$lang->programplan->common = 'Program Plan'; +$lang->programplan->browse = 'Program Plan'; +$lang->programplan->gantt = 'Gantt Chart'; +$lang->programplan->list = 'Stage List'; +$lang->programplan->create = 'Create'; +$lang->programplan->edit = 'Edit'; +$lang->programplan->delete = 'Delete'; +$lang->programplan->createSubPlan = 'Create Sub Plan'; + +$lang->programplan->parent = 'Parent Stage'; +$lang->programplan->emptyParent = 'N/A'; +$lang->programplan->name = 'Name'; +$lang->programplan->percent = 'Plan Workload'; +$lang->programplan->percentAB = 'Plan Workload'; +$lang->programplan->planPercent = 'Workload'; +$lang->programplan->attribute = 'Stage'; +$lang->programplan->milestone = 'Milestone'; +$lang->programplan->taskProgress = 'Task Progress'; +$lang->programplan->task = 'Task'; +$lang->programplan->begin = 'Begin'; +$lang->programplan->end = 'End'; +$lang->programplan->realBegan = 'Actual Started'; +$lang->programplan->realEnd = 'Actual End'; +$lang->programplan->output = 'Output'; +$lang->programplan->openedBy = 'Created By'; +$lang->programplan->openedDate = 'Created Date'; +$lang->programplan->editedBy = 'Edited By'; +$lang->programplan->editedDate = 'Edited Date'; +$lang->programplan->duration = 'Duration'; +$lang->programplan->version = 'Version'; +$lang->programplan->full = 'Full Screen'; +$lang->programplan->today = 'Today'; +$lang->programplan->exporting = 'Exporting'; +$lang->programplan->exportFail = 'Export failed'; +$lang->programplan->hideCriticalPath = 'Hide Critical Path'; +$lang->programplan->showCriticalPath = 'Show Critical Path'; +$lang->programplan->accessRight = 'Access Control'; + +$lang->programplan->milestoneList[1] = 'Yes'; +$lang->programplan->milestoneList[0] = 'No'; + +$lang->programplan->accessRights['open'] = 'Inherited Project ACL (for who can access the current project)'; +$lang->programplan->accessRights['private'] = 'Private (for team members and project stakeholders)'; + +$lang->programplan->noData = 'No Data'; +$lang->programplan->children = 'Sub Plan'; +$lang->programplan->childrenAB = 'Child'; +$lang->programplan->confirmDelete = 'Do you want to delete the current plan?'; + +$lang->programplan->stageCustom = new stdClass(); +$lang->programplan->stageCustom->date = 'Show Date'; +$lang->programplan->stageCustom->task = 'Show Task'; + +$lang->programplan->error = new stdclass(); +$lang->programplan->error->percentNumber = '"Workload %" must be digits.'; +$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; +$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.'; +$lang->programplan->error->createdTask = 'The task has been decomposed. Sub phases cannot be added.'; diff --git a/module/programplan/lang/en.php b/module/programplan/lang/en.php index fb98414e59..a58599572e 100644 --- a/module/programplan/lang/en.php +++ b/module/programplan/lang/en.php @@ -9,8 +9,7 @@ * @version $Id: en.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->programplan->common = 'Program Plan'; - +$lang->programplan->common = 'Program Plan'; $lang->programplan->browse = 'Program Plan'; $lang->programplan->gantt = 'Gantt Chart'; $lang->programplan->list = 'Stage List'; @@ -46,10 +45,14 @@ $lang->programplan->exporting = 'Exporting'; $lang->programplan->exportFail = 'Export failed'; $lang->programplan->hideCriticalPath = 'Hide Critical Path'; $lang->programplan->showCriticalPath = 'Show Critical Path'; +$lang->programplan->accessRight = 'Access Control'; $lang->programplan->milestoneList[1] = 'Yes'; $lang->programplan->milestoneList[0] = 'No'; +$lang->programplan->accessRights['open'] = 'Inherited Project ACL (for who can access the current project)'; +$lang->programplan->accessRights['private'] = 'Private (for team members and project stakeholders)'; + $lang->programplan->noData = 'No Data'; $lang->programplan->children = 'Sub Plan'; $lang->programplan->childrenAB = 'Child'; diff --git a/module/programplan/lang/fr.php b/module/programplan/lang/fr.php new file mode 100644 index 0000000000..a58599572e --- /dev/null +++ b/module/programplan/lang/fr.php @@ -0,0 +1,69 @@ + + * @package programplan + * @version $Id: en.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $ + * @link http://www.zentao.net + */ +$lang->programplan->common = 'Program Plan'; +$lang->programplan->browse = 'Program Plan'; +$lang->programplan->gantt = 'Gantt Chart'; +$lang->programplan->list = 'Stage List'; +$lang->programplan->create = 'Create'; +$lang->programplan->edit = 'Edit'; +$lang->programplan->delete = 'Delete'; +$lang->programplan->createSubPlan = 'Create Sub Plan'; + +$lang->programplan->parent = 'Parent Stage'; +$lang->programplan->emptyParent = 'N/A'; +$lang->programplan->name = 'Name'; +$lang->programplan->percent = 'Plan Workload'; +$lang->programplan->percentAB = 'Plan Workload'; +$lang->programplan->planPercent = 'Workload'; +$lang->programplan->attribute = 'Stage'; +$lang->programplan->milestone = 'Milestone'; +$lang->programplan->taskProgress = 'Task Progress'; +$lang->programplan->task = 'Task'; +$lang->programplan->begin = 'Begin'; +$lang->programplan->end = 'End'; +$lang->programplan->realBegan = 'Actual Started'; +$lang->programplan->realEnd = 'Actual End'; +$lang->programplan->output = 'Output'; +$lang->programplan->openedBy = 'Created By'; +$lang->programplan->openedDate = 'Created Date'; +$lang->programplan->editedBy = 'Edited By'; +$lang->programplan->editedDate = 'Edited Date'; +$lang->programplan->duration = 'Duration'; +$lang->programplan->version = 'Version'; +$lang->programplan->full = 'Full Screen'; +$lang->programplan->today = 'Today'; +$lang->programplan->exporting = 'Exporting'; +$lang->programplan->exportFail = 'Export failed'; +$lang->programplan->hideCriticalPath = 'Hide Critical Path'; +$lang->programplan->showCriticalPath = 'Show Critical Path'; +$lang->programplan->accessRight = 'Access Control'; + +$lang->programplan->milestoneList[1] = 'Yes'; +$lang->programplan->milestoneList[0] = 'No'; + +$lang->programplan->accessRights['open'] = 'Inherited Project ACL (for who can access the current project)'; +$lang->programplan->accessRights['private'] = 'Private (for team members and project stakeholders)'; + +$lang->programplan->noData = 'No Data'; +$lang->programplan->children = 'Sub Plan'; +$lang->programplan->childrenAB = 'Child'; +$lang->programplan->confirmDelete = 'Do you want to delete the current plan?'; + +$lang->programplan->stageCustom = new stdClass(); +$lang->programplan->stageCustom->date = 'Show Date'; +$lang->programplan->stageCustom->task = 'Show Task'; + +$lang->programplan->error = new stdclass(); +$lang->programplan->error->percentNumber = '"Workload %" must be digits.'; +$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; +$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.'; +$lang->programplan->error->createdTask = 'The task has been decomposed. Sub phases cannot be added.'; diff --git a/module/programplan/lang/vi.php b/module/programplan/lang/vi.php new file mode 100644 index 0000000000..a58599572e --- /dev/null +++ b/module/programplan/lang/vi.php @@ -0,0 +1,69 @@ + + * @package programplan + * @version $Id: en.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $ + * @link http://www.zentao.net + */ +$lang->programplan->common = 'Program Plan'; +$lang->programplan->browse = 'Program Plan'; +$lang->programplan->gantt = 'Gantt Chart'; +$lang->programplan->list = 'Stage List'; +$lang->programplan->create = 'Create'; +$lang->programplan->edit = 'Edit'; +$lang->programplan->delete = 'Delete'; +$lang->programplan->createSubPlan = 'Create Sub Plan'; + +$lang->programplan->parent = 'Parent Stage'; +$lang->programplan->emptyParent = 'N/A'; +$lang->programplan->name = 'Name'; +$lang->programplan->percent = 'Plan Workload'; +$lang->programplan->percentAB = 'Plan Workload'; +$lang->programplan->planPercent = 'Workload'; +$lang->programplan->attribute = 'Stage'; +$lang->programplan->milestone = 'Milestone'; +$lang->programplan->taskProgress = 'Task Progress'; +$lang->programplan->task = 'Task'; +$lang->programplan->begin = 'Begin'; +$lang->programplan->end = 'End'; +$lang->programplan->realBegan = 'Actual Started'; +$lang->programplan->realEnd = 'Actual End'; +$lang->programplan->output = 'Output'; +$lang->programplan->openedBy = 'Created By'; +$lang->programplan->openedDate = 'Created Date'; +$lang->programplan->editedBy = 'Edited By'; +$lang->programplan->editedDate = 'Edited Date'; +$lang->programplan->duration = 'Duration'; +$lang->programplan->version = 'Version'; +$lang->programplan->full = 'Full Screen'; +$lang->programplan->today = 'Today'; +$lang->programplan->exporting = 'Exporting'; +$lang->programplan->exportFail = 'Export failed'; +$lang->programplan->hideCriticalPath = 'Hide Critical Path'; +$lang->programplan->showCriticalPath = 'Show Critical Path'; +$lang->programplan->accessRight = 'Access Control'; + +$lang->programplan->milestoneList[1] = 'Yes'; +$lang->programplan->milestoneList[0] = 'No'; + +$lang->programplan->accessRights['open'] = 'Inherited Project ACL (for who can access the current project)'; +$lang->programplan->accessRights['private'] = 'Private (for team members and project stakeholders)'; + +$lang->programplan->noData = 'No Data'; +$lang->programplan->children = 'Sub Plan'; +$lang->programplan->childrenAB = 'Child'; +$lang->programplan->confirmDelete = 'Do you want to delete the current plan?'; + +$lang->programplan->stageCustom = new stdClass(); +$lang->programplan->stageCustom->date = 'Show Date'; +$lang->programplan->stageCustom->task = 'Show Task'; + +$lang->programplan->error = new stdclass(); +$lang->programplan->error->percentNumber = '"Workload %" must be digits.'; +$lang->programplan->error->planFinishSmall = 'The "End" date must be > the "Begin" date.'; +$lang->programplan->error->percentOver = 'The sum of "Workload %" cannot exceed 100%.'; +$lang->programplan->error->createdTask = 'The task has been decomposed. Sub phases cannot be added.'; diff --git a/module/programplan/lang/zh-cn.php b/module/programplan/lang/zh-cn.php index 00c60f2012..315948430f 100644 --- a/module/programplan/lang/zh-cn.php +++ b/module/programplan/lang/zh-cn.php @@ -9,8 +9,7 @@ * @version $Id: zh-cn.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $ * @link http://www.zentao.net */ -$lang->programplan->common = '项目计划'; - +$lang->programplan->common = '项目计划'; $lang->programplan->browse = '浏览阶段计划'; $lang->programplan->gantt = '甘特图'; $lang->programplan->list = '阶段列表'; @@ -46,10 +45,14 @@ $lang->programplan->exporting = '导出'; $lang->programplan->exportFail = '导出失败'; $lang->programplan->hideCriticalPath = '隐藏关键路径'; $lang->programplan->showCriticalPath = '显示关键路径'; +$lang->programplan->accessRight = '访问控制'; $lang->programplan->milestoneList[1] = '是'; $lang->programplan->milestoneList[0] = '否'; +$lang->programplan->accessRights['open'] = '继承项目访问权限 (能访问当前项目,即可访问)'; +$lang->programplan->accessRights['private'] = '私有 (团队成员和项目干系人可访问)'; + $lang->programplan->noData = '暂无数据。'; $lang->programplan->children = '二级计划'; $lang->programplan->childrenAB = '子'; diff --git a/module/programplan/lang/zh-tw.php b/module/programplan/lang/zh-tw.php new file mode 100644 index 0000000000..911886b8f7 --- /dev/null +++ b/module/programplan/lang/zh-tw.php @@ -0,0 +1,69 @@ + + * @package programplan + * @version $Id: zh-cn.php 4729 2013-05-03 07:53:55Z chencongzhi520@gmail.com $ + * @link http://www.zentao.net + */ +$lang->programplan->common = '項目計劃'; +$lang->programplan->browse = '瀏覽階段計劃'; +$lang->programplan->gantt = '甘特圖'; +$lang->programplan->list = '階段列表'; +$lang->programplan->create = '設置階段'; +$lang->programplan->edit = '編輯'; +$lang->programplan->delete = '刪除'; +$lang->programplan->createSubPlan = '創建二級階段'; + +$lang->programplan->parent = '父階段'; +$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->realBegan = '實際開始'; +$lang->programplan->realEnd = '實際完成'; +$lang->programplan->output = '輸出'; +$lang->programplan->openedBy = '由誰創建'; +$lang->programplan->openedDate = '創建日期'; +$lang->programplan->editedBy = '由誰編輯'; +$lang->programplan->editedDate = '編輯日期'; +$lang->programplan->duration = '計劃工期'; +$lang->programplan->version = '版本號'; +$lang->programplan->full = '全屏'; +$lang->programplan->today = '今天'; +$lang->programplan->exporting = '導出'; +$lang->programplan->exportFail = '導出失敗'; +$lang->programplan->hideCriticalPath = '隱藏關鍵路徑'; +$lang->programplan->showCriticalPath = '顯示關鍵路徑'; +$lang->programplan->accessRight = '訪問控制'; + +$lang->programplan->milestoneList[1] = '是'; +$lang->programplan->milestoneList[0] = '否'; + +$lang->programplan->accessRights['open'] = '繼承項目訪問權限 (能訪問當前項目,即可訪問)'; +$lang->programplan->accessRights['private'] = '私有 (團隊成員和項目干係人可訪問)'; + +$lang->programplan->noData = '暫無數據。'; +$lang->programplan->children = '二級計劃'; +$lang->programplan->childrenAB = '子'; +$lang->programplan->confirmDelete = '確定要刪除當前計劃嗎?'; + +$lang->programplan->stageCustom = new stdClass(); +$lang->programplan->stageCustom->date = '顯示日期'; +$lang->programplan->stageCustom->task = '顯示任務'; + +$lang->programplan->error = new stdclass(); +$lang->programplan->error->percentNumber = '"工作量比例"必須為數字'; +$lang->programplan->error->planFinishSmall = '"計劃完成時間"必須大於"計劃開始時間"'; +$lang->programplan->error->percentOver = '"工作量比例"累計不應當超過100%'; +$lang->programplan->error->createdTask = '已分解任務,不可添加子階段'; diff --git a/module/programplan/model.php b/module/programplan/model.php index ea528587ef..03d608722a 100644 --- a/module/programplan/model.php +++ b/module/programplan/model.php @@ -55,26 +55,27 @@ class programplanModel extends model } /** - * Get plans list. + * Get plans list. * * @param int $programID * @param int $productID * @param int $planID - * @param string $type + * @param string $browseType * @param string $orderBy * @access public * @return array */ - public function getList($programID = 0, $productID = 0, $planID = 0, $type = '', $orderBy = 'id_asc') + public function getList($programID = 0, $productID = 0, $planID = 0, $browseType = 'all', $orderBy = 'id_asc') { $projects = $this->getProjectsByProduct($productID); $plans = $this->dao->select('*')->from(TABLE_PROJECT) ->where('type')->eq('stage') - ->andWhere('parent')->eq($programID) - ->beginIF($type != 'all')->andWhere('parent')->eq($planID)->fi() - ->andWhere('deleted')->eq(0) + ->beginIF($browseType == 'all')->andWhere('path')->like(",$programID,%")->fi() + ->beginIF($browseType == 'parent')->andWhere('parent')->eq($programID)->fi() + ->beginIF($browseType == 'children')->andWhere('parent')->eq($planID)->fi() ->beginIF($productID)->andWhere('id')->in($projects)->fi() + ->andWhere('deleted')->eq(0) ->orderBy($orderBy) ->fetchAll('id'); @@ -139,10 +140,11 @@ class programplanModel extends model { $plans = $this->getList($programID, $productID, 0, 'all', $orderBy); - $parents = array(); + $parents = array(); + $children = array(); foreach($plans as $planID => $plan) { - $plan->parent == 0 ? $parents[$planID] = $plan : $children[$plan->parent][] = $plan; + $plan->grade == 1 ? $parents[$planID] = $plan : $children[$plan->parent][] = $plan; } foreach($parents as $planID => $plan) $parents[$planID]->children = isset($children[$planID]) ? $children[$planID] : array(); @@ -220,19 +222,19 @@ class programplanModel extends model $end = $plan->end == '0000-00-00' ? '' : $plan->end; $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); - $data->milestone = zget($this->lang->programplan->milestoneList, $plan->milestone); - $data->start_date = $start; - $data->deadline = $end; - $data->realBegan = $plan->realBegan == '0000-00-00' ? '' : $plan->realBegan; - $data->realEnd = $plan->realEnd == '0000-00-00' ? '' : $plan->realEnd; - $data->duration = helper::diffDate($plan->end, $plan->begin) + 1;; - $data->parent = $plan->parent; - $data->open = true; + $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); + $data->milestone = zget($this->lang->programplan->milestoneList, $plan->milestone); + $data->start_date = $start; + $data->deadline = $end; + $data->realBegan = $plan->realBegan == '0000-00-00' ? '' : $plan->realBegan; + $data->realEnd = $plan->realEnd == '0000-00-00' ? '' : $plan->realEnd; + $data->duration = helper::diffDate($plan->end, $plan->begin) + 1;; + $data->parent = $plan->grade == 1 ? 0 :$plan->parent; + $data->open = true; if($data->start_date == '' or $data->deadline == '') $data->duration = 0; @@ -244,11 +246,11 @@ class programplanModel extends model $taskPri = "%s "; /* Judge whether to display tasks under the stage. */ - $owner = $this->app->user->account; - $module = 'programplan'; - $section = 'browse'; - $object = 'stageCustom'; - $setting = $this->loadModel('setting'); + $owner = $this->app->user->account; + $module = 'programplan'; + $section = 'browse'; + $object = 'stageCustom'; + $setting = $this->loadModel('setting'); if(empty($selectCustom)) $selectCustom = $setting->getItem("owner={$owner}&module={$module}§ion={$section}&key={$object}"); @@ -276,9 +278,9 @@ class programplanModel extends model $start = $task->estStarted == '0000-00-00' ? '' : date('d-m-Y', strtotime($task->estStarted)); $end = $task->deadline == '0000-00-00' ? '' : $task->deadline; - $realBegan = $task->realStarted == '0000-00-00' ? '' : $task->realStarted; - $realEnd = $task->finishedDate == '0000-00-00 00:00:00' ? '' : substr($task->finishedDate, 5, 11); - $priIcon = sprintf($taskPri, $task->pri, $task->pri, $task->pri); + $realBegan = $task->realStarted == '0000-00-00' ? '' : $task->realStarted; + $realEnd = $task->finishedDate == '0000-00-00 00:00:00' ? '' : substr($task->finishedDate, 5, 11); + $priIcon = sprintf($taskPri, $task->pri, $task->pri, $task->pri); $data = new stdclass(); $data->id = $task->project . '-' . $task->id; @@ -324,19 +326,19 @@ class programplanModel extends model /** * Get total percent. * - * @param int $plan + * @param object $plan * @access public * @return int */ public function getTotalPercent($plan) { - $plans = $this->getList($plan->program, $plan->product, $plan->parent); + $plans = $this->getList($plan->program, $plan->product, $plan->parent,'parent'); $totalPercent = 0; - foreach($plans as $planID => $planObj) + foreach($plans as $id => $stage) { - if($planID == $plan->id) continue; - $totalPercent += $planObj->percent; + if($id == $plan->id) continue; + $totalPercent += $stage->percent; } return $totalPercent; @@ -417,51 +419,56 @@ class programplanModel extends model /** * Create a plan. * - * @param int $programID - * @param int $parentID - * @param int $productID + * @param int $programID + * @param int $productID + * @param int $parentID * @access public * @return bool */ - public function create($programID = 0, $parentID = 0, $productID = 0) + public function create($programID = 0, $productID = 0, $parentID = 0) { $data = (array)fixer::input('post')->get(); extract($data); + /* Determine if a task has been created under the parent phase. */ if(!$this->isCreateTask($parentID)) return dao::$errors['message'][] = $this->lang->programplan->error->createdTask; - $parentStage = ''; + + /* The child phase type setting is the same as the parent phase. */ + $parentStageType = ''; if($parentID) { - $parentData = $this->getByID($parentID); - $parentStage = $parentData->attribute; + $parentData = $this->getByID($parentID); + $parentStageType = $parentData->attribute; } $attributes = array_values($attributes); $milestone = array_values($milestone); - $datas = array(); + $datas = array(); foreach($names as $key => $name) { if(empty($name)) continue; $plan = new stdclass(); - $plan->id = isset($planIDs[$key]) ? $planIDs[$key] : ''; - $plan->type = 'stage'; - $plan->parent = $parentID ? $parentID : (int)$programID; - $plan->name = $names[$key]; - $plan->percent = $percents[$key]; - $plan->attribute = empty($parentID) ? $attributes[$key] : $parentStage; - $plan->milestone = $milestone[$key]; - $plan->begin = empty($begin[$key]) ? '0000-00-00' : $begin[$key]; - $plan->end = empty($end[$key]) ? '0000-00-00' : $end[$key]; - $plan->realBegan = empty($realBegan[$key]) ? '0000-00-00' : $realBegan[$key]; - $plan->realEnd = empty($realEnd[$key]) ? '0000-00-00' : $realEnd[$key]; - $plan->output = empty($output[$key]) ? '' : implode(',', $output[$key]); + $plan->id = isset($planIDList[$key]) ? $planIDList[$key] : ''; + $plan->type = 'stage'; + $plan->project = $programID; + $plan->parent = $parentID ? $parentID : $programID; + $plan->name = $names[$key]; + $plan->percent = $percents[$key]; + $plan->attribute = empty($parentID) ? $attributes[$key] : $parentStageType; + $plan->milestone = $milestone[$key]; + $plan->begin = empty($begin[$key]) ? '0000-00-00' : $begin[$key]; + $plan->end = empty($end[$key]) ? '0000-00-00' : $end[$key]; + $plan->realBegan = empty($realBegan[$key]) ? '0000-00-00' : $realBegan[$key]; + $plan->realEnd = empty($realEnd[$key]) ? '0000-00-00' : $realEnd[$key]; + $plan->output = empty($output[$key]) ? '' : implode(',', $output[$key]); + $plan->acl = $acl[$key]; $datas[] = $plan; } $totalPercent = 0; - $devCounts = 0; + $totalDevType = 0; $milestone = 0; foreach($datas as $plan) { @@ -476,19 +483,8 @@ class programplanModel extends model return false; } - /* Check dev stage counts which should not be over one for parent plan. */ - if($parentID == 0) - { - if($plan->attribute == 'develop') $devCounts += 1; - if($devCounts > 1) - { - dao::$errors['message'][] = $this->lang->programplan->error->onlyOneDev; - return false; - } - } - if($plan->begin == '0000-00-00') $plan->begin = ''; - if($plan->end == '0000-00-00') $plan->end = ''; + if($plan->end == '0000-00-00') $plan->end = ''; foreach(explode(',', $this->config->programplan->create->requiredFields) as $field) { $field = trim($field); @@ -499,11 +495,8 @@ class programplanModel extends model } } - if($plan->percent) - { - $plan->percent = (float)$plan->percent; - $totalPercent += $plan->percent; - } + $plan->percent = (float)$plan->percent; + $totalPercent += $plan->percent; if($plan->milestone) $milestone = 1; } @@ -575,6 +568,7 @@ class programplanModel extends model if(!dao::isError()) { $planID = $this->dao->lastInsertID(); + $this->setTreePath($planID); $this->loadModel('project')->updateProducts($planID); $spec = new stdclass(); @@ -597,13 +591,39 @@ class programplanModel extends model } /** - * Update a plan. + * Set stage tree path. * * @param int $planID * @access public + * @return bool + */ + public function setTreePath($planID) + { + $stage = $this->dao->select('id,type,parent,path,grade')->from(TABLE_PROJECT)->where('id')->eq($planID)->fetch(); + $parent = $this->dao->select('id,type,parent,path,grade')->from(TABLE_PROJECT)->where('id')->eq($stage->parent)->fetch(); + + if($parent->type == 'project') + { + $path['path'] = ",{$parent->id},{$stage->id},"; + $path['grade'] = 1; + } + elseif($parent->type == 'stage') + { + $path['path'] = $parent->path . "{$stage->id},"; + $path['grade'] = $parent->grade + 1; + } + $this->dao->update(TABLE_PROJECT)->set('path')->eq($path['path'])->set('grade')->eq($path['grade'])->where('id')->eq($stage->id)->exec(); + } + + /** + * Update a plan. + * + * @param int $planID + * @param int $programID + * @access public * @return bool|array */ - public function update($planID = 0) + public function update($planID = 0, $programID = 0) { $oldPlan = $this->getByID($planID); $plan = fixer::input('post') @@ -625,35 +645,21 @@ class programplanModel extends model $totalPercent += (float)$plan->percent; if($totalPercent > 100) return dao::$errors['percent'][] = $this->lang->programplan->error->percentOver; - if($plan->parent == 0) - { - $projects = $this->getProjectsByProduct($oldPlan->product); - $devCounts = $this->dao->select('count(*) AS count')->from(TABLE_PROJECT) - ->where('parent')->eq($oldPlan->program) - ->andWhere('type')->eq('stage') - ->andWhere('deleted')->eq(0) - ->andWhere('attribute')->eq('dev') - ->andWhere('id')->ne($oldPlan->id) - ->andWhere('id')->in($projects) - ->fetch('count'); - } - if($plan->parent > 0) { /* If child plans has milestone, update parent plan set milestone eq 0 . */ $parentPlan = $this->getByID($plan->parent); if($plan->milestone and $parentPlan->milestone) $this->dao->update(TABLE_PROJECT)->set('milestone')->eq(0)->where('id')->eq($oldPlan->parent)->exec(); + $plan->attribute = $parentPlan->attribute; } - if(dao::isError()) return false; - /* Set planDuration and realDuration. */ $plan->planDuration = $this->getDuration($plan->begin, $plan->end); $plan->realDuration = $this->getDuration($plan->realBegan, $plan->realEnd); - if($plan->parent) $plan->attribute = $parentPlan->attribute; + if($planChanged) $plan->version = $oldPlan->version + 1; + if(empty($plan->parent)) $plan->parent = $programID; - if($planChanged) $plan->version = $oldPlan->version + 1; $this->dao->update(TABLE_PROJECT)->data($plan) ->autoCheck() ->batchCheck($this->config->programplan->edit->requiredFields, 'notempty') @@ -663,6 +669,7 @@ class programplanModel extends model ->exec(); if(dao::isError()) return false; + $this->setTreePath($planID); if($planChanged) { @@ -686,10 +693,11 @@ class programplanModel extends model * @param int $col * @param int $plan * @param int $users + * @param int $programID * @access public * @return string */ - public function printCell($col, $plan, $users) + public function printCell($col, $plan, $users, $programID) { $id = $col->id; if($col->show) @@ -718,7 +726,7 @@ class programplanModel extends model echo sprintf('%03d', $plan->id); break; case 'name': - if($plan->parent > 0) echo '' . $this->lang->programplan->childrenAB . ' '; + if($plan->grade > 1) echo '' . $this->lang->programplan->childrenAB . ' '; echo $plan->name; if(!empty($plan->children)) echo ''; break; @@ -766,7 +774,7 @@ class programplanModel extends model common::printIcon('task', 'create', "projectID={$plan->id}", $plan, 'list'); if($this->isCreateTask($plan->id)) { - common::printIcon('programplan', 'create', "program={$plan->program}&productID=$plan->product&planID=$plan->id", $plan, 'list', 'treemap', '', '', '', '', $this->lang->programplan->createSubPlan); + common::printIcon('programplan', 'create', "program={$plan->parent}&productID=$plan->product&planID=$plan->id", $plan, 'list', 'treemap', '', '', '', '', $this->lang->programplan->createSubPlan); } else { @@ -774,7 +782,7 @@ class programplanModel extends model echo html::a('javascript:alert("' . $this->lang->programplan->error->createdTask . '");', '', '', 'class="btn ' . $disabled . '"'); } - common::printIcon('programplan', 'edit', "planID=$plan->id", $plan, 'list', '', '', 'iframe', true); + common::printIcon('programplan', 'edit', "planID=$plan->id&programID=$programID", $plan, 'list', '', '', 'iframe', true); $disabled = !empty($plan->children) ? ' disabled' : ''; if(common::hasPriv('programplan', 'delete', $plan)) { @@ -813,7 +821,7 @@ class programplanModel extends model { $action = strtolower($action); - if($action == 'create' and $plan->parent) return false; + if($action == 'create' and $plan->grade > 1) return false; return true; } @@ -864,8 +872,8 @@ class programplanModel extends model */ public function isParent($planID) { - $children = $this->dao->select('id')->from(TABLE_PROJECT)->where('parent')->eq($planID)->andWhere('deleted')->eq('0')->fetch(); - return empty($children) ? false : true; + $childrenStage = $this->dao->select('grade')->from(TABLE_PROJECT)->where('parent')->eq($planID)->andWhere('deleted')->eq('0')->fetch(); + return empty($childrenStage) ? false : true; } /** @@ -883,8 +891,7 @@ class programplanModel extends model unset($projects[$planID]); $parentStage = $this->dao->select('id,name')->from(TABLE_PROJECT) - ->where('id')->in($projects) - ->andWhere('type')->eq('stage') + ->where('type')->eq('stage') ->andWhere('parent')->eq($programID) ->andWhere('deleted')->eq('0') ->fetchPairs('id'); diff --git a/module/programplan/view/create.html.php b/module/programplan/view/create.html.php index b9c3f17e7f..6a68b50767 100644 --- a/module/programplan/view/create.html.php +++ b/module/programplan/view/create.html.php @@ -28,6 +28,7 @@ programplan->name;?> programplan->percent;?> programplan->attribute;?> + programplan->accessRight;?> programplan->milestone;?> programplan->begin;?> programplan->end;?> @@ -49,6 +50,7 @@
stage->typeList, $stage->type, "class='form-control'");?> + programplan->accessRights, 'open', 'class="form-control"');?> programplan->milestoneList, 0);?> @@ -66,7 +68,7 @@ setMilestone ? '' : "disabled='disabled'"?> - id);?> + id);?> @@ -76,6 +78,7 @@
stage->typeList, $plan->attribute, "class='form-control'");?> + programplan->accessRights, $plan->acl, 'class="form-control"');?> programplan->milestoneList, $plan->milestone, $disabled);?> @@ -100,6 +103,7 @@ stage->typeList, '', "class='form-control'");?> + programplan->accessRights, 'open', 'class="form-control"');?> programplan->milestoneList, 0);?> @@ -135,6 +139,7 @@ stage->typeList, '', "class='form-control'");?> + programplan->accessRights, 'open', 'class="form-control"');?> programplan->milestoneList, 0);?> diff --git a/module/programplan/view/edit.html.php b/module/programplan/view/edit.html.php index 371209b813..5da3ffb450 100644 --- a/module/programplan/view/edit.html.php +++ b/module/programplan/view/edit.html.php @@ -57,6 +57,10 @@ js::set('parentID', $plan->parent); milestone);?> + + programplan->accessRight;?> + programplan->accessRights, $plan->acl, 'class="form-control"');?> + programplan->begin;?> begin, "class='form-control form-date'");?> diff --git a/module/programplan/view/list.html.php b/module/programplan/view/list.html.php index d062dc53fd..053093b8ad 100644 --- a/module/programplan/view/list.html.php +++ b/module/programplan/view/list.html.php @@ -59,7 +59,7 @@ js::set('confirmDelete', $lang->programplan->confirmDelete); - $value) $this->programplan->printCell($value, $plan, $users);?> + $value) $this->programplan->printCell($value, $plan, $users, $programID);?> children)):?> @@ -67,7 +67,7 @@ js::set('confirmDelete', $lang->programplan->confirmDelete); children)) ? ' table-child-bottom' : '';?> - $value) $this->programplan->printCell($value, $child, $users);?> + $value) $this->programplan->printCell($value, $child, $users, $programID);?> diff --git a/module/project/control.php b/module/project/control.php index 522695d6de..9a986ce619 100644 --- a/module/project/control.php +++ b/module/project/control.php @@ -1104,11 +1104,12 @@ class project extends control if(!empty($planID)) { - $plan = $this->dao->select('*')->from(TABLE_PRODUCTPLAN)->where('id')->eq($planID)->fetch(); - $products = $this->dao->select('t1.id, t1.name, t1.type, t2.branch')->from(TABLE_PRODUCT)->alias('t1') + $plan = $this->dao->select('*')->from(TABLE_PRODUCTPLAN)->where('id')->eq($planID)->fetch(); + $products = $this->dao->select('t1.id, t1.name, t1.type, t2.branch')->from(TABLE_PRODUCT)->alias('t1') ->leftJoin(TABLE_PROJECTPRODUCT)->alias('t2')->on('t1.id = t2.product') ->where('t1.id')->eq($plan->product) ->fetchAll('id'); + $productPlan = $this->loadModel('productplan')->getPairs($plan->product, 0, 'unexpired'); } diff --git a/module/project/lang/de.php b/module/project/lang/de.php index d35efe92f0..3a49bf16cd 100644 --- a/module/project/lang/de.php +++ b/module/project/lang/de.php @@ -115,9 +115,8 @@ $lang->project->statusList['doing'] = 'In Arbeit'; $lang->project->statusList['suspended'] = 'Ausgesetzt'; $lang->project->statusList['closed'] = 'Geschlossen'; -$lang->project->aclList['open'] = "Standard (Benutzer mit Rechten für Projekte können zugreifen.)"; -$lang->project->aclList['private'] = "Privat (Nur Teammitglieder)"; -$lang->project->aclList['custom'] = 'Benutzerdefiniert (Teammitglieder und Whitelist Benutzer haben Zugriff.)'; +$lang->project->aclList['open'] = 'Inherited Project ACL (for who can access the current project)'; +$lang->project->aclList['private'] = 'Private (for team members and project stakeholders)'; $lang->project->storyPoint = 'Story Point'; diff --git a/module/project/lang/en.php b/module/project/lang/en.php index da85e1e774..44b394a429 100644 --- a/module/project/lang/en.php +++ b/module/project/lang/en.php @@ -115,9 +115,8 @@ $lang->project->statusList['doing'] = 'Doing'; $lang->project->statusList['suspended'] = 'Suspended'; $lang->project->statusList['closed'] = 'Closed'; -$lang->project->aclList['open'] = "Default (Users who can visit {$lang->projectCommon} can access it.)"; -$lang->project->aclList['private'] = 'Private (For team members only.)'; -$lang->project->aclList['custom'] = 'Custom (Team members and the whitelist users can access it.)'; +$lang->project->aclList['open'] = 'Inherited Project ACL (for who can access the current project)'; +$lang->project->aclList['private'] = 'Private (for team members and project stakeholders)'; $lang->project->storyPoint = 'Story Point'; diff --git a/module/project/lang/fr.php b/module/project/lang/fr.php index 99e125ebd7..2de2f32ae6 100644 --- a/module/project/lang/fr.php +++ b/module/project/lang/fr.php @@ -115,9 +115,8 @@ $lang->project->statusList['doing'] = 'En cours'; $lang->project->statusList['suspended'] = 'Suspendu'; $lang->project->statusList['closed'] = 'Fermé'; -$lang->project->aclList['open'] = "Défaut (les utilisateurs qui peuvent consulter l'onglet {$lang->projectCommon} peuvent y accéder.)"; -$lang->project->aclList['private'] = "Privé (réservé aux membres de l'équipe.)"; -$lang->project->aclList['custom'] = "Liste blanche (seuls les membres de l'équipe et de la Liste Blanche peuvent y accéder.)"; +$lang->project->aclList['open'] = 'Inherited Project ACL (for who can access the current project)'; +$lang->project->aclList['private'] = 'Private (for team members and project stakeholders)'; $lang->project->storyPoint = 'Story Point'; diff --git a/module/project/lang/vi.php b/module/project/lang/vi.php index fcc6cb8c6a..be7dc1e29a 100644 --- a/module/project/lang/vi.php +++ b/module/project/lang/vi.php @@ -115,9 +115,8 @@ $lang->project->statusList['doing'] = 'Đang làm'; $lang->project->statusList['suspended'] = 'Đã đình chỉ'; $lang->project->statusList['closed'] = 'Đã đóng'; -$lang->project->aclList['open'] = "Mặc định (Người dùng có thể vào {$lang->projectCommon} có thể truy cập nó.)"; -$lang->project->aclList['private'] = 'Riêng tư (Chỉ có thành viên nhóm.)'; -$lang->project->aclList['custom'] = 'Tùy biến (Thành viên nhóm và người dùng dánh sách trắng có thể truy cập nó.)'; +$lang->project->aclList['open'] = 'Inherited Project ACL (for who can access the current project)'; +$lang->project->aclList['private'] = 'Private (for team members and project stakeholders)'; $lang->project->storyPoint = 'Story Point'; diff --git a/module/project/lang/zh-tw.php b/module/project/lang/zh-tw.php index b1abe34621..fca4faebcb 100644 --- a/module/project/lang/zh-tw.php +++ b/module/project/lang/zh-tw.php @@ -115,9 +115,8 @@ $lang->project->statusList['doing'] = '進行中'; $lang->project->statusList['suspended'] = '已掛起'; $lang->project->statusList['closed'] = '已關閉'; -$lang->project->aclList['open'] = "預設設置(有{$lang->projectCommon}視圖權限,即可訪問)"; -$lang->project->aclList['private'] = "私有{$lang->projectCommon}(只有{$lang->projectCommon}團隊成員才能訪問)"; -$lang->project->aclList['custom'] = "自定義白名單(團隊成員和白名單的成員可以訪問)"; +$lang->project->aclList['open'] = "繼承項目訪問權限 (能訪問當前項目,即可訪問)"; +$lang->project->aclList['private'] = "私有 (團隊成員和項目幹系人可訪問)"; /* 方法列表。*/ $lang->project->index = "{$lang->projectCommon}主頁"; diff --git a/module/project/model.php b/module/project/model.php index 489fdd545e..1fabc5c43c 100644 --- a/module/project/model.php +++ b/module/project/model.php @@ -310,6 +310,7 @@ class projectModel extends model $project = fixer::input('post') ->setDefault('status', 'wait') ->setDefault('type', 'sprint') + ->setDefault('project', $this->session->PRJ) ->setDefault('parent', $this->session->PRJ) ->setIF($this->post->acl != 'custom', 'whitelist', '') ->setDefault('openedBy', $this->app->user->account) @@ -320,6 +321,7 @@ class projectModel extends model ->stripTags($this->config->project->editor->create['id'], $this->config->allowedTags) ->remove('products, workDays, delta, branch, uid, plans') ->get(); + $project = $this->loadModel('file')->processImgURL($project, $this->config->project->editor->create['id'], $this->post->uid); $this->dao->insert(TABLE_PROJECT)->data($project) ->autoCheck($skipFields = 'begin,end') @@ -342,6 +344,9 @@ class projectModel extends model $this->dao->update(TABLE_PROJECT)->set('`order`')->eq($projectID * 5)->where('id')->eq($projectID)->exec(); $this->file->updateObjectID($this->post->uid, $projectID, 'project'); + /* Update the path. */ + $this->loadModel('programplan')->setTreePath($projectID); + /* Copy team of project. */ if($copyProjectID != '') { diff --git a/module/project/view/create.html.php b/module/project/view/create.html.php index 78630dd548..637d2d3535 100644 --- a/module/project/view/create.html.php +++ b/module/project/view/create.html.php @@ -147,11 +147,7 @@ project->acl;?> - project->aclList, $acl, "onclick='setWhite(this.value);'", 'block'));?> - - > - project->whitelist;?> - + project->aclList, $acl, '', 'block'));?>