3 * SOAP Task Manager Include - this file contains wrapper functions for the SOAP interface
5 * Copyright 2004 (c) GForge, LLC
10 * This file is part of GForge.
12 * GForge is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * GForge is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with GForge; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 US
27 require_once $gfcommon.'include/Error.class.php';
28 require_once $gfcommon.'pm/ProjectGroup.class.php';
29 require_once $gfcommon.'pm/ProjectGroupFactory.class.php';
30 require_once $gfcommon.'pm/ProjectTaskFactory.class.php';
31 require_once $gfcommon.'pm/ProjectTask.class.php';
32 require_once $gfcommon.'pm/ProjectCategory.class.php';
33 //require_once('common/pm/ProjectMessage.class.php');
38 $server->wsdl->addComplexType(
45 'group_project_id' => array('name'=>'group_project_id', 'type' => 'xsd:int'),
46 'group_id' => array('name'=>'group_id', 'type' => 'xsd:int'),
47 'name' => array('name'=>'name', 'type' => 'xsd:string'),
48 'description' => array('name'=>'description', 'type' => 'xsd:string'),
49 'is_public' => array('name'=>'is_public', 'type' => 'xsd:int'),
50 'send_all_posts_to' => array('name'=>'send_all_posts_to', 'type' => 'xsd:string')
54 $server->wsdl->addComplexType(
55 'ArrayOfProjectGroup',
61 array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:ProjectGroup[]')),
67 array('session_ser'=>'xsd:string','group_id'=>'xsd:int'),
68 array('getProjectGroupsResponse'=>'tns:ArrayOfProjectGroup'),
69 $uri,$uri.'#getProjectGroups','rpc','encoded'
73 $server->wsdl->addComplexType(
80 'task_id' => array('name'=>'task_id', 'type' => 'xsd:int'),
81 'link_type' => array('name'=>'link_type', 'type' => 'xsd:string')
85 $server->wsdl->addComplexType(
86 'ArrayOfTaskDependency',
92 array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:TaskDependency[]')),
97 $server->wsdl->addComplexType(
104 'user_id' => array('name'=>'user_id', 'type' => 'xsd:int'),
105 'percent_effort' => array('name'=>'link_type', 'type' => 'xsd:int')
109 $server->wsdl->addComplexType(
110 'ArrayOfTaskAssignee',
116 array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:TaskAssignee[]')),
125 $server->wsdl->addComplexType(
132 'project_task_id' => array('name'=>'project_task_id', 'type' => 'xsd:int'),
133 'group_project_id' => array('name'=>'group_project_id', 'type' => 'xsd:int'),
134 'summary' => array('name'=>'summary', 'type' => 'xsd:string'),
135 'details' => array('name'=>'details', 'type' => 'xsd:string'),
136 'percent_complete' => array('name'=>'percent_complete', 'type' => 'xsd:int'),
137 'priority' => array('name'=>'priority', 'type' => 'xsd:int'),
138 'hours' => array('name'=>'hours', 'type' => 'xsd:int'),
139 'start_date' => array('name'=>'start_date', 'type' => 'xsd:int'),
140 'end_date' => array('name'=>'end_date', 'type' => 'xsd:int'),
141 'status_id' => array('name'=>'status_id', 'type' => 'xsd:int'),
142 'category_id' => array('name'=>'category_id', 'type' => 'xsd:int'),
143 'dependent_on' => array('name'=>'dependent_on', 'type' => 'tns:ArrayOfTaskDependency'),
144 'assigned_to' => array('name'=>'assigned_to', 'type' => 'tns:ArrayOfTaskAssignee'),
145 'duration' => array('name'=>'duration', 'type' => 'xsd:int'),
146 'parent_id' => array('name'=>'parent_id', 'type' => 'xsd:int'),
147 'sort_id' => array('name'=>'sort_id', 'type' => 'xsd:int'),
151 $server->wsdl->addComplexType(
152 'ArrayOfProjectTask',
158 array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:ProjectTask[]')),
166 'session_ser'=>'xsd:string',
167 'group_id'=>'xsd:int',
168 'group_project_id'=>'xsd:int',
169 'assigned_to'=>'xsd:int',
171 'category'=>'xsd:int',
173 array('getProjectTasksResponse'=>'tns:ArrayOfProjectTask'),
174 $uri,$uri.'#getProjectTasks','rpc','encoded'
181 'session_ser'=>'xsd:string',
182 'group_id'=>'xsd:int',
183 'group_project_id'=>'xsd:int',
184 'summary'=>'xsd:string',
185 'details'=>'xsd:string',
186 'priority'=>'xsd:int',
188 'start_date'=>'xsd:int',
189 'end_date'=>'xsd:int',
190 'category_id'=>'xsd:int',
191 'percent_complete'=>'xsd:int',
192 'assigned_to'=>'tns:ArrayOfint',
193 'dependent_on'=>'tns:ArrayOfint',
194 'duration'=>'xsd:int',
195 'parent_id'=>'xsd:int'
197 array('addProjectTaskResponse'=>'xsd:int'),
198 $uri,$uri.'#addProjectTask','rpc','encoded'
205 'session_ser'=>'xsd:string',
206 'group_id'=>'xsd:int',
207 'group_project_id'=>'xsd:int',
208 'project_task_id'=>'xsd:int',
209 'summary'=>'xsd:string',
210 'details'=>'xsd:string',
211 'priority'=>'xsd:int',
213 'start_date'=>'xsd:int',
214 'end_date'=>'xsd:int',
215 'status_id'=>'xsd:int',
216 'category_id'=>'xsd:int',
217 'percent_complete'=>'xsd:int',
218 'assigned_to'=>'tns:ArrayOfint',
219 'dependent_on'=>'tns:ArrayOfint',
220 'new_group_project_id'=>'int',
221 'duration'=>'xsd:int',
222 'parent_id'=>'xsd:int'
224 array('updateProjectTaskResponse'=>'xsd:int'),
225 $uri,$uri.'#updateProjectTask','rpc','encoded'
231 $server->wsdl->addComplexType(
239 'id' => array('name'=>'id', 'type' => 'xsd:int'),
240 'group_project_id' => array('name'=>'group_project_id', 'type' => 'xsd:int'),
241 'category_name' => array('name'=>'category_name', 'type' => 'xsd:string')
243 'category_id' => array('name'=>'category_id', 'type' => 'xsd:int'),
244 'category_name' => array('name'=>'category_name', 'type' => 'xsd:string')
248 $server->wsdl->addComplexType(
249 'ArrayOfProjectCategory',
255 array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:ProjectCategory[]')),
256 'tns:ProjectCategory'
260 'getProjectTaskCategories',
261 array('session_ser'=>'xsd:string','group_id'=>'xsd:int','group_project_id'=>'xsd:int'),
262 array('getProjectTaskCategoriesResponse'=>'tns:ArrayOfProjectCategory'),
263 $uri,$uri.'#getProjectTaskCategories','rpc','encoded'
269 $server->wsdl->addComplexType(
276 'project_message_id' => array('name'=>'project_message_id', 'type' => 'xsd:int'),
277 'project_task_id' => array('name'=>'project_task_id', 'type' => 'xsd:int'),
278 'body' => array('name'=>'body', 'type' => 'xsd:string'),
279 'postdate' => array('name'=>'postdate', 'type' => 'xsd:int'),
280 'posted_by' => array('name'=>'posted_by', 'type' => 'xsd:int')
284 $server->wsdl->addComplexType(
285 'ArrayOfProjectMessage',
291 array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:ProjectMessage[]')),
296 'getProjectMessages',
297 array('session_ser'=>'xsd:string',
298 'group_id'=>'xsd:int',
299 'group_project_id'=>'xsd:int',
300 'project_task_id'=>'xsd:int'
302 array('getProjectMessagesResponse'=>'tns:ArrayOfProjectMessage'),
303 $uri,$uri.'#getProjectMessages','rpc','encoded'
309 array('session_ser'=>'xsd:string',
310 'group_id'=>'xsd:int',
311 'group_project_id'=>'xsd:int',
312 'project_task_id'=>'xsd:int',
315 array('addProjectMessageResponse'=>'xsd:int'),
316 $uri,$uri.'#addProjectMessage','rpc','encoded'
320 // ProjectTaskTechnician
325 'getProjectTechnicians',
326 array('session_ser'=>'xsd:string',
327 'group_id'=>'xsd:int',
328 'group_project_id'=>'xsd:int'),
329 array('getProjectTechniciansResponse'=>'tns:ArrayOfUser'),
330 $uri,$uri.'#getProjectTechnicians','rpc','encoded'
337 function &getProjectGroups($session_ser,$group_id) {
338 continue_session($session_ser);
339 $grp =& group_get_object($group_id);
340 if (!$grp || !is_object($grp)) {
341 return new soap_fault ('','getProjectGroups','Could Not Get Group','Could Not Get Group');
342 } elseif ($grp->isError()) {
343 return new soap_fault ('','getProjectGroups',$grp->getErrorMessage(),$grp->getErrorMessage());
346 $atf = new ProjectGroupFactory($grp);
347 if (!$atf || !is_object($atf)) {
348 return new soap_fault ('','getProjectGroups','Could Not Get ProjectGroupFactory','Could Not Get ProjectGroupFactory');
349 } elseif ($atf->isError()) {
350 return new soap_fault ('','getProjectGroups',$atf->getErrorMessage(),$atf->getErrorMessage());
352 return projectgroups_to_soap($atf->getProjectGroups());
356 // convert array of artifact types to soap data structure
358 function projectgroups_to_soap($pg_arr) {
360 for ($i=0; $i<count($pg_arr); $i++) {
361 if ($pg_arr[$i]->isError()) {
365 'group_project_id'=>$pg_arr[$i]->data_array['group_project_id'],
366 'group_id'=>$pg_arr[$i]->data_array['group_id'],
367 'name'=>$pg_arr[$i]->data_array['project_name'],
368 'description'=>$pg_arr[$i]->data_array['description'],
369 'is_public'=>$pg_arr[$i]->data_array['is_public'],
370 'send_all_posts_to'=>$pg_arr[$i]->data_array['send_all_posts_to']
380 function &addProjectTask($session_ser,$group_id,$group_project_id,$summary,$details,$priority,
381 $hours,$start_date,$end_date,$category_id,$percent_complete,$assigned_arr,$depend_arr,$duration,$parent_id) {
382 continue_session($session_ser);
383 $grp =& group_get_object($group_id);
384 if (!$grp || !is_object($grp)) {
385 return new soap_fault ('','addProjectTask','Could Not Get Group','Could Not Get Group');
386 } elseif ($grp->isError()) {
387 return new soap_fault ('','addProjectTask',$grp->getErrorMessage(),$grp->getErrorMessage());
390 $at = new ProjectGroup($grp,$group_project_id);
391 if (!$at || !is_object($at)) {
392 return new soap_fault ('','addProjectTask','Could Not Get ProjectGroup','Could Not Get ProjectGroup');
393 } elseif ($at->isError()) {
394 return new soap_fault ('','addProjectTask',$at->getErrorMessage(),$at->getErrorMessage());
397 $a = new ProjectTask($at);
398 if (!$a || !is_object($a)) {
399 return new soap_fault ('','addProjectTask','Could Not Get ProjectTask','Could Not Get ProjectTask');
400 } elseif ($a->isError()) {
401 return new soap_fault ('','addProjectTask','$a->getErrorMessage()',$a->getErrorMessage());
404 // transform the $depend_arr (which is an array of ints) to include the link type
405 $depend_map = array();
406 foreach ($depend_arr as $depend_id) {
407 $depend_map[$depend_id] = PM_LINK_DEFAULT;
410 if (!$a->create($summary,$details,$priority,$hours,$start_date,$end_date,
411 $category_id,$percent_complete,$assigned_arr,$depend_map,$duration,$parent_id)) {
412 return new soap_fault ('','addProjectTask',$a->getErrorMessage(),$a->getErrorMessage());
419 // Update ProjectTask
421 function &updateProjectTask($session_ser,$group_id,$group_project_id,$project_task_id,
422 $summary,$details,$priority,$hours,$start_date,$end_date,$status_id,$category_id,
423 $percent_complete,$assigned_arr,$depend_arr,$new_group_project_id,$duration,$parent_id) {
424 continue_session($session_ser);
425 $grp =& group_get_object($group_id);
426 if (!$grp || !is_object($grp)) {
427 return new soap_fault ('','updateProjectTask','Could Not Get Group','Could Not Get Group');
428 } elseif ($grp->isError()) {
429 return new soap_fault ('','updateProjectTask',$grp->getErrorMessage(),$grp->getErrorMessage());
432 $at = new ProjectGroup($grp,$group_project_id);
433 if (!$at || !is_object($at)) {
434 return new soap_fault ('','updateProjectTask','Could Not Get ProjectGroup','Could Not Get ProjectGroup');
435 } elseif ($at->isError()) {
436 return new soap_fault ('','updateProjectTask',$at->getErrorMessage(),$at->getErrorMessage());
439 $a = new ProjectTask($at,$project_task_id);
440 if (!$a || !is_object($a)) {
441 return new soap_fault ('','updateProjectTask','Could Not Get ProjectTask','Could Not Get ProjectTask');
442 } elseif ($a->isError()) {
443 return new soap_fault ('','updateProjectTask',$a->getErrorMessage(),$a->getErrorMessage());
446 // transform the $depend_arr (which is an array of ints) to include the link type
447 $depend_map = array();
448 foreach ($depend_arr as $depend_id) {
449 $depend_map[$depend_id] = PM_LINK_DEFAULT;
452 if (!$a->update($summary,$details,$priority,$hours,$start_date,$end_date,$status_id,$category_id,
453 $percent_complete,$assigned_arr,$depend_map,$new_group_project_id,$duration,$parent_id)) {
454 return new soap_fault ('','updateProjectTask',$a->getErrorMessage(),$a->getErrorMessage());
461 // getProjectTaskCategories
463 function &getProjectTaskCategories($session_ser,$group_id,$group_project_id) {
464 continue_session($session_ser);
465 $grp =& group_get_object($group_id);
466 if (!$grp || !is_object($grp)) {
467 return new soap_fault ('','getProjectTaskCategories','Could Not Get Group','Could Not Get Group');
468 } elseif ($grp->isError()) {
469 return new soap_fault ('','getProjectTaskCategories',$grp->getErrorMessage(),$grp->getErrorMessage());
472 $at = new ProjectGroup($grp,$group_project_id);
473 if (!$at || !is_object($at)) {
474 return new soap_fault ('','getProjectTaskCategories','Could Not Get ProjectGroup','Could Not Get ProjectGroup');
475 } elseif ($at->isError()) {
476 return new soap_fault ('','getProjectTaskCategories',$at->getErrorMessage(),$at->getErrorMessage());
479 $cat_arr = $at->getCategoryObjects();
481 return projectcategories_to_soap($cat_arr);
485 // convert array of artifact categories to soap data structure
487 function projectcategories_to_soap($cat_arr) {
489 for ($i=0; $i<count($cat_arr); $i++) {
490 if ($cat_arr[$i]->isError()) {
494 'category_id'=>$cat_arr[$i]->data_array['category_id'],
495 'category_name'=>$cat_arr[$i]->data_array['category_name']
503 // getProjectTechnicians
505 function &getProjectTechnicians($session_ser,$group_id,$group_project_id) {
506 continue_session($session_ser);
507 $grp =& group_get_object($group_id);
508 if (!$grp || !is_object($grp)) {
509 return new soap_fault ('','getProjectTechnicians','Could Not Get Group','Could Not Get Group');
510 } elseif ($grp->isError()) {
511 return new soap_fault ('','getProjectTechnicians',$grp->getErrorMessage(),$grp->getErrorMessage());
514 $at = new ProjectGroup($grp,$group_project_id);
515 if (!$at || !is_object($at)) {
516 return new soap_fault ('','getProjectTechnicians','Could Not Get ProjectGroup','Could Not Get ProjectGroup');
517 } elseif ($at->isError()) {
518 return new soap_fault ('','getProjectTechnicians',$at->getErrorMessage(),$at->getErrorMessage());
521 return users_to_soap($at->getTechnicianObjects());
524 function &getProjectTasks($session_ser,$group_id,$group_project_id,$assigned_to,$status,$category,$group) {
525 continue_session($session_ser);
526 $grp =& group_get_object($group_id);
527 if (!$grp || !is_object($grp)) {
528 return new soap_fault ('','getProjectTasks','Could Not Get Group','Could Not Get Group');
529 } elseif ($grp->isError()) {
530 return new soap_fault ('','getProjectTasks',$grp->getErrorMessage(),$grp->getErrorMessage());
533 $pg = new ProjectGroup($grp,$group_project_id);
534 if (!$pg || !is_object($pg)) {
535 return new soap_fault ('','getProjectTasks','Could Not Get ProjectGroup','Could Not Get ProjectGroup');
536 } elseif ($pg->isError()) {
537 return new soap_fault ('','getProjectTasks',$pg->getErrorMessage(),$pg->getErrorMessage());
540 $ptf = new ProjectTaskFactory($pg);
541 if (!$ptf || !is_object($ptf)) {
542 return new soap_fault ('','getProjectTasks','Could Not Get ProjectTaskFactory','Could Not Get ProjectTaskFactory');
543 } elseif ($ptf->isError()) {
544 return new soap_fault ('','getProjectTasks',$ptf->getErrorMessage(),$ptf->getErrorMessage());
547 $ptf->setup(0,0,0,0,$assigned_to,$status,$category,$group);
548 $tasks_arr = $ptf->getTasks();
549 return projecttasks_to_soap($tasks_arr);
553 // convert array of projecttasks to soap data structure
555 function projecttasks_to_soap($pt_arr) {
558 for ($i=0; $i<count($pt_arr); $i++) {
559 if ($pt_arr[$i]->isError()) {
562 // create the dependent_on array
563 $dependent_on = array();
564 $dependent_on_tmp = $pt_arr[$i]->getDependentOn();
565 foreach ($dependent_on_tmp as $dependent_on_id => $link_type) {
566 $dependent_on[] = array("task_id" => $dependent_on_id,
567 "link_type" => $link_type);
570 //build the assigned_to array
571 $assigned_to = array();
572 $assigned_ids = $pt_arr[$i]->getAssignedTo();
573 foreach ($assigned_ids as $assigned_id) {
574 $assigned_to[] = array("user_id" => $assigned_id,
575 "percent_effort" => 0 // TODO: This should be implemented
579 $sort_id = $pt_arr[$i]->getExternalID();
580 if (!$sort_id) $sort_id=0;
583 'project_task_id'=>$pt_arr[$i]->data_array['project_task_id'],
584 'group_project_id'=>$pt_arr[$i]->data_array['group_project_id'],
585 'summary'=>$pt_arr[$i]->data_array['summary'],
586 'details'=>$pt_arr[$i]->data_array['details'],
587 'percent_complete'=>$pt_arr[$i]->data_array['percent_complete'],
588 'priority'=>$pt_arr[$i]->data_array['priority'],
589 'hours'=>$pt_arr[$i]->data_array['hours'],
590 'start_date'=>$pt_arr[$i]->data_array['start_date'],
591 'end_date'=>$pt_arr[$i]->data_array['end_date'],
592 'status_id'=>$pt_arr[$i]->data_array['status_id'],
593 'category_id'=>$pt_arr[$i]->data_array['category_id'],
594 'dependent_on'=>$dependent_on,
595 'assigned_to'=>$assigned_to,
596 'duration'=>$pt_arr[$i]->getDuration(),
597 'parent_id'=>$pt_arr[$i]->getParentID(),
606 // getProjectMessages
608 function &getProjectMessages($session_ser,$group_id,$group_project_id,$project_task_id) {
609 continue_session($session_ser);
610 $grp =& group_get_object($group_id);
611 if (!$grp || !is_object($grp)) {
612 return new soap_fault ('','getProjectMessages','Could Not Get Group','Could Not Get Group');
613 } elseif ($grp->isError()) {
614 return new soap_fault ('','getProjectMessages',$grp->getErrorMessage(),$grp->getErrorMessage());
617 $at = new ProjectGroup($grp,$group_project_id);
618 if (!$at || !is_object($at)) {
619 return new soap_fault ('','getProjectMessages','Could Not Get ProjectGroup','Could Not Get ProjectGroup');
620 } elseif ($at->isError()) {
621 return new soap_fault ('','getProjectMessages',$at->getErrorMessage(),$at->getErrorMessage());
624 $a = new ProjectTask($at,$project_task_id);
625 if (!$a || !is_object($a)) {
626 return new soap_fault ('','getProjectMessages','Could Not Get ProjectTask','Could Not Get ProjectTask');
627 } elseif ($a->isError()) {
628 return new soap_fault ('','getProjectMessages',$a->getErrorMessage(),$a->getErrorMessage());
630 return projectmessages_to_soap($a->getMessageObjects());
634 // convert array of project messages to soap data structure
636 function projectmessages_to_soap($at_arr) {
637 for ($i=0; $i<count($at_arr); $i++) {
638 if ($at_arr[$i]->isError()) {
642 'project_message_id'=>$at_arr->data_array['project_message_id'],
643 'project_task_id'=>$at_arr->data_array['project_task_id'],
644 'body'=>$at_arr->data_array['body'],
645 'postdate'=>$at_arr->data_array['postdate'],
646 'posted_by'=>$at_arr->data_array['posted_by']
656 function &addProjectMessage($session_ser,$group_id,$group_project_id,$project_task_id,$body) {
657 continue_session($session_ser);
658 $grp =& group_get_object($group_id);
659 if (!$grp || !is_object($grp)) {
660 return new soap_fault ('','addProjectMessage','Could Not Get Group','Could Not Get Group');
661 } elseif ($grp->isError()) {
662 return new soap_fault ('','addProjectMessage',$grp->getErrorMessage(),$grp->getErrorMessage());
665 $at = new ProjectGroup($grp,$group_project_id);
666 if (!$at || !is_object($at)) {
667 return new soap_fault ('','addProjectMessage','Could Not Get ProjectGroup','Could Not Get ProjectGroup');
668 } elseif ($at->isError()) {
669 return new soap_fault ('','addProjectMessage',$at->getErrorMessage(),$at->getErrorMessage());
672 $a = new ProjectTask($at,$project_task_id);
673 if (!$a || !is_object($a)) {
674 return new soap_fault ('','addProjectMessage','Could Not Get ProjectTask','Could Not Get ProjectTask');
675 } elseif ($a->isError()) {
676 return new soap_fault ('','addProjectMessage',$a->getErrorMessage(),$a->getErrorMessage());
679 $am = new ProjectMessage($a);
680 if (!$am || !is_object($am)) {
681 return new soap_fault ('','addProjectMessage','Could Not Get ProjectMessage','Could Not Get ProjectMessage');
682 } elseif ($am->isError()) {
683 return new soap_fault ('','addProjectMessage',$am->getErrorMessage(),$am->getErrorMessage());
686 if (!$am->create($body)) {
687 return new soap_fault ('','addProjectMessage',$am->getErrorMessage(),$am->getErrorMessage());