3 * FusionForge Project Management Facility : Tasks
5 * Copyright 1999-2000, Tim Perdue/Sourceforge
6 * Copyright 2002, Tim Perdue/GForge, LLC
7 * Copyright 2009, Roland Mas
8 * Copyright 2010, Franck Villaume - Capgemini
9 * Copyright (C) 2012 Alain Peyrat - Alcatel-Lucent
10 * Copyright 2013, Franck Villaume - TrivialDev
11 * http://fusionforge.org
13 * This file is part of FusionForge. FusionForge is free software;
14 * you can redistribute it and/or modify it under the terms of the
15 * GNU General Public License as published by the Free Software
16 * Foundation; either version 2 of the Licence, or (at your option)
19 * FusionForge is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License along
25 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
29 require_once '../env.inc.php';
30 require_once $gfcommon.'include/pre.php';
31 require_once $gfwww.'pm/include/ProjectGroupHTML.class.php';
32 require_once $gfwww.'pm/include/ProjectTaskHTML.class.php';
33 require_once $gfcommon.'pm/ProjectGroupFactory.class.php';
35 $group_id = getIntFromRequest('group_id');
36 $group_project_id = getIntFromRequest('group_project_id');
37 $project_task_id = getIntFromRequest('project_task_id');
38 $start_hour = getStringFromRequest('start_hour');
39 $start_minute = getStringFromRequest('start_minute');
40 $start_month = getStringFromRequest('start_month');
41 $start_day = getStringFromRequest('start_day');
42 $start_year = getStringFromRequest('start_year');
43 $end_hour = getStringFromRequest('end_hour');
44 $end_minute = getStringFromRequest('end_minute');
45 $end_month = getStringFromRequest('end_month');
46 $end_day = getStringFromRequest('end_day');
47 $end_year = getStringFromRequest('end_year');
48 $summary = getStringFromRequest('summary');
49 $details = getStringFromRequest('details');
50 $priority = getStringFromRequest('priority');
51 $hours = getStringFromRequest('hours');
52 $start_date = getStringFromRequest('start_date');
53 $end_date = getStringFromRequest('end_date');
54 $status_id = getIntFromRequest('status_id');
55 $category_id = getIntFromRequest('category_id');
56 $percent_complete = getStringFromRequest('percent_complete');
57 $assigned_to = getStringFromRequest('assigned_to');
58 $new_group_project_id = getIntFromRequest('new_group_project_id');
59 $dependent_on = getStringFromRequest('dependent_on');
60 $duration = getStringFromRequest('duration');
61 $parent_id = getIntFromRequest('parent_id');
63 if (!$group_id || !$group_project_id) {
65 if (isset($_SERVER['HTTP_REFERER']))
66 $redirect_url = $_SERVER['HTTP_REFERER'];
69 $missing_params[] = _('Group ID');
71 if (!$group_project_id)
72 $missing_params[] = _('Group Project ID');
74 exit_missing_param($redirect_url,$missing_params,'pm');
77 $group = group_get_object($group_id);
78 if (!$group || !is_object($group)) {
80 } elseif ($group->isError()) {
81 exit_error($group->getErrorMessage(),'pm');
84 $pg = new ProjectGroupHTML($group,$group_project_id);
85 if (!$pg || !is_object($pg)) {
86 exit_error(_('Could Not Get Factory'),'pm');
87 } elseif ($pg->isError()) {
88 exit_error($pg->getErrorMessage(),'pm');
92 Figure out which function we're dealing with here
94 switch (getStringFromRequest('func')) {
97 // Show blank form to add new task
100 session_require_perm ('pm', $pg->getID(), 'manager') ;
102 $pt=new ProjectTaskHTML($pg);
103 if (!$pt || !is_object($pt)) {
104 exit_error(_('Could Not Get ProjectTask'),'pm');
105 } elseif ($pt->isError()) {
106 exit_error($pt->getErrorMessage(),'pm');
108 include $gfwww.'pm/add_task.php';
113 // Insert the task into the database
115 case 'postaddtask' : {
116 session_require_perm ('pm', $pg->getID(), 'manager') ;
118 $add_artifact_id = getIntFromRequest('add_artifact_id');
120 $pt = new ProjectTask($pg);
121 if (!$pt || !is_object($pt)) {
122 exit_error(_('Could Not Get Empty ProjectTask'),'pm');
123 } elseif ($pt->isError()) {
124 exit_error($pt->getErrorMessage(),'pm');
127 $saved_hours = $hours;
128 $hours = (float) $hours;
129 if ( $saved_hours !== (string)$hours ) {
130 exit_error(_('Illegal format for hours: must be an integer or a float number.'),'pm');
135 $dependent_on=array();
137 $start_date=mktime($start_hour,$start_minute,0,$start_month,$start_day,$start_year);
138 $end_date=mktime($end_hour,$end_minute,0,$end_month,$end_day,$end_year);
140 $sanitizer = new TextSanitizer();
141 $details = $sanitizer->purify($details);
143 if (!$pt->create($summary,$details,$priority,$hours,$start_date,$end_date,$category_id,$percent_complete,$assigned_to,$pt->convertDependentOn($dependent_on),$duration,$parent_id)) {
144 exit_error($pt->getErrorMessage(),'pm');
146 if (count($add_artifact_id) > 0) {
147 if (!$pt->addRelatedArtifacts($add_artifact_id)) {
148 exit_error('addRelatedArtifacts():: '.$pt->getErrorMessage(),'pm');
151 $feedback=_('Task Created Successfully');
152 include $gfwww.'pm/browse_task.php';
158 // Modify an existing task
160 case 'postmodtask' : {
161 session_require_perm ('pm', $pg->getID(), 'manager') ;
163 $rem_artifact_id = getIntFromRequest('rem_artifact_id');
165 if(!$rem_artifact_id){
166 $rem_artifact_id=array();
169 $pt = new ProjectTask($pg,$project_task_id);
170 if (!$pt || !is_object($pt)) {
171 exit_error(_('Could Not Get ProjectTask'),'pm');
172 } elseif ($pt->isError()) {
173 exit_error($pt->getErrorMessage(),'pm');
176 $saved_hours = $hours;
177 $hours = (float) $hours;
178 if ( $saved_hours !== (string)$hours ) {
179 exit_error(_('Illegal format for hours: must be an integer or a float number.'),'pm');
182 if (!$dependent_on) {
183 $dependent_on=array();
185 $start_date=mktime($start_hour,$start_minute,0,$start_month,$start_day,$start_year);
186 $end_date=mktime($end_hour,$end_minute,0,$end_month,$end_day,$end_year);
187 if (!$pt->update($summary,$details,$priority,$hours,$start_date,$end_date,
188 $status_id,$category_id,$percent_complete,$assigned_to,$pt->convertDependentOn($dependent_on),$new_group_project_id,$duration,$parent_id)) {
189 exit_error('update():: '.$pt->getErrorMessage(),'pm');
191 if (count($rem_artifact_id) > 0) {
192 if (!$pt->removeRelatedArtifacts($rem_artifact_id)) {
193 exit_error('removeRelatedArtifacts():: '.$pt->getErrorMessage(),'pm');
196 $feedback = _('Task Updated Successfully');
197 include $gfwww.'pm/browse_task.php';
203 include $gfwww.'pm/csv.php';
208 include $gfwww.'pm/format_csv.php';
212 case 'downloadcsv': {
213 session_require_perm ('pm', $pg->getID(), 'manager') ;
215 include $gfwww.'pm/downloadcsv.php';
220 session_require_perm ('pm', $pg->getID(), 'manager') ;
222 include $gfwww.'pm/uploadcsv.php';
226 case 'postuploadcsv': {
227 session_require_perm ('pm', $pg->getID(), 'manager') ;
229 include $gfwww.'pm/postuploadcsv.php';
230 include $gfwww.'pm/browse_task.php';
234 case 'massupdate' : {
235 $project_task_id_list = getArrayFromRequest('project_task_id_list');
236 $count=count($project_task_id_list);
238 session_require_perm ('pm', $pg->getID(), 'manager') ;
240 for ($i=0; $i < $count; $i++) {
241 $pt=new ProjectTask($pg,$project_task_id_list[$i]);
242 if (!$pt || !is_object($pt)) {
243 $error_msg .= ' ID: '.$project_task_id_list[$i].'::ProjectTask Could Not Be Created';
244 } elseif ($pt->isError()) {
245 $error_msg .= ' ID: '.$project_task_id_list[$i].'::'.$pt->getErrorMessage();
248 $mass_summary=addslashes(util_unconvert_htmlspecialchars($pt->getSummary()));
250 $mass_priority=(($priority != 100) ? $priority : $pt->getPriority());
251 $mass_hours=$pt->getHours();
252 $mass_start_date=$pt->getStartDate();
253 $mass_end_date=$pt->getEndDate();
254 $mass_status_id=(($status_id != 100) ? $status_id : $pt->getStatusID());
255 $mass_category_id=(($category_id != 100) ? $category_id : $pt->getCategoryID());
256 $mass_percent_complete=$pt->getPercentComplete();
258 //yikes, we want the ability to mass-update to "un-assigned", which is the ID=100, which
259 //conflicts with the "no change" ID! Sorry for messy use of 100.1
260 // 100 means => no change
261 // 100.1 means non assigned
262 // other means assigned to ...
264 if ($assigned_to == '100') {
265 $mass_assigned_to = $pt->getAssignedTo();
266 } elseif ($assigned_to == '100.1') {
267 $mass_assigned_to = array('100');
269 $mass_assigned_to = array($assigned_to);
272 $mass_dependent_on=$pt->getDependentOn();
273 $mass_new_group_project_id=(($new_group_project_id != 100) ? $new_group_project_id : $pt->ProjectGroup->getID() );
274 $mass_duration=$pt->getDuration();
275 $mass_parent_id=$pt->getParentID();
277 if (!$pt->update($mass_summary,$mass_details,$mass_priority,$mass_hours,$mass_start_date,$mass_end_date,
278 $mass_status_id,$mass_category_id,$mass_percent_complete,$mass_assigned_to,$mass_dependent_on,$mass_new_group_project_id,$mass_duration,$mass_parent_id)) {
280 $feedback .= ' ID: '.$project_task_id_list[$i].'::'.$pt->getErrorMessage();
287 $warning_msg = _('No task selected');
289 elseif (isset($was_error) && !$was_error) {
290 $feedback = _('Task Updated Successfully');
292 include $gfwww.'pm/browse_task.php';
297 // Add an artifact relationship to an existing task
299 case 'addartifact' : {
300 session_require_perm ('pm', $pg->getID(), 'manager') ;
302 $add_artifact_id[] = getIntFromRequest('add_artifact_id');
304 $pt = new ProjectTask($pg,$project_task_id);
305 if (!$pt || !is_object($pt)) {
306 exit_error(_('Could Not Get ProjectTask'),'pm');
307 } elseif ($pt->isError()) {
308 exit_error($pt->getErrorMessage(),'pm');
310 if (!$pt->addRelatedArtifacts($add_artifact_id)) {
311 exit_error('addRelatedArtifacts():: '.$pt->getErrorMessage(),'pm');
313 $feedback=_('Successfully Added Tracker Relationship');
314 include $gfwww.'pm/browse_task.php';
323 case 'deletetask' : {
324 session_require_perm ('pm', $pg->getID(), 'manager') ;
326 $pt= new ProjectTask($pg,$project_task_id);
327 if (!$pt || !is_object($pt)) {
328 exit_error(_('Could Not Get ProjectTask'),'pm');
329 } elseif ($pt->isError()) {
330 exit_error($pt->getErrorMessage(),'pm');
332 include $gfwww.'pm/deletetask.php';
337 // Handle the actual delete
340 case 'postdeletetask' : {
341 session_require_perm ('pm', $pg->getID(), 'manager') ;
343 $pt= new ProjectTask($pg, $project_task_id);
344 if (!$pt || !is_object($pt)) {
345 exit_error(_('Could Not Get ProjectTask'),'pm');
346 } elseif ($pt->isError()) {
347 exit_error($pt->getErrorMessage(),'pm');
349 if (!getStringFromRequest('confirm_delete')) {
350 $warning_msg.= _('Confirmation failed. Task not deleted');
352 $deletion = $pt->delete(true);
354 $error_msg .= _('Delete failed')._(': ').$pt->getErrorMessage();
356 $feedback .= _('Task Successfully Deleted');
359 include $gfwww.'pm/browse_task.php';
364 // Show the page surrounding the gantt chart
367 include $gfwww.'pm/ganttpage.php';
372 // View a specific existing task
374 case 'detailtask' : {
375 $pt=new ProjectTaskHTML($pg,$project_task_id);
376 if (!$pt || !is_object($pt)) {
377 exit_error(_('Could Not Get ProjectTask'),'pm');
378 } elseif ($pt->isError()) {
379 exit_error($pt->getErrorMessage(),'pm');
381 if (forge_check_perm ('pm', $pg->getID(), 'manager')) {
382 include $gfwww.'pm/mod_task.php';
384 include $gfwww.'pm/detail_task.php';
390 include $gfwww.'pm/browse_task.php';