diff --git a/ajax/dropdownUsers.php b/ajax/dropdownUsers.php index 40de892..896f169 100644 --- a/ajax/dropdownUsers.php +++ b/ajax/dropdownUsers.php @@ -87,11 +87,6 @@ $count = 0; } //} -if (!function_exists('dpuser_cmp')) { - function dpuser_cmp($a, $b) { - return strcasecmp($a, $b); - } -} $datas = []; diff --git a/ajax/task_users.php b/ajax/task_users.php index e9e5351..e6b9393 100644 --- a/ajax/task_users.php +++ b/ajax/task_users.php @@ -18,31 +18,120 @@ if (!defined('GLPI_ROOT')) { Session::checkLoginUser(); +$commoninputs = "". + "". + "". + "". + "". + "". + "". + "". + ""; + $PM_SOAP = new PluginProcessmakerProcessmaker; // not used in this context, just here to define the type of $PM_SOAP $PM_DB = new PluginProcessmakerDB; $rand = rand(); echo "
"; echo __('Re-assign task to', 'processmaker')." "; -echo ""; -echo ""; -echo ""; -echo ""; -echo ""; -echo ""; -echo ""; -echo ""; +echo ""; +echo ""; +echo $commoninputs; + +$can_unclaim = false; // by default +$query = "SELECT TAS_GROUP_VARIABLE FROM TASK WHERE TAS_UID='".$_REQUEST['taskGuid']."' AND TAS_ASSIGN_TYPE='SELF_SERVICE';"; +$res = $PM_DB->query($query); +if ($PM_DB->numrows($res) > 0) { + $can_unclaim = true; +} PluginProcessmakerUser::dropdown( ['name' => 'users_id_recipient', - 'value' => $_REQUEST['users_id'], - 'used' => [$_REQUEST['users_id']], - 'entity' => 0, //$item->fields["entities_id"], // not used, as any user can be assigned to any tasks - 'entity_sons' => false, // not used, as any user can be assigned to any tasks - 'right' => 'all', - 'rand' => $rand, - 'width' => '', - 'specific_tags' => ['taskGuid' => $_REQUEST['taskGuid']]]); -echo "  "; -echo ""; -Html::closeForm(true); + 'value' => $_REQUEST['users_id'], + 'used' => $_REQUEST['used'], + 'entity' => 0, //$item->fields["entities_id"], // not used, as any user can be assigned to any tasks + 'entity_sons' => false, // not used, as any user can be assigned to any tasks + 'right' => 'all', + 'rand' => $rand, + 'width' => '', + 'specific_tags' => ['taskGuid' => $_REQUEST['taskGuid']] + ]); +echo "  "; +echo ""; +echo ""; + +echo HTML::scriptBlock(" + $(function () { + // Dialog helpers + // Create the dialog with \"Re-assign\" button + function showCommentDlg(title, content, alttext) { + + var dlgContents = { + title: title, + modal: true, + width: 'auto', + height: 'auto', + resizable: false, + close: function (event, ui) { + $(this).dialog('destroy').remove(); + }, + buttons: [{ + text: alttext, + id: 'submit$rand', + disabled: 'disabled', + click: function() { + $('#processmaker_form_task$rand-".$_REQUEST['delIndex']." input[name=comment]').val($('#comment$rand').val()); + //$('#processmaker_form_task$rand-".$_REQUEST['delIndex']."').submit(); + $('input[name=reassign').click(); + $('#submit$rand').button('disable'); + } + }], + show: true, + hide: true + } + $('
').appendTo($('#processmaker_form_task$rand-".$_REQUEST['delIndex']."')); + var locDlg = $('#reassign$rand').html(content + '

Input at least 10 words in English to justify.').dialog(dlgContents); + $('#comment$rand').focus(); + $('#comment$rand').on('keydown keyup', function(e) { + if ($('#comment$rand').val().split(/\W+/).length > 10) { + $('#submit$rand').button('enable'); + } else { + $('#submit$rand').button('disable'); + } + }); + + return locDlg; + }; + + $('input[name=reassign$rand]').click(function (e) { + e.preventDefault(); + if ($('input[name=users_id]').val() == $('input[name=users_id_recipient]').val()) { + // task is already assigned to this user + alert('".__('Task is already assigned to this user or group!', 'processmaker')."', '".__('Re-assign task', 'processmaker')."'); + } else if ($('input[name=users_id_recipient]').val() == 0) { + // un-claim + if (".($can_unclaim ? 1 : 0)." && $('input[name=users_id]').val() != 0) { + showCommentDlg('".__('Un-claim task', 'processmaker')."', + '".__('Please input reason to un-claim
(task will be re-assigned to former group):', 'processmaker')."', + '".__('Un-claim', 'processmaker')."'); + } else { + // task can't be unclaim because it isn't SELF_SERVICE + alert('".__('Can\\\'t un-assign Task!', 'processmaker')."', '".__('Un-claim task', 'processmaker')."'); + } + } else { + showCommentDlg('".__('Re-assign task', 'processmaker')."', + '".__('Please input reason to re-assign:', 'processmaker')."', + '".__('Re-assign', 'processmaker')."'); + } + return false; + }); + }) + "); + + +if (Session::getLoginUserID() != $_REQUEST['users_id']) { + echo "  "; + echo ""; +} + +Html::closeForm(true); diff --git a/front/processmaker.form.php b/front/processmaker.form.php index 5f44cb5..a10c79a 100644 --- a/front/processmaker.form.php +++ b/front/processmaker.form.php @@ -62,7 +62,7 @@ switch ($_POST["action"]) { // Must show it... // $rand = rand( ); - Html::redirect($CFG_GLPI['root_doc']."/plugins/processmaker/front/processmaker.helpdesk.form.php?processes_id=".$_POST['plugin_processmaker_processes_id']."&case_guid=".$resultCase->caseId."&rand=$rand&itilcategories_id=".$_POST["itilcategories_id"]."&type=".$_REQUEST["type"]."&entities_id=".$_REQUEST['entities_id']); + Html::redirect($CFG_GLPI['root_doc']."/plugins/processmaker/front/processmaker.helpdesk.form.php?processes_id=".$_POST['plugin_processmaker_processes_id']."&case_guid=".$resultCase->caseId."&rand=$rand&itilcategories_id=".$_POST["itilcategories_id"]."&type=".$_POST["type"]."&entities_id=".$_POST['entities_id']); } else { Session::addMessageAfterRedirect( PluginProcessmakerProcessmaker::getPMErrorMessage($resultCase->status_code)."
$resultCase->message ($resultCase->status_code)", true, ERROR); @@ -70,94 +70,55 @@ switch ($_POST["action"]) { } } - break; + break; - case 'unpausecase_or_reassign_or_delete' : - if (isset($_POST['unpause'])) { + case 'reassign_reminder' : + if (isset($_POST['reassign'])) { + // here we should re-assign the current task to $_POST['users_id_recipient'] $locCase = new PluginProcessmakerCase; $locCase->getFromDB($_POST['cases_id']); - $pmResultUnpause = $locCase->unpauseCase($_POST['delIndex'], $_POST['users_id']); - if ($pmResultUnpause->status_code == 0) { - Html::back(); - } else { - echo "Error unpausing case: ".$pmResultUnpause->message." \n"; - } - } else if (isset($_POST['reassign'])) { - // here we should re-assign the current task to $_POST['users_id_recipient'] - //$GLPINewPMUserId = PluginProcessmakerUser::getPMUserId( $_POST['users_id_recipient'] ); - if ($_POST['users_id'] != $_POST['users_id_recipient'] && $_POST['users_id_recipient'] != 0) { // normally should be different as of the dropdown prevents already used - $locCase = new PluginProcessmakerCase; - $locCase->getFromDB($_POST['cases_id']); - + if ($_POST['users_id_recipient'] != 0) { + // we are assigning a new tech to a task $pmResponse = $locCase->reassignCase($_POST['delIndex'], $_POST['taskGuid'], $_POST['delThread'], $_POST['users_id'], - $_POST['users_id_recipient']); + $_POST['users_id_recipient'], + ['comment' => $_POST['comment']]); if ($pmResponse) { Session::addMessageAfterRedirect(__('Task re-assigned!', 'processmaker'), true, INFO); } else { Session::addMessageAfterRedirect(__('Error re-assigning task: ', 'processmaker').$pmResponse->message, true, ERROR); } - } else { - if ($_POST['users_id_recipient'] == 0) { - Session::addMessageAfterRedirect(__('Can\'t un-assign Task!', 'processmaker'), true, ERROR); + } elseif ($_POST['users_id_recipient'] == 0) { + // we are unassigning a task, i.e.: task un-claim + $pmResponse = $locCase->unassignCase($_POST['delIndex'], + $_POST['taskGuid'], + $_POST['tasktype'], + $_POST['tasks_id'], + $_POST['itemtype'], + ['comment' => $_POST['comment']]); + if ($pmResponse) { + Session::addMessageAfterRedirect(__('Task un-claimed!', 'processmaker'), true, INFO); } else { - if ($_POST['users_id'] === $_POST['users_id_recipient'] ) { // normally should be different as of the dropdown prevents already used - Session::addMessageAfterRedirect(__('Task already assigned to this person!', 'processmaker'), true, ERROR); - } + Session::addMessageAfterRedirect(__("Can't un-claim task! Verify 'Assignement Rules' in the process definition.", 'processmaker'), true, ERROR); } } - //} else if (isset($_POST['delete'])) { - // // delete case from case table, this will also delete the tasks - // $locCase = new PluginProcessmakerCase; - // if ($locCase->getFromDB($_POST['cases_id']) && $locCase->deleteCase()) { - // // request delete from pm itself - // $PM_SOAP->login(true); + } elseif (isset($_POST['reminder'])) { + // send notification remider as requested for this task - // $resultPM = $PM_SOAP->deleteCase($locCase->fields['case_guid']); + $locCase = new PluginProcessmakerCase; + $locCase->getFromDB($_POST['cases_id']); + $glpi_item = new $_POST['itemtype']; + $glpi_item->getFromDB($_POST['items_id']); + $pm_task = new PluginProcessmakerTask($_POST['tasktype']); + $pm_task->getFromDB($_POST['tasks_id']); + $glpi_task = new $_POST['tasktype']; + $glpi_task->getFromDB($_POST['tasks_id']); - // if ($resultPM->status_code == 0) { - // Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['deleted'], true, INFO); - // } else { - // Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errordeleted'], true, ERROR); - // } - // } else { - // Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errordeleted'], true, ERROR); - // } - //} else if (isset($_POST['cancel'])) { - // // cancel case from PM - // $locCase = new PluginProcessmakerCase; - // $locCase->getFromDB($_POST['cases_id']); - // $resultPM = $PM_SOAP->cancelCase($locCase->fields['case_guid']); //, $_POST['plugin_processmaker_del_index'], $_POST['plugin_processmaker_users_id'] ) ; - // if ($resultPM->status_code === 0) { - // //$locCase = new PluginProcessmakerCase; - // //$locCase->getFromDB($_POST['cases_id']); - // if ($locCase->cancelCase()) { - // Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['cancelled'], true, INFO); - // } else { - // Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errorcancelled'], true, ERROR); - // } - // } else { - // if ($resultPM->status_code == 100 && $locCase->deleteCase()) { // case is draft then delete it - // // request delete from pm itself - // $PM_SOAP->login(true); - - // $resultPM = $PM_SOAP->deleteCase($locCase->fields['case_guid']); - - // if ($resultPM->status_code == 0) { - // Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['deleted'], true, INFO); - // } else { - // Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errordeleted'], true, ERROR); - // } - // } else { - // Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errorcancelled']. " " . $resultPM->message, true, ERROR); - // } - // } + // send notification now! + $pm_task->sendNotification('task_reminder', $glpi_task, $glpi_item, $locCase); } - - break; - } // to return to item diff --git a/front/processmaker.helpdesk.form.php b/front/processmaker.helpdesk.form.php index 9c1e5cc..599bcb3 100644 --- a/front/processmaker.helpdesk.form.php +++ b/front/processmaker.helpdesk.form.php @@ -247,7 +247,7 @@ Html::helpHeader(__('New ticket'), $_SERVER['PHP_SELF'], $_SESSION["glpiname"]); if (isset($_REQUEST['case_guid'])) { $res = $DB->request( 'glpi_plugin_processmaker_cases', [ - ' case_guid'=>$_REQUEST['case_guid'] + 'case_guid'=>$_REQUEST['case_guid'] ]); $query = "SELECT * FROM glpi_plugin_processmaker_cases WHERE case_guid='".$_REQUEST['case_guid']."'"; //$res = $DB->query( $query ); diff --git a/hook.php b/hook.php index 85cad3f..459ccf8 100644 --- a/hook.php +++ b/hook.php @@ -180,7 +180,10 @@ function plugin_pre_item_update_processmaker(CommonITILObject $parm) { * @param mixed $parm is the object */ function plugin_item_update_processmaker_satisfaction($parm) { - + global $PM_SOAP; + if (Session::isCron()) { // Task cron log with user admin + $PM_SOAP->login(true); + } $cases = PluginProcessmakerCase::getIDsFromItem('Ticket', $parm->fields['tickets_id']); foreach ($cases as $cases_id) { $locCase = new PluginProcessmakerCase; @@ -192,6 +195,33 @@ function plugin_item_update_processmaker_satisfaction($parm) { } +/** + * Summary of plugin_item_update_processmaker_user + * When a user login is changed, then must change it in the PM tables + * @param User $param is the user being changed + */ +function plugin_item_update_processmaker_user(User $param) { + // Must test if user login has been changed + // if yes, must change the login in the PM tables: + // USERS and RBAC_USERS, othewise the link in the processmaker_users table will be invalid + if (in_array('name', $param->updates)) { + // check if user is in the processmaker_user table + $pm_user = PluginProcessmakerUser::getPMUserId($param->getID()); + if ($pm_user) { + // must update the user in PM tables + global $PM_SOAP; + if ($param->fields['is_active'] == 0 || $param->fields['is_deleted'] == 1) { + $status = "INACTIVE"; + } else { + $status = "ACTIVE"; + } + $PM_SOAP->login(true); + $pmResult = $PM_SOAP->updateUser( $pm_user, $param->fields['name'], $param->fields['firstname'], $param->fields['realname'], $status ); + } + } +} + + function plugin_processmaker_post_init() { global $PM_DB, $PM_SOAP; if (!isset($PM_DB)) { @@ -241,10 +271,11 @@ function plugin_item_update_processmaker_tasks($parm) { $locCase->getFromDB($pmTask->fields['plugin_processmaker_cases_id']); $srccase_guid = $locCase->fields['case_guid']; - $msg = ' $locCase: '.str_replace("\n", "\n ", print_r($locCase, true))."\n"; - $msg .= ' $task: '.str_replace("\n", "\n ", print_r($parm, true))."\n"; - $msg .= ' $pmTask: '.str_replace("\n", "\n ", print_r($pmTask, true))."\n"; - $msg .= "\n"; + //$msg = Toolbox::backtrace(false); + //$msg .= ' $locCase: '.str_replace("\n", "\n ", print_r($locCase, true))."\n"; + //$msg .= ' $task: '.str_replace("\n", "\n ", print_r($parm, true))."\n"; + //$msg .= ' $pmTask: '.str_replace("\n", "\n ", print_r($pmTask, true))."\n"; + //$msg .= "\n"; foreach ($DB->request( 'glpi_plugin_processmaker_caselinks', "is_active = 1 AND sourcetask_guid='".$pmTaskCat->fields['pm_task_guid']."'") as $targetTask) { @@ -289,17 +320,17 @@ function plugin_item_update_processmaker_tasks($parm) { unset( $infoForTasks[ $casevar ] ); } - $msg .= " ***********\n"; - $msg .= ' $targetTask: '.str_replace("\n", "\n ", print_r($targetTask, true))."\n"; + //$msg .= " ***********\n"; + //$msg .= ' $targetTask: '.str_replace("\n", "\n ", print_r($targetTask, true))."\n"; $targetTask['sourcecondition'] = str_replace( array_keys($infoForTasks), $infoForTasks, $targetTask['sourcecondition'] ); $eval = eval( "return (".$targetTask['sourcecondition']." ? 1 : 0);" ); - $msg .= ' $infoForTasks: '.str_replace("\n", "\n ", print_r($infoForTasks, true))."\n"; - $msg .= ' $targetTask[\'sourcecondition\']: '.str_replace("\n", "\n ", print_r($targetTask['sourcecondition'], true))."\n"; - $msg .= ' $result: '."$eval\n"; - $msg .= "\n"; + //$msg .= ' $infoForTasks: '.str_replace("\n", "\n ", print_r($infoForTasks, true))."\n"; + //$msg .= ' $targetTask[\'sourcecondition\']: '.str_replace("\n", "\n ", print_r($targetTask['sourcecondition'], true))."\n"; + //$msg .= ' $result: '."$eval\n"; + //$msg .= "\n"; if ($eval) { // look at each linked ticket if a case is attached and then if a task like $val is TO_DO @@ -375,15 +406,22 @@ function plugin_item_update_processmaker_tasks($parm) { curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Content-Length: ' . strlen($externalapplicationparams), 'Expect:']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($ch, CURLOPT_VERBOSE, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $pmconfig->fields['ssl_verify']); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $pmconfig->fields['ssl_verify']); - //curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1 ) ; - //curl_setopt($ch, CURLOPT_PROXY, "localhost:8889"); + if (isset($externalapplication['ssl_verify'])) { + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $externalapplication['ssl_verify']); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $externalapplication['ssl_verify']); + } + + if (isset($externalapplication['proxy'])) { + curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1 ) ; + curl_setopt($ch, CURLOPT_PROXY, $externalapplication['proxy']); + } $response = curl_exec ($ch); - - //Toolbox::logDebug( $response ) ; + if ($response === false) { + //throw new Exception(curl_error($ch), curl_errno($ch)); + Toolbox::logDebug( curl_error($ch).":".curl_errno($ch) ); + } curl_close ($ch); } @@ -429,8 +467,8 @@ function plugin_item_update_processmaker_tasks($parm) { } - $msg .= "================\n"; - Toolbox::logInFile("processmaker", $msg); + //$msg .= "================\n"; + //Toolbox::logInFile("processmaker", $msg); } } diff --git a/inc/case.class.php b/inc/case.class.php index 1a9677d..80f886f 100644 --- a/inc/case.class.php +++ b/inc/case.class.php @@ -14,6 +14,8 @@ class PluginProcessmakerCase extends CommonDBTM { //static public $items_id = 'items_id'; // Field name static $rightname = 'plugin_processmaker_case'; + private $process = null; + const DRAFT = 'DRAFT'; const TO_DO = 'TO_DO'; const COMPLETED = 'COMPLETED'; @@ -221,6 +223,123 @@ class PluginProcessmakerCase extends CommonDBTM { } + /** + * Summary of unassignCase + * Will unassign the delIndex task, restoring the assigned group + * @param $delIndex int the delegation index + * @param $taskGuid string the GUID of the task + * @param $tasktype string the type of task (TicketTask, ChangeTask, ProblemTask) + * @param $tasks_id int the id of the task + * @param $itemtype string the type of the ITIL object (Ticket, Change, Problem) + * @return bool + */ + function unassignCase($delIndex, $taskGuid, $tasktype, $tasks_id, $itemtype, $options) { + global $PM_DB, $PM_SOAP, $DB; + + // un-claim task + // will unclaim the task + // to unclaim a task, we must un-assign the task in the APP_DELEGATION table + // and un-assign the task in glpi_itemtypeTask table + $groupname = ''; + + // should get the group that is assigned to the task in SELF_SERVICE assign type + $query = "SELECT TAS_GROUP_VARIABLE FROM TASK WHERE TAS_UID='".$taskGuid."' AND TAS_ASSIGN_TYPE='SELF_SERVICE' LIMIT 1;"; + foreach($PM_DB->request($query) as $pmGroup) { + // should have only one record + if ($pmGroup['TAS_GROUP_VARIABLE'] == '') { + // then we are in the self-service with a group in the TASK_USER table + // TU_RELATION=2 is groups and TU_TYPE=1 means normal (= not adhoc) + // then get the group name from the CONTENT table + $query = "SELECT CONTENT.CON_VALUE FROM TASK_USER + JOIN CONTENT ON CONTENT.CON_ID=TASK_USER.USR_UID AND CONTENT.CON_CATEGORY='GRP_TITLE' AND CONTENT.CON_LANG = 'en' + WHERE TASK_USER.TAS_UID='".$taskGuid."' AND TASK_USER.TU_RELATION=2 AND TASK_USER.TU_TYPE=1 LIMIT 1;"; + + foreach ($PM_DB->request($query) as $onlyrec) { + $groupname = $onlyrec['CON_VALUE']; + } + + + } else { + // then we are in the self-service with a case variable that contains either a group either an array of users + // array of users is not yet supported by PM plugin, as GLPI tasks have one and only one users_id_tech. + // group guid (in the case variable) must be retrieved from APP DATA + + // TODO + //////////////////////////////////////////////////////////////// + // Currently this case is not manageable by GLPI + // as GLPI needs at least a user or a group to be assigned to a task + // and when using the self-service value based assignment, there + // is a case variable that contains a list of users. This list of users cannot be mapped to a group in GLI + // OR may be we may create an artificial group in GLPI that would contains the list of users + //////////////////////////////////////////////////////////////// + + // and then we get the name of the group from the CONTENT table + //$query = "SELECT CON_VALUE FROM CONTENT + // WHERE CONTENT.CON_ID='$groupId' AND CONTENT.CON_CATEGORY='GRP_TITLE' AND CONTENT.CON_LANG='en' ;"; + + } + } + + $groups_id_tech = PluginProcessmakerProcessmaker::getGLPIGroupId($groupname); + + if ($groups_id_tech) { + // unclaim the case only when a GLPI group can be found + + $query = "UPDATE APP_DELEGATION SET USR_UID='', DEL_INIT_DATE=NULL, USR_ID=0 WHERE APP_NUMBER=".$this->getID()." AND DEL_INDEX=$delIndex;"; + $PM_DB->query($query); + + $glpi_task = new $tasktype; + $glpi_task->getFromDB($tasks_id); + $foreignkey = getForeignKeyFieldForItemType( $itemtype ); + + $donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState(false); // do not send notification yet + $glpi_task->update( ['id' => $glpi_task->getID(), + $foreignkey => $glpi_task->fields[$foreignkey], + 'users_id_tech' => 0, + 'groups_id_tech' => $groups_id_tech, + 'update' => true] ); + PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif); + + // send notification now! + $pm_task = new PluginProcessmakerTask($tasktype); + $pm_task->getFromDB($tasks_id); + $glpi_item = new $itemtype; + $glpi_item->getFromDB($glpi_task->fields[$foreignkey]); + $pm_task->sendNotification('task_unclaim', $glpi_task, $glpi_item, $this); + + // create an information task and add comment + $pm_process = $this->getProcess(); + $dbu = new DbUtils; + $info = __('Task un-claimed!
Case: %s
Task: "%s" has been un-assigned from "%s" and assigned to "%s" group.
Reason: %s', 'processmaker'); + $info .= ""; + $taskCat = new TaskCategory; + $taskCat->getFromDB( $glpi_task->fields['taskcategories_id'] ); + $info = sprintf($info, + $this->getNameID(['forceid' => true]), + DropdownTranslation::getTranslatedValue($glpi_task->fields['taskcategories_id'], 'TaskCategory', 'name', $_SESSION['glpilanguage'], $taskCat->fields['name']), + Html::clean($dbu->getUserName(isset($glpi_task->oldvalues['users_id_tech']) ? $glpi_task->oldvalues['users_id_tech'] : 0)), + Html::clean($groupname), + $options['comment'] + ); + // unescape some chars and replace CRLF, CR or LF by
+ $info = str_replace(["\\'", '\\"', '\r\n', '\r', '\n'], ["'", '"', '
', '
', '
'], $info); + + $glpi_task->add([$foreignkey => $glpi_task->fields[$foreignkey], + 'is_private' => 0, // a post-only user can't create private task + 'taskcategories_id' => $pm_process->fields['taskcategories_id'], + 'content' => $DB->escape($info), + 'users_id' => $PM_SOAP->taskWriter, + 'state' => Planning::INFO, + 'users_id_tech' => Session::getLoginUserID(), + ]); + + return true; + } + + return false; + } + + /** * Summary of reassignCase * @param mixed $delIndex @@ -230,7 +349,7 @@ class PluginProcessmakerCase extends CommonDBTM { * @param mixed $users_id_target * @return mixed */ - function reassignCase($delIndex, $taskGuid, $delThread, $users_id_source, $users_id_target) { + function reassignCase($delIndex, $taskGuid, $delThread, $users_id_source, $users_id_target, $options) { global $PM_SOAP; $users_guid_source = ''; // by default if ($users_id_source !== 0) { // when task is not 'to be claimed' @@ -253,7 +372,7 @@ class PluginProcessmakerCase extends CommonDBTM { break; } } - $this->reassignTask($delIndex, $newDelIndex, $delThread, $newDelThread, $users_id_target ); + $this->reassignTask($delIndex, $newDelIndex, $delThread, $newDelThread, $users_id_target, $options); return true; } return false; @@ -266,15 +385,15 @@ class PluginProcessmakerCase extends CommonDBTM { * @param mixed $newDelIndex * @param mixed $newTech */ - public function reassignTask ($delIndex, $newDelIndex, $delThread, $newDelThread, $newTech) { - global $DB; + public function reassignTask ($delIndex, $newDelIndex, $delThread, $newDelThread, $newTech, $options) { + global $DB, $PM_SOAP; $dbu = new DbUtils; $pm_task_row = $dbu->getAllDataFromTable(PluginProcessmakerTask::getTable(), ['plugin_processmaker_cases_id' => $this->getID(), 'del_index' => $delIndex, 'del_thread' => $delThread]); if ($pm_task_row && count($pm_task_row) == 1) { $pm_task_row = array_shift($pm_task_row); $glpi_task = new $pm_task_row['itemtype']; - $glpi_task->getFromDB( $pm_task_row['items_id'] ); + $glpi_task->getFromDB($pm_task_row['items_id']); $itilobject_itemtype = $this->fields['itemtype']; $foreignkey = getForeignKeyFieldForItemType( $itilobject_itemtype ); @@ -289,37 +408,7 @@ class PluginProcessmakerCase extends CommonDBTM { 'update' => true] ); PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif); - // Notification management - // search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id'] - $res = PluginProcessmakerNotificationTargetTask::getNotifications('task_update', $glpi_task->fields['taskcategories_id'], $this->fields['entities_id']); - if ($res['notifications'] && count($res['notifications']) > 0) { - $pm_task = new PluginProcessmakerTask($pm_task_row['itemtype']); - $pm_task->getFromDB($pm_task_row['items_id']); - NotificationEvent::raiseEvent($res['event'], - $pm_task, - ['plugin_processmaker_cases_id' => $this->getID(), - 'itemtype' => $pm_task_row['itemtype'], - 'task_id' => $glpi_task->getID(), - 'old_users_id_tech' => $glpi_task->oldvalues['users_id_tech'], - 'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0, - 'entities_id' => $this->fields['entities_id'], - 'case' => $this - ]); - } else { - $item = new $itilobject_itemtype; - $item->getFromDB($glpi_task->fields[$foreignkey]); - NotificationEvent::raiseEvent('update_task', - $item, - ['plugin_processmaker_cases_id' => $this->getID(), - 'itemtype' => $pm_task_row['itemtype'], - 'task_id' => $glpi_task->getID(), - 'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0 - ]); - } - // then update the delIndex and delThread - //$query = "UPDATE glpi_plugin_processmaker_tasks SET del_index = $newDelIndex, del_thread = $newDelThread WHERE id={$row['id']}; "; - //$res = $DB->query($query); $DB->Update( 'glpi_plugin_processmaker_tasks', [ 'del_index' => $newDelIndex, 'del_thread' => $newDelThread @@ -327,10 +416,69 @@ class PluginProcessmakerCase extends CommonDBTM { 'id' => $pm_task_row['id'] ] ); + + // send notification now! + $pm_task = new PluginProcessmakerTask($pm_task_row['itemtype']); + $pm_task->getFromDB($pm_task_row['items_id']); + $glpi_item = new $itilobject_itemtype; + $glpi_item->getFromDB($glpi_task->fields[$foreignkey]); + $pm_task->sendNotification('task_reassign', $glpi_task, $glpi_item, $this); + + // create an information task and add comment + $pm_process = $this->getProcess(); + $old_users_tech_id = isset($glpi_task->oldvalues['users_id_tech']) ? $glpi_task->oldvalues['users_id_tech'] : 0; + $taskCat = new TaskCategory; + $taskCat->getFromDB( $glpi_task->fields['taskcategories_id'] ); + $task_name = DropdownTranslation::getTranslatedValue($glpi_task->fields['taskcategories_id'], 'TaskCategory', 'name', $_SESSION['glpilanguage'], $taskCat->fields['name']); + $new_tech_name = Html::clean($dbu->getUserName($newTech)); + if ($old_users_tech_id) { + $info = __('Task re-assigned!
Case: %s
Task: "%s" has been re-assigned from "%s" to "%s".
Reason: %s', 'processmaker'); + $info = sprintf($info, + $this->getNameID(['forceid' => true]), + $task_name, + Html::clean($dbu->getUserName(isset($glpi_task->oldvalues['users_id_tech']) ? $glpi_task->oldvalues['users_id_tech'] : 0)), + $new_tech_name, + $options['comment'] + ); + } else { + $info = __('Task assigned!
Case: %s
Task: "%s" has been assigned to "%s".
Reason: %s', 'processmaker'); + $info = sprintf($info, + $this->getNameID(['forceid' => true]), + $task_name, + $new_tech_name, + $options['comment'] + ); + } + $info .= ""; + + // unescape some chars and replace CRLF, CR or LF by
+ $info = str_replace(["\\'", '\\"', '\r\n', '\r', '\n'], ["'", '"', '
', '
', '
'], $info); + + $glpi_task->add([$foreignkey => $glpi_task->fields[$foreignkey], + 'is_private' => 0, // a post-only user can't create private task + 'taskcategories_id' => $pm_process->fields['taskcategories_id'], + 'content' => $DB->escape($info), + 'users_id' => $PM_SOAP->taskWriter, + 'state' => Planning::INFO, + 'users_id_tech' => Session::getLoginUserID(), + ]); } } + /** + * Summary of getProcess + * Returns process object + * @return bool|PluginProcessmakerProcess + */ + function getProcess() { + $pm_process = new PluginProcessmakerProcess; + if (!$this->process && $pm_process->getFromDB($this->fields['plugin_processmaker_processes_id'])) { + $this->process = $pm_process; + } + return $this->process; + } + /** * Summary of showCaseProperties */ @@ -721,16 +869,13 @@ class PluginProcessmakerCase extends CommonDBTM { echo ""; echo __('Select the process you want to add', 'processmaker'); echo ""; - $condition[] = ['is_active' => 1]; - if ($itemtype == 'Ticket') { - $condition[] = ['is_incident' => 1]; - //$is_itemtype = "AND is_incident=1"; - if ($item->fields['type'] == Ticket::DEMAND_TYPE) { - $condition[] = ['is_request' => 1]; - //$is_itemtype = "AND is_request=1"; - } + $condition['is_active'] = 1; + if ($itemtype == 'Ticket' && $item->fields['type'] == Ticket::INCIDENT_TYPE) { + $condition['is_incident'] = 1; + } else if ($itemtype == 'Ticket' && $item->fields['type'] == Ticket::DEMAND_TYPE) { + $condition['is_request'] = 1; } else { - $condition[] = ['is_'.strtolower($itemtype) => 1]; + $condition['is_'.strtolower($itemtype)] = 1; //$is_itemtype = "AND is_".strtolower($itemtype)."=1"; } PluginProcessmakerProcess::dropdown(['value' => 0, diff --git a/inc/caselink.class.php b/inc/caselink.class.php index a7e011a..5f13fe1 100644 --- a/inc/caselink.class.php +++ b/inc/caselink.class.php @@ -271,4 +271,15 @@ class PluginProcessmakerCaselink extends CommonDBTM { return $tab; } + + function prepareInputForUpdate($input) { + return Toolbox::unclean_cross_side_scripting_deep($input); + } + + + function prepareInputForAdd($input) { + return Toolbox::unclean_cross_side_scripting_deep($input); + } + + } diff --git a/inc/config.class.php b/inc/config.class.php index 0caee15..31ce71d 100644 --- a/inc/config.class.php +++ b/inc/config.class.php @@ -156,7 +156,7 @@ class PluginProcessmakerConfig extends CommonDBTM { if (!$config->fields['maintenance']) { echo ""; - echo "".__('Server URL (must be in same domain than GLPI)', 'processmaker').""; + echo "".__('Server URL (must be in same domain than GLPI, if GLPI is using HTTPS, PM server must also use HTTPS)', 'processmaker').""; echo ""; echo "\n"; diff --git a/inc/notificationtargetprocessmaker.class.php b/inc/notificationtargetprocessmaker.class.php index 8179c1a..cb11f33 100644 --- a/inc/notificationtargetprocessmaker.class.php +++ b/inc/notificationtargetprocessmaker.class.php @@ -4,13 +4,18 @@ * PluginProcessmakerNotificationTargetProcessmaker short summary. * * PluginProcessmakerNotificationTargetProcessmaker description. - * + * * Common notificationtarget class for cases and tasks * * @version 1.0 * @author MoronO */ -class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarget { +class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTargetCommonITILObject { + + const PM_USER_TYPE = 1000; + + const OLD_TASK_TECH_IN_CHARGE = 1; + /** * Summary of saveNotificationState @@ -58,11 +63,16 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge 'case.id' => __('Case id', 'processmaker'), 'case.title' => __('Case title', 'processmaker'), 'case.description' => __('Case description', 'processmaker'), - 'case.url' => __('URL'), + 'case.url' => __('Case URL'), 'var.XXX' => __('Case variable \'XXX\'', 'processmaker'), 'array.YYY' => __('List of values in \'YYY\' array', 'processmaker'), 'array.numberofYYY' => __('Number of rows in \'YYY\' array', 'processmaker'), - 'array.YYY.colname' => __('Value for colname in case array \'YYY\'', 'processamker') + 'array.YYY.colname' => __('Value for colname in \'YYY\' array', 'processmaker'), + '1darray.ZZZ.key' => __('Value for key in \'ZZZ\' assoc array (1-dimension array)', 'processmaker'), + 'item.type' => __('Item type', 'processmaker'), + 'item.id' => __('Item id', 'processmaker'), + 'item.url' => __('Item URL', 'processmaker'), + 'item.title' => __('Item title', 'processmaker') ]; foreach ($tags as $tag => $label) { @@ -76,6 +86,9 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge $elt['allowed_values'] = [__('YYY is to be replaced by any array variables', 'processmaker')]; $elt['foreach'] = true; } + if ($tag == '1darray.ZZZ.key') { + $elt['allowed_values'] = [__('ZZZ is to be replaced by any assoc array variables (1-dimension array with key/value pairs)', 'processmaker')]; + } $this->addTagToList($elt); } @@ -87,7 +100,7 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge * Get all data needed for template processing **/ public function addDataForTemplate($event, $options = []) { - global $PM_DB, $CFG_GLPI; + global $CFG_GLPI, $PM_DB; $excluded = ['_VAR_CHANGED_', 'PIN', @@ -107,11 +120,6 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge $process->getFromDB($options['case']->fields['plugin_processmaker_processes_id']); $taskcat_id = $process->fields['taskcategories_id']; - // set defaults to all - foreach ($this->tags as $key => $val) { - $this->data["##$key##"] = "-"; - } - // get case variable values $res = $PM_DB->query("SELECT APP_DATA, APP_TITLE, APP_DESCRIPTION FROM APPLICATION WHERE APP_NUMBER = ".$options['case']->fields['id']); if ($res && $PM_DB->numrows($res) == 1) { @@ -125,10 +133,16 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge // add numberof for count of rows $this->data["##array.numberof$key##"] = count($val); // get the keys/vals of the sub-array - foreach ($val as $row) { - foreach ($row as $col_name => $col_val) { - $this->data["array.$key"][]["##array.$key.$col_name##"] = $col_val; - $this->data["##lang.array.$key.$col_name##"] = $col_name; + foreach ($val as $attribute => $row) { + if (is_array($row)) { + $index = isset($this->data["array.$key"]) ? count($this->data["array.$key"]) : 0; + foreach ($row as $col_name => $col_val) { + $this->data["array.$key"][$index]["##array.$key.$col_name##"] = $col_val; + $this->data["##lang.array.$key.$col_name##"] = $col_name; + } + } else { + $this->data["1darray.$key"]["##array.$key.$attribute##"] = $row; + $this->data["##lang.1darray.$key.$attribute##"] = $attribute; } } } else { @@ -145,18 +159,29 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge $this->data['##case.id##'] = $options['case']->fields['id']; // case URL - $this->data['##case.url##'] = $CFG_GLPI["url_base"]."/index.php?redirect=".urlencode("/plugins/processmaker/front/case.form.php?id=".$options['case']->fields['id']); - + $this->data['##case.url##'] = $this->formatURL($options['additionnaloption']['usertype'], + urlencode(urlencode($CFG_GLPI["url_base"] . + PluginProcessmakerCase::getFormURLWithID($options['case']->fields['id'], false)))); // parent task information: meta data on process // will get parent of task which is the process task category - $tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'name'); - $tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'comment'); + $tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'name'); + $tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'comment'); // process title $this->data['##process.categoryid##'] = $taskcat_id; $this->data['##process.category##'] = $tmp_taskcatinfo['name']; $this->data['##process.categorycomment##'] = $tmp_taskcatinfo['comment']; - // add labels + // add information about item that hosts the case + $item = new $options['case']->fields['itemtype']; + $item->getFromDB($options['case']->fields['items_id']); + $this->data['##item.type##'] = $item->getTypeName(1); + $this->data['##item.id##'] = sprintf("%07d", $options['case']->fields['items_id']); // to have items_id with 7 digits with leading 0 + $this->data['##item.url##'] = $this->formatURL($options['additionnaloption']['usertype'], + urlencode(urlencode($CFG_GLPI["url_base"] . + $item::getFormURLWithID($options['case']->fields['items_id'], false)))); + $this->data['##item.title##'] = HTML::entities_deep($item->fields['name']); + + // add labels to tags that are not set $this->getTags(); foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) { if (!isset($this->data[$tag])) { @@ -165,4 +190,36 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge } } + + /** + * Get header to add to content + **/ + function getContentHeader() { + + if ($this->getMode() == \Notification_NotificationTemplate::MODE_MAIL + && MailCollector::getNumberOfActiveMailCollectors() + ) { + return NotificationTargetTicket::HEADERTAG.' '.__('To answer by email, write above this line').' '. + NotificationTargetTicket::HEADERTAG; + } + + return ''; + } + + + /** + * Get footer to add to content + **/ + function getContentFooter() { + + if ($this->getMode() == \Notification_NotificationTemplate::MODE_MAIL + && MailCollector::getNumberOfActiveMailCollectors() + ) { + return NotificationTargetTicket::FOOTERTAG.' '.__('To answer by email, write under this line').' '. + NotificationTargetTicket::FOOTERTAG; + } + + return ''; + } + } \ No newline at end of file diff --git a/inc/notificationtargettask.class.php b/inc/notificationtargettask.class.php index 3932b1c..1deff80 100644 --- a/inc/notificationtargettask.class.php +++ b/inc/notificationtargettask.class.php @@ -12,17 +12,33 @@ if (!defined('GLPI_ROOT')) { // Class NotificationTarget class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotificationTargetProcessmaker { + /** * Summary of getDefaultEvents * @return array[] */ private static function getDefaultEvents() { - return ['task_add' => ['event' => 'task_add_', 'label' => __('New task')], - 'task_update' => ['event' => 'task_update_', 'label' => __('Update of a task')] + return ['task_add' => ['event' => 'task_add_', 'label' => __('Task add'), 'glpi' => 'add_task'], + 'task_reassign' => ['event' => 'task_reassign_', 'label' => __('Task re-assign'), 'glpi' => 'update_task'], + 'task_unclaim' => ['event' => 'task_unclaim_', 'label' => __('Task un-claim'), 'glpi' => 'update_task'], + 'task_done' => ['event' => 'task_done_', 'label' => __('Task done'), 'glpi' => 'update_task'], + 'task_reminder' => ['event' => 'task_reminder_', 'label' => __('Task reminder'), 'glpi' => 'update_task'] ]; } + /** + * Summary of getDefaultGLPIEvents + * Will return the GLPI default task event matching a self type + * @param string $type + * @return string + */ + static function getDefaultGLPIEvents($type) { + $events = self::getDefaultEvents(); + return $events[$type]['glpi']; + } + + /** * Summary of getNotification * @param mixed $evt @@ -53,9 +69,7 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific $table = PluginProcessmakerTaskCategory::getTable(); $ptable = PluginProcessmakerProcess::getTable(); $query = "SELECT $table.taskcategories_id AS taskcat, $ptable.taskcategories_id AS ptaskcat FROM $table - LEFT JOIN $ptable ON $ptable.id=$table.plugin_processmaker_processes_id - WHERE $table.is_active = 1 - AND $ptable.is_active = 1"; + LEFT JOIN $ptable ON $ptable.id=$table.plugin_processmaker_processes_id"; $ptaskcats = []; $temp = new TaskCategory; @@ -66,8 +80,9 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific } $temp->getFromDB($row['taskcat']); - $actions[$defaultEvents['task_add']['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $defaultEvents['task_add']['label']; - $actions[$defaultEvents['task_update']['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $defaultEvents['task_update']['label']; + foreach($defaultEvents as $events) { + $actions[$events['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $events['label']; + } } return $actions; @@ -80,7 +95,7 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific public function addDataForTemplate($event, $options = []) { global $PM_DB, $CFG_GLPI; - if (!isset($options['case'])) { + if (!isset($options['case']) || $options['case'] == null) { $mycase = new PluginProcessmakerCase; $mycase->getFromDB($options['plugin_processmaker_cases_id']); $options['case'] = $mycase; @@ -92,12 +107,12 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific $baseevent = $locevent[0].'_'.$locevent[1]; $taskcat_id = $locevent[2]; - // task action: add or update + // task action: add, update or done $this->data['##task.action##'] = $events[$baseevent]['label']; // task category information: meta data on task - $tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'name'); - $tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'comment'); + $tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'name'); + $tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'comment'); $this->data['##task.categoryid##'] = $taskcat_id; $this->data['##task.category##'] = $tmp_taskcatinfo['name']; $this->data['##task.categorycomment##'] = $tmp_taskcatinfo['comment']; @@ -131,7 +146,21 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific $this->data['##task.lastupdater##'] = Html::clean($dbu->getUserName($taskobj->fields['users_id_editor'])); // task technician - $this->data['##task.user##'] = Html::clean($dbu->getUserName($taskobj->fields['users_id_tech'])); + $this->data['##task.user##'] = ''; + $this->data['##task.user.login##'] = ''; // by default + $tech = new User; + if ($taskobj->fields['users_id_tech'] > 0 + && $tech->getFromDB($taskobj->fields['users_id_tech'])) { + $this->data['##task.user##'] = Html::clean($dbu->getUserName($taskobj->fields['users_id_tech'])); + $this->data['##task.user.login##'] = $tech->fields['name']; + } + $oldtech = new User; + if (isset($options['old_users_id_tech']) + && $options['old_users_id_tech'] > 0 + && $oldtech->getFromDB($options['old_users_id_tech'])) { + $this->data['##task.former.user##'] = Html::clean($dbu->getUserName($options['old_users_id_tech'])); + $this->data['##task.former.user.login##'] = $oldtech->fields['name']; + } // task group technician $this->data['##task.group##'] = Html::clean(Toolbox::clean_cross_side_scripting_deep(Dropdown::getDropdownName("glpi_groups", $taskobj->fields['groups_id_tech'])), true, 2, false); @@ -146,7 +175,7 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific // task duration $this->data['##task.time##'] = Html::timestampToString($taskobj->fields['actiontime'], false); - // add labels + // add labels to tags that are not set $this->getTags(); foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) { if (!isset($this->data[$tag])) { @@ -173,6 +202,9 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific 'task.categorycomment' => __('Category comment'), 'task.time' => __('Total duration'), 'task.user' => __('User assigned to task'), + 'task.user.login' => __('User login assigned to task'), + 'task.former.user' => __('Former user assigned to task'), + 'task.former.user.login' => __('Former user login assigned to task'), 'task.group' => __('Group assigned to task'), 'task.begin' => __('Start date'), 'task.end' => __('End date'), @@ -201,6 +233,11 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific $this->addTarget(Notification::TASK_ASSIGN_TECH, __('Technician in charge of the task')); $this->addTarget(Notification::TASK_ASSIGN_GROUP, __('Group in charge of the task')); + $this->addTarget(Notification::OBSERVER_GROUP, __('Watcher group')); + $this->addTarget(Notification::OBSERVER, __('Watcher')); + + $this->addTarget(Notification::AUTHOR, __('Requester'), PluginProcessmakerNotificationTargetProcessmaker::PM_USER_TYPE); + if (strpos($event, 'task_update_') === 0) { $this->addTarget(Notification::OLD_TECH_IN_CHARGE, __('Former technician in charge of the task')); @@ -216,12 +253,35 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific */ function addSpecificTargets($data, $options) { - //Look for all targets whose type is Notification::ITEM_USER + $obj = $this->obj; + $this->obj = $options['obj']; + switch ($data['type']) { + case PluginProcessmakerNotificationTargetProcessmaker::PM_USER_TYPE : + + switch ($data['items_id']) { + + //Send to the requester of the ITIL object + case Notification::AUTHOR : + $this->addItemAuthor(); + break; + } + break; + case Notification::USER_TYPE : switch ($data['items_id']) { + //Notification to the ITIL object's observer group + case Notification::OBSERVER_GROUP : + $this->addLinkedGroupByType(CommonITILActor::OBSERVER); + break; + + //Notification to the ITIL object's observer user + case Notification::OBSERVER : + $this->addLinkedUserByType(CommonITILActor::OBSERVER); + break; + //Send to the ITIL object followup author case Notification::TASK_ASSIGN_TECH : $this->addTaskAssignUser($options); @@ -239,72 +299,15 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific } } + + $this->obj = $obj; } /** - * Add user assigned to task - * - * @param array $options Options - * - * @return void + * Summary of addOldAssignTechnician + * @param $options */ - function addTaskAssignUser($options = []) { - global $DB; - - // In case of delete task pass user id - if (isset($options['task_users_id_tech'])) { - $query = $this->getDistinctUserSql()." - FROM `glpi_users` ". - $this->getProfileJoinSql()." - WHERE `glpi_users`.`id` = '".$options['task_users_id_tech']."'"; - - foreach ($DB->request($query) as $data) { - $this->addToRecipientsList($data); - } - } else if (isset($options['task_id'])) { - $dbu = new DbUtils; - $tasktable = $dbu->getTableForItemType($options['itemtype']); //getTableForItemType($this->obj->getType().'Task'); - - $query = $this->getDistinctUserSql()." - FROM `$tasktable` - INNER JOIN `glpi_users` - ON (`glpi_users`.`id` = `$tasktable`.`users_id_tech`)". - $this->getProfileJoinSql()." - WHERE `$tasktable`.`id` = '".$options['task_id']."'"; - - foreach ($DB->request($query) as $data) { - $this->addToRecipientsList($data); - } - } - } - - - /** - * Add group assigned to the task - * - * @param array $options Options - * - * @return void - */ - function addTaskAssignGroup($options = []) { - global $DB; - - // In case of delete task pass user id - if (isset($options['task_groups_id_tech'])) { - $this->addForGroup(0, $options['task_groups_id_tech']); - - } else if (isset($options['task_id'])) { - $dbu = new DbUtils; - $tasktable = $dbu->getTableForItemType($options['itemtype']); //getTableForItemType($this->obj->getType().'Task'); - foreach ($DB->request([$tasktable, 'glpi_groups'], "`glpi_groups`.`id` = `$tasktable`.`groups_id_tech` - AND `$tasktable`.`id` = '".$options['task_id']."'") as $data) { - $this->addForGroup(0, $data['groups_id_tech']); - } - } - } - - function addOldAssignTechnician($options = []) { global $DB; diff --git a/inc/processmaker.class.php b/inc/processmaker.class.php index 80b1fca..5774c3c 100644 --- a/inc/processmaker.class.php +++ b/inc/processmaker.class.php @@ -84,7 +84,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { private $pmWorkspace = ""; private $pmAdminSession = false; - private $taskWriter = 0; + var $taskWriter = 0; private $pm_group_guid = ''; // guid for default user group in Process Maker is used for all GLPI user synchronization into ProcessMaker var $lasterror; var $lang; @@ -143,24 +143,24 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { public function addItemFollowup($itemtype, $itemId, $txtForFollowup, $users_id = null) { global $DB; $fu = new ITILFollowup();//new TicketFollowup(); - $fu->getEmpty(); // to get default values + //$fu->getEmpty(); // to get default values $input = $fu->fields; - if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_CONTENT'] )) { + if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_CONTENT']) && $txtForFollowup['GLPI_TICKET_FOLLOWUP_CONTENT'] != "" ) { $input['content'] = $DB->escape($txtForFollowup['GLPI_TICKET_FOLLOWUP_CONTENT']); } - if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_CONTENT'] )) { + if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_CONTENT']) && $txtForFollowup['GLPI_ITEM_FOLLOWUP_CONTENT'] != "" ) { $input['content'] = $DB->escape($txtForFollowup['GLPI_ITEM_FOLLOWUP_CONTENT']); } - if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE'] )) { + if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE'] ) && $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE'] != "") { $input['is_private'] = $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE']; } - if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_IS_PRIVATE'] )) { + if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_IS_PRIVATE'] ) && $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE'] != "") { $input['is_private'] = $txtForFollowup['GLPI_ITEM_FOLLOWUP_IS_PRIVATE']; } - if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_REQUESTTYPES_ID'] )) { + if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_REQUESTTYPES_ID'] ) && $txtForFollowup['GLPI_TICKET_FOLLOWUP_REQUESTTYPES_ID'] != "") { $input['requesttypes_id'] = $txtForFollowup['GLPI_TICKET_FOLLOWUP_REQUESTTYPES_ID']; } - if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_REQUESTTYPES_ID'] )) { + if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_REQUESTTYPES_ID'] ) && $txtForFollowup['GLPI_ITEM_FOLLOWUP_REQUESTTYPES_ID'] != "") { $input['requesttypes_id'] = $txtForFollowup['GLPI_ITEM_FOLLOWUP_REQUESTTYPES_ID']; } $input['items_id'] = $itemId;//$input['tickets_id'] = $itemId; @@ -385,9 +385,9 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { * routes a case (i.e., moves the case to the next task in the process according to its routing rules). * Embedded routeCase() PM web service call (definition: http://wiki.processmaker.com/index.php/2.0/ProcessMaker_WSDL_Web_Services#routeCase.28.29) * A session must be open before with login() - * @param $case_guid The case ID, which can be obtained with the caseList() function - * @param $delIndex The delegation index, which is a positive integer to identify the current task of the case. If empty then use current delIndex. - * @return a routeCaseResponse object, or false exception occured. routing is normalized to be always an array of routeListStruct + * @param $case_guid string The case GUID, which can be obtained with the caseList() function + * @param $delIndex integer The delegation index, which is a positive integer to identify the current task of the case. If empty then use current delIndex. + * @return stdClass|boolean routeCaseResponse object or false when exception occured. routing is normalized to be always an array of routeListStruct */ function routeCase($case_guid, $delIndex) { try { @@ -1330,9 +1330,9 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { // insert into DB the link between glpi users and pm user $pmuser = new PluginProcessmakerUser; if ($pmuser->getFromDB( $user['id'] )) { - $pmuser->update( [ 'id' => $user['id'], 'pm_users_id' => $pmResult->userUID, 'password' => md5( $pass ) ] ); + $pmuser->update( [ 'id' => $user['id'], 'pm_users_id' => $pmResult->userUID ] ); } else { - $pmuser->add( [ 'id' => $user['id'], 'pm_users_id' => $pmResult->userUID, 'password' => md5( $pass ) ] ); + $pmuser->add( [ 'id' => $user['id'], 'pm_users_id' => $pmResult->userUID ] ); } $actionCode = 1; @@ -1747,8 +1747,25 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { $res = $PM_DB->request([ 'SELECT' => 'CONTENT.CON_VALUE', 'FROM' => 'TASK_USER', - 'INNER JOIN' => ['CONTENT' => ['AND' => ['FKEY' => ['CONTENT' => 'CON_ID', 'TASK_USER' => 'USR_UID'], ['CONTENT' => 'CON_CATEGORY', 'GRP_TITLE'], ['CONTENT' => 'CON_LANG', 'en']]]], - 'WHERE' => ['AND' => ['TASK_USER.TAS_UID' => $pmTaskId, 'TASK_USER.TU_RELATION' => 2, 'TASK_USER.TU_TYPE' => 1]], + 'INNER JOIN' => [ + 'CONTENT' => [ + 'AND' => [ + 'FKEY' => [ + 'CONTENT' => 'CON_ID', + 'TASK_USER' => 'USR_UID' + ], + ['CONTENT.CON_CATEGORY' => 'GRP_TITLE'], + ['CONTENT.CON_LANG' => 'en'] + ] + ] + ], + 'WHERE' => [ + 'AND' => [ + 'TASK_USER.TAS_UID' => $pmTaskId, + 'TASK_USER.TU_RELATION' => 2, + 'TASK_USER.TU_TYPE' => 1 + ] + ], 'LIMIT' => 1 ]); //$query = "SELECT CONTENT.CON_VALUE FROM TASK_USER @@ -1758,7 +1775,13 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { $res = $PM_DB->request([ 'SELECT' => 'CON_VALUE', 'FROM' => 'CONTENT', - 'WHERE' => ['AND' => ['CONTENT.CON_ID' => $groupId, 'CONTENT.CON_CATEGORY' => 'GRP_TITLE', 'CONTENT.CON_LANG' => 'en']] + 'WHERE' => [ + 'AND' => [ + 'CONTENT.CON_ID' => $groupId, + 'CONTENT.CON_CATEGORY' => 'GRP_TITLE', + 'CONTENT.CON_LANG' => 'en' + ] + ] ]); //$query = "SELECT CON_VALUE FROM CONTENT // WHERE CONTENT.CON_ID='$groupId' AND CONTENT.CON_CATEGORY='GRP_TITLE' AND CONTENT.CON_LANG='en' ;"; @@ -1809,7 +1832,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { $input['is_private'] = 0; $input['actiontime'] = 0; - $input['state'] = 1; // == TO_DO + $input['state'] = Planning::TODO; // == TO_DO $input['users_id_tech'] = 0; // by default as it can't be empty if ($techId) { $input['users_id_tech'] = $techId; @@ -1854,41 +1877,59 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { //$query = "INSERT INTO glpi_plugin_processmaker_tasks (items_id, itemtype, plugin_processmaker_cases_id, plugin_processmaker_taskcategories_id, del_index, del_thread) // VALUES ({$glpi_task->getId()}, '{$glpi_task->getType()}', $cases_id, {$pmtaskcat->fields['id']}, $delIndex, $delThread);"; //$DB->query( $query ); + //} + + // send notification if needed for new task as now we have the PluginProcessmakerTask in the DB + $donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState($options['notif']); + // Notification management + $item = new $itemtype; + $item->getFromDB($items_id); + // search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id'] + $res = PluginProcessmakerNotificationTargetTask::getNotifications('task_add', $glpi_task->fields['taskcategories_id'], $item->fields['entities_id']); + if ($res['notifications'] && count($res['notifications']) > 0) { + $pm_task = new PluginProcessmakerTask($glpi_task->getType()); + $pm_task->getFromDB($glpi_task->getId()); + NotificationEvent::raiseEvent($res['event'], + $pm_task, + ['plugin_processmaker_cases_id' => $cases_id, + 'itemtype' => $glpi_task->getType(), + 'task_id' => $glpi_task->getID(), + 'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0, + 'entities_id' => $item->fields['entities_id'] + ]); + } else { + NotificationEvent::raiseEvent('add_task', + $item, + ['plugin_processmaker_cases_id' => $cases_id, + 'itemtype' => $itemtype, + 'task_id' => $glpi_task->getID(), + 'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0 + ]); + } + + PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif); } - - // send notification if needed for new task as now we have the PluginProcessmakerTask in the DB - $donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState($options['notif']); - // Notification management - $item = new $itemtype; - $item->getFromDB($items_id); - // search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id'] - $res = PluginProcessmakerNotificationTargetTask::getNotifications('task_add', $glpi_task->fields['taskcategories_id'], $item->fields['entities_id']); - if ($res['notifications'] && count($res['notifications']) > 0) { - $pm_task = new PluginProcessmakerTask($glpi_task->getType()); - $pm_task->getFromDB($glpi_task->getId()); - NotificationEvent::raiseEvent($res['event'], - $pm_task, - ['plugin_processmaker_cases_id' => $cases_id, - 'itemtype' => $glpi_task->getType(), - 'task_id' => $glpi_task->getID(), - 'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0, - 'entities_id' => $item->fields['entities_id'] - ]); - } else { - NotificationEvent::raiseEvent('add_task', - $item, - ['plugin_processmaker_cases_id' => $cases_id, - 'itemtype' => $itemtype, - 'task_id' => $glpi_task->getID(), - 'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0 - ]); - } - - PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif); - } + /** + * Summary of getGLPIGroupId + * returns GLPI group id from pm group name + * returns false when not found + * @param string $pmGroupName + * @return bool|integer + */ + static function getGLPIGroupId(string $pmGroupName) { + global $DB; + $query = "SELECT id AS glpi_group_id FROM glpi_groups WHERE name LIKE '$pmGroupName';"; + $res = $DB->query($query); + if ($DB->numrows($res) > 0) { + $row = $DB->fetch_array($res); + return $row['glpi_group_id']; + } + return false; + } + /** * Summary of add1stTask * adds a GLPI task to ticket @@ -1958,10 +1999,12 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { * @param mixed $newtitle */ public function setItemTitle($itemtype, $itemId, $newtitle) { + global $DB; + $dbu = new DbUtils; $item = $dbu->getItemForItemtype( $itemtype ); if ($item->getFromDB( $itemId )) { - $item->update( ['id' => $itemId, 'name' => $newtitle] ); + $item->update( ['id' => $itemId, 'name' => $DB->escape($newtitle)] ); } } @@ -1988,6 +2031,8 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { * @param mixed $casevariablevalues */ public function setItemSolution($itemType, $itemId, $casevariablevalues) { + global $DB; + $dbu = new DbUtils; $item = $dbu->getItemForItemtype( $itemType ); if ($item->getFromDB( $itemId )) { @@ -2035,7 +2080,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { if ($solution != '') { $solution .= "\n"; } - $solution .= $casevariablevalues[ 'GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION' ]; + $solution .= $DB->escape($casevariablevalues[ 'GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION' ]); $to_update = true; } @@ -2078,7 +2123,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { * 'begin' => is the new begin date of the task * 'end' => is the new end date of the task * 'toInformation' => is the new status of the task (usually set to INFORMATION) - * + * @return false|object the solved task, when found */ public function solveTask($cases_id, $delIndex, $options = []) { global $DB; @@ -2098,7 +2143,6 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { $hostItem->getFromDB( $glpi_task->fields[ $itemFKField ] ); // change current glpi_currenttime to be sure that date_mode for solved task will not be identical than date_mode of the newly started task - //$end_date = new DateTime( $_SESSION["glpi_currenttime"] ); $saved_date_time = $_SESSION["glpi_currenttime"]; $_SESSION["glpi_currenttime"] = (new DateTime($saved_date_time))->sub(new DateInterval("PT1S"))->format("Y-m-d H:i:s"); @@ -2132,18 +2176,49 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { //'groups_id_tech' => 0, 'content' => $DB->escape($glpi_task->fields[ 'content' ].$options['txtToAppend']) ]; - $donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState($options['notif']); + + $donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState(false); // do not send notification yet $glpi_task->update($params); PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif); // Close the task //$DB->query("UPDATE glpi_plugin_processmaker_tasks SET del_thread_status = '".PluginProcessmakerTask::CLOSED."' WHERE id = {$row['id']}"); $DB->update('glpi_plugin_processmaker_tasks', ['del_thread_status' => PluginProcessmakerTask::CLOSED], ['id' => $row['id']]); + + // send notification if needed for new task as now the PluginProcessmakerTask has been updated in the DB + $donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState($options['notif']); + // Notification management + // search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id'] + $res = PluginProcessmakerNotificationTargetTask::getNotifications('task_done', $glpi_task->fields['taskcategories_id'], $hostItem->fields['entities_id']); + if ($res['notifications'] && count($res['notifications']) > 0) { + $pm_task = new PluginProcessmakerTask($glpi_task->getType()); + $pm_task->getFromDB($glpi_task->getId()); + NotificationEvent::raiseEvent($res['event'], + $pm_task, + ['plugin_processmaker_cases_id' => $cases_id, + 'itemtype' => $glpi_task->getType(), + 'task_id' => $glpi_task->getID(), + 'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0, + 'entities_id' => $hostItem->fields['entities_id'] + ]); + } else { + NotificationEvent::raiseEvent('update_task', + $hostItem, + ['plugin_processmaker_cases_id' => $cases_id, + 'itemtype' => $hostItem->getType(), + 'task_id' => $glpi_task->getID(), + 'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0 + ]); + } + PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif); + // restore current glpi time $_SESSION["glpi_currenttime"] = $saved_date_time; + return $glpi_task; } + return false; } /** @@ -2285,10 +2360,24 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { */ public static function pre_show_item_processmaker($params) { - if (!is_array($params['item']) && is_subclass_of( $params['item'], 'CommonITILTask')) { + if (!is_array($params['item']) && is_subclass_of($params['item'], 'CommonITILTask')) { // must check if Task is bound to a PM task $pmTask = new PluginProcessmakerTask($params['item']->getType()); - if ($pmTask->getFromDB($params['item']->getId())) {//$pmTask->getFromDBByQuery("WHERE itemtype='".$params['item']->getType()."' and items_id=".$params['item']->getId())) { + $is_pmtask = $pmTask->getFromDB($params['item']->getId()); + if (!$is_pmtask && $params['item']->fields['state'] == Planning::INFO) { + // look if it is a meta task for this process + // means a re-assign or an un-claim task info + $pm_process = new PluginProcessmakerProcess; + if ($pm_process->getFromDBByQuery( " WHERE `taskcategories_id` = ".$params['item']->fields['taskcategories_id'])) { + // then look into content to get case id + $re = '//'; + if (preg_match($re, $params['item']->fields['content'], $matches)) { + // here we get the case id and the task id + $is_pmtask = $pmTask->getFromDB($matches['taskid']); + } + } + } + if ($is_pmtask) { $params['item']->fields['can_edit'] = false; // to prevent task edition // replace ##ticket.url##_PluginProcessmakerCase$processmakercases by a setActiveTab to the Case panel @@ -2301,7 +2390,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { } else { $params['item']->fields['content'] = str_replace( '##processmaker.taskcomment##', $taskComment, $params['item']->fields['content'] ); } - $taskJSId = "viewitem".$params['item']->getType().$params['item']->getId().$params['options']['rand']; + $taskJSId = strtolower("viewitem".$params['item']->getType().$params['item']->getId()); // special case for
which will provoke the rendering to be split into several

// add

which othervise will be missing @@ -2574,7 +2663,10 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { // ### 2nd call to save Data POST ### curl_setopt($ch, CURLOPT_URL, $this->serverURL."/cases/cases_SaveData?UID=".$request['UID']."&APP_UID=".$request['APP_UID'] ); $response = curl_exec ($ch); - + if ($response === false) { + //throw new Exception(curl_error($ch), curl_errno($ch)); + Toolbox::logInFile( "pmtrace", curl_error($ch).":".curl_errno($ch)."\n" ); + } curl_close ($ch); if ($loggable) { Toolbox::logInFile( "pmtrace", "URL:\n".$this->serverURL."/cases/cases_SaveData?UID=".$request['UID']."&APP_UID=".$request['APP_UID']."\nData:\n".print_r($data, true )."\nResponse:\n".$response."\n\n\n" ); @@ -2896,13 +2988,15 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { */ public function derivateCase($myCase, $request, $users_id = null) { //$cookies, - global $PM_DB, $CFG_GLPI; + global $PM_DB, $CFG_GLPI, $DB; $itemtype = $myCase->getField('itemtype'); $items_id = $myCase->getField('items_id'); $item = new $itemtype; $item->getFromDB($items_id); + //Toolbox::logInFile("processmaker_derivate", Toolbox::backtrace(false) . "derivateCase: myCase = " . print_r($myCase, true) . "\nrequest = " . print_r($request, true) . "\nusers_id = " . print_r($users_id, true) ); + // save the dynaform variables into the current case if (isset($request['UID']) && isset($request['APP_UID']) && isset($request['__DynaformName__'])) { $resultSave = $this->saveForm( $request ); @@ -2910,6 +3004,16 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { // now derivate the case !!! $pmRouteCaseResponse = $this->routeCase($myCase->fields['case_guid'], $request['DEL_INDEX']); + //Toolbox::logInFile("processmaker_derivate", "routeCase: pmRouteCaseResponse = " . print_r($pmRouteCaseResponse, true)); + + if ($pmRouteCaseResponse->status_code != 0) { + Session::addMessageAfterRedirect(sprintf(__('Unable to derivate case! Retry in a moment, or ask your administrator.
Error code: %u
Error message: %s
', 'processmaker'), + $pmRouteCaseResponse->status_code, + $pmRouteCaseResponse->message), + true, + ERROR); + return; + } $casevariables = ["GLPI_ITEM_TASK_CONTENT", "GLPI_ITEM_APPEND_TO_TASK", @@ -2935,12 +3039,18 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { "GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION", "GLPI_ITEM_INITIAL_DUE_DATE", "GLPI_ITEM_DUE_DATE", - "GLPI_SEND_EMAIL" + "GLPI_SEND_EMAIL", + "GLPI_ITEM_INFORMATION_TASK" ]; // now tries to get some variables to setup content for new task and to append text to solved task $casevariablevalues = $myCase->getVariables($casevariables); + $information_task = ''; + if (array_key_exists( 'GLPI_ITEM_INFORMATION_TASK', $casevariablevalues ) && $casevariablevalues[ 'GLPI_ITEM_INFORMATION_TASK' ] != '') { + $information_task = $casevariablevalues[ 'GLPI_ITEM_INFORMATION_TASK' ]; + } + $sendemail = ''; if (array_key_exists( 'GLPI_SEND_EMAIL', $casevariablevalues ) && $casevariablevalues[ 'GLPI_SEND_EMAIL' ] != '') { $sendemail = json_decode($casevariablevalues[ 'GLPI_SEND_EMAIL' ], true); @@ -3034,23 +3144,23 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { // reset those variables $resetcasevariables = []; foreach ($casevariables as $val) { - $resetcasevariables[$val] = ''; + if (!empty($casevariablevalues[$val])) { + $resetcasevariables[$val] = ''; + } } $resultSave = $myCase->sendVariables($resetcasevariables); - // print_r( $pmRouteCaseResponse ) ; - // die() ; - // now manage tasks associated with item // switch own task to 'done' and create a new one - $this->solveTask($myCase->getID(), - $request['DEL_INDEX'], - ['txtToAppend' => $txtToAppendToTask, - 'users_id_tech' => $users_id, - 'begin' => $solvedTaskStartDate, - 'end' => $solvedTaskEndDate, - 'toInformation' => $solvedTaskSetToInformation - ] ); + $glpi_task = $this->solveTask($myCase->getID(), + $request['DEL_INDEX'], + ['txtToAppend' => $txtToAppendToTask, + 'users_id_tech' => $users_id, + 'begin' => $solvedTaskStartDate, + 'end' => $solvedTaskEndDate, + 'toInformation' => $solvedTaskSetToInformation + ] + ); // create a followup if requested if ($createFollowup) { // && $itemtype == 'Ticket') { @@ -3081,6 +3191,38 @@ class PluginProcessmakerProcessmaker extends CommonDBTM { // get the new case info $caseInfo = $myCase->getCaseInfo($request['DEL_INDEX']); // not sure that it should passed this + // create an information task if requested + if ($information_task != '' && $glpi_task) { + // create an information task and add comment + // $information_task is the content of the task + $pm_process = $myCase->getProcess(); + $taskCat = new TaskCategory; + $taskCat->getFromDB($glpi_task->fields['taskcategories_id']); + // we may replace ##casename## by the name of the case, and ##taskname## by the task name + $search = ['##casename##', + '##taskname##' + ]; + $replace = [$caseInfo->caseName." (".$myCase->getID().")", + DropdownTranslation::getTranslatedValue($glpi_task->fields['taskcategories_id'], 'TaskCategory', 'name', $_SESSION['glpilanguage'], $taskCat->fields['name']) + ]; + $info = str_replace($search, $replace, $information_task); + + $info .= ""; + + // unescape some chars and replace CRLF, CR or LF by
+ $info = str_replace(["\\'", '\\"', '\r\n', '\r', '\n'], ["'", '"', '
', '
', '
'], $info); + + $foreignkey = getForeignKeyFieldForItemType($glpi_task->getItilObjectItemType()); + $glpi_task->add([$foreignkey => $glpi_task->fields[$foreignkey], + 'is_private' => 1, + 'taskcategories_id' => $pm_process->fields['taskcategories_id'], + 'content' => $DB->escape($info), + 'users_id' => $this->taskWriter, + 'state' => Planning::INFO, + 'users_id_tech' => Session::getLoginUserID(), + ]); + } + // now create the new tasks if any if (property_exists( $pmRouteCaseResponse, 'routing' )) { diff --git a/inc/task.class.php b/inc/task.class.php index 9c2f214..70d3e39 100644 --- a/inc/task.class.php +++ b/inc/task.class.php @@ -67,6 +67,15 @@ class PluginProcessmakerTask extends CommonITILTask return false; } + + /** + * Summary of getPMTaskID + * @return mixed + */ + function getPMTaskID() { + return $this->fields['items_id']; + } + /** * Summary of getToDoTasks * returns all 'to do' tasks associated with this case @@ -377,31 +386,53 @@ class PluginProcessmakerTask extends CommonITILTask } if (isset($currentUser)) { - if (/*$currentUser->userId &&*/ $task[$tabnum]['del_index']) { + if ($task[$tabnum]['del_index']) { // to load users for task re-assign only when task is not a sub-case echo "
".__('Loading...')."
"; - echo ""; - //} else { - // // manages the claim - // // current task is to be claimed - // // get the assigned group to the item task - // $itemtask = $dbu->getItemForItemtype( $task[$tabnum]['itemtype'] ); - // $itemtask->getFromDB( $task[$tabnum]['items_id'] ); - // // check if this group can be found in the current user's groups - // if (!isset($_SESSION['glpigroups']) || !in_array( $itemtask->fields['groups_id_tech'], $_SESSION['glpigroups'] )) { - // $hide_claim_button=true; - // } + + // try to get users whom can't be assigned to this task + // already assigned user can't be assigned again to this task + $current_assigned_user = PluginProcessmakerUser::getGLPIUserId($currentUser->userId); + // and then any forbiden users defined from the case itself + $casevariablevalues = $case->getVariables(['GLPI_TASK_PREVENT_REASSIGN']); + $prevent_assign = []; + if (array_key_exists( 'GLPI_TASK_PREVENT_REASSIGN', $casevariablevalues ) && $casevariablevalues[ 'GLPI_TASK_PREVENT_REASSIGN' ] != '') { + $prevent_assign = json_decode($casevariablevalues[ 'GLPI_TASK_PREVENT_REASSIGN' ], true); + } + + + $used_users = []; + $used_users[] = $current_assigned_user; + if (array_key_exists($currentUser->taskId, $prevent_assign)) { + if (is_array($prevent_assign[$currentUser->taskId])) { + foreach ($prevent_assign[$currentUser->taskId] as $pmuser) { + $usr_id = PluginProcessmakerUser::getGlpiIdFromAny($pmuser); + if ($usr_id) { + $used_users[] = $usr_id; + } + } + } else { + $usr_id = PluginProcessmakerUser::getGlpiIdFromAny($prevent_assign[$currentUser->taskId]); + if ($usr_id) { + $used_users[] = $usr_id; + } + } + } + + $data = "{ + cases_id : {$case->getID()}, + items_id : {$case->fields['items_id']}, + itemtype : '{$case->fields['itemtype']}', + tasktype : '{$task[$tabnum]['itemtype']}', + tasks_id : {$task[$tabnum]['items_id']}, + users_id : {$current_assigned_user}, + taskGuid : '{$currentUser->taskId}', + delIndex : {$task[$tabnum]['del_index']}, + delThread : {$currentUser->delThread}, + used : [".join(',', array_unique($used_users))."] + }"; + echo html::scriptBlock("$('#divUsers-{$task[$tabnum]['del_index']}').load('".$CFG_GLPI["root_doc"]."/plugins/processmaker/ajax/task_users.php', $data);"); } if (!$currentUser->userId || !$task[$tabnum]['del_index']) { @@ -422,18 +453,6 @@ class PluginProcessmakerTask extends CommonITILTask $csrf = Session::getNewCSRFToken(); - //echo ""; $url = $PM_SOAP->serverURL ."/cases/cases_Open?sid=".$PM_SOAP->getPMSessionID() ."&APP_UID=".$case->fields['case_guid'] @@ -471,6 +490,42 @@ class PluginProcessmakerTask extends CommonITILTask } }); "); + } + + + /** + * Summary of sendNotification + * Will send either dedicated notification, or standard one + * @param string $type is 'task_add', 'task_reassign', 'task_done', 'task_reminder' + * @param CommonITILTask $task is the task (TicketTask,...) + * @param CommonITILObject $item is the ITIL item (Ticket,...) + * @param PluginProcessmakerCase $case is the case + */ + function sendNotification(string $type, CommonITILTask $task, CommonITILObject $item, PluginProcessmakerCase $case = null) { + // Notification management + // search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id'] + $res = PluginProcessmakerNotificationTargetTask::getNotifications($type, $task->fields['taskcategories_id'], $item->fields['entities_id']); + if ($res['notifications'] && count($res['notifications']) > 0) { + NotificationEvent::raiseEvent($res['event'], + $this, + ['plugin_processmaker_cases_id' => $this->fields['plugin_processmaker_cases_id'], + 'itemtype' => $item->getType(), + 'task_id' => $task->getID(), + 'old_users_id_tech' => isset($task->oldvalues['users_id_tech']) ? $task->oldvalues['users_id_tech'] : 0, + 'is_private' => isset($task->fields['is_private']) ? $task->fields['is_private'] : 0, + 'entities_id' => $item->fields['entities_id'], + 'case' => $case, + 'obj' => $item + ]); + } else { + NotificationEvent::raiseEvent(PluginProcessmakerNotificationTargetTask::getDefaultGLPIEvents($type), + $item, + ['plugin_processmaker_cases_id' => $this->fields['plugin_processmaker_cases_id'], + 'itemtype' => $item->getType(), + 'task_id' => $task->getID(), + 'is_private' => isset($task->fields['is_private']) ? $task->fields['is_private'] : 0 + ]); + } } diff --git a/inc/user.class.php b/inc/user.class.php index be981f3..adca5f0 100644 --- a/inc/user.class.php +++ b/inc/user.class.php @@ -295,6 +295,7 @@ class PluginProcessmakerUser extends CommonDBTM { return 0; } + /** * Summary of getPMUserId * returns processmaker user id for given GLPI user id @@ -309,6 +310,31 @@ class PluginProcessmakerUser extends CommonDBTM { return false; } + + /** + * Summary of getGlpiIdFromAny + * Returns the GLPI id of the user or false if not found + * Accept either PM GUID, GLPI logon, or GLPI ID + * @param $any + * @return mixed GLPI ID of the user or fasle if not found + */ + public static function getGlpiIdFromAny($any) { + $ret = self::getGLPIUserId($any); + if ($ret) { + return $ret; + } + $ret = self::getPMUserId($any); + if ($ret) { + return $any; + } + $usr = new User; + if ($usr->getFromDBbyName($any)) { + return $usr->getId(); + } + return false; + } + + ///** // * Summary of getNewPassword // * @param mixed $username diff --git a/install/mysql/processmaker-empty.sql b/install/mysql/processmaker-empty.sql index 3ad90bb..3e8dd8d 100644 --- a/install/mysql/processmaker-empty.sql +++ b/install/mysql/processmaker-empty.sql @@ -81,7 +81,7 @@ CREATE TABLE IF NOT EXISTS `glpi_plugin_processmaker_configs` ( `domain` varchar(50) DEFAULT '', `maintenance` tinyint(1) NOT NULL DEFAULT '0', `ssl_verify` tinyint(1) NOT NULL DEFAULT '0', - `db_version` varchar(10) NOT NULL DEFAULT '3.4.9', + `db_version` varchar(10) NOT NULL DEFAULT '3.4.10', `max_cases_per_item` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/install/update.php b/install/update.php index febe0e5..78b4c60 100644 --- a/install/update.php +++ b/install/update.php @@ -44,6 +44,10 @@ function processmaker_update() { // will upgrade 3.3.8 to 3.4.9 include_once(GLPI_ROOT."/plugins/processmaker/install/update_3_3_8_to_3_4_9.php"); $new_version = update_3_3_8_to_3_4_9(); + case '3.4.9' : + // will upgrade 3.4.9 to 3.4.10 + include_once(GLPI_ROOT."/plugins/processmaker/install/update_3_4_9_to_3_4_10.php"); + $new_version = update_3_4_9_to_3_4_10(); } if (isset($new_version)) { diff --git a/install/update_3_4_9_to_3_4_10.php b/install/update_3_4_9_to_3_4_10.php new file mode 100644 index 0000000..365cbc1 --- /dev/null +++ b/install/update_3_4_9_to_3_4_10.php @@ -0,0 +1,12 @@ +query($query) or die("error when updating event field in glpi_notifications" . $DB->error()); + + return '3.4.10'; +} \ No newline at end of file diff --git a/js/cases.helpdesk.js b/js/cases.helpdesk.js index fb1c062..40c1f1d 100644 --- a/js/cases.helpdesk.js +++ b/js/cases.helpdesk.js @@ -7,10 +7,12 @@ function onClickContinue(obj) { //debugger; contentDocument = caseIFrame.contentDocument; var txtAreaUserRequestSumUp = contentDocument.getElementById('form[UserRequestSumUp]'); - if (txtAreaUserRequestSumUp) { - $("textarea[name='content']").val($(txtAreaUserRequestSumUp).val()); - } else { - $("textarea[name='content']").val('_'); + if ($("textarea[name='content']").val() == '') { + if (txtAreaUserRequestSumUp) { + tinymce.activeEditor.setContent($(txtAreaUserRequestSumUp).val().replace(/(\r\n)|(\r)|(\n)/g, '
')); + } else { + tinymce.activeEditor.setContent('_'); + } } // call old handler if any diff --git a/locales/fr_FR.mo b/locales/fr_FR.mo index 9299adb..a72879c 100644 Binary files a/locales/fr_FR.mo and b/locales/fr_FR.mo differ diff --git a/locales/fr_FR.po b/locales/fr_FR.po index 96c93d8..dadf1bc 100644 --- a/locales/fr_FR.po +++ b/locales/fr_FR.po @@ -1,22 +1,23 @@ msgid "" msgstr "" "Project-Id-Version: processmaker-plugin\n" -"POT-Creation-Date: 2018-08-06 14:32+0200\n" -"PO-Revision-Date: 2018-08-06 14:44+0200\n" +"POT-Creation-Date: 2020-07-13 09:41+0200\n" +"PO-Revision-Date: 2020-07-13 11:02+0200\n" "Last-Translator: tomolimo\n" "Language-Team: French\n" "Language: fr_FR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.1.1\n" +"X-Generator: Poedit 2.3.1\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Poedit-KeywordsList: ;__:1,2t;_e:1,2t;_x:1c,2,3t;_n:1,2,4t;__s:1,2t;" -"_ex:1c,2,3t;_sx:1c,2,3t;_nx:1c,2,3,5t\n" +"X-Poedit-KeywordsList: ;__:1,2t;_e:1,2t;_x:1c,2,3t;_n:1,2,4t;__s:1,2t;_ex:1c,2,3t;_sx:1c,2,3t;_nx:1c,2,3,5t\n" "X-Crowdin-Project: processmaker-plugin\n" +"X-Crowdin-Project-ID: 310131\n" "X-Crowdin-Language: fr\n" -"X-Crowdin-File: /3.3.0/source.po\n" +"X-Crowdin-File: /3.4 - GLPI 9.2/source.po\n" +"X-Crowdin-File-ID: 20\n" "X-Poedit-SearchPath-0: ajax\n" "X-Poedit-SearchPath-1: front\n" "X-Poedit-SearchPath-2: inc\n" @@ -25,239 +26,306 @@ msgstr "" "X-Poedit-SearchPath-5: hook.php\n" "X-Poedit-SearchPath-6: setup.php\n" -#: ajax/task_users.php:25 +#: ajax/task_users.php:36 msgid "Re-assign task to" msgstr "Ré-affecter tâche à" -#: ajax/task_users.php:45 +#: ajax/task_users.php:60 ajax/task_users.php:61 ajax/task_users.php:124 msgid "Re-assign" msgstr "Ré-affecter" -#: front/case.form.php:35 +#: ajax/task_users.php:110 +#| msgid "Task already assigned to this person!" +msgid "Task is already assigned to this user or group!" +msgstr "La tâche est déjà affectée à cet utilisateur (ou ce groupe) !" + +#: ajax/task_users.php:110 ajax/task_users.php:122 +#| msgid "Re-assign task to" +msgid "Re-assign task" +msgstr "Ré-affecter tâche" + +#: ajax/task_users.php:114 ajax/task_users.php:119 +#| msgid "Claim target task" +msgid "Un-claim task" +msgstr "Annuler affectation de la tâche" + +#: ajax/task_users.php:115 +msgid "Please input reason to un-claim
(task will be re-assigned to former group):" +msgstr "Saisir la raison pour l'annulation de l'affectation
(la tâche sera ré-affectée au groupe précédent) :" + +#: ajax/task_users.php:116 +msgid "Un-claim" +msgstr "Annulation de l'affectation" + +#: ajax/task_users.php:119 +msgid "Can\\'t un-assign Task!" +msgstr "Annulation de l'affectation impossible !" + +#: ajax/task_users.php:123 +msgid "Please input reason to re-assign:" +msgstr "Saisir la raison pour la ré-affectation :" + +#: ajax/task_users.php:134 +msgid "Send reminder" +msgstr "Envoyer un rappel" + +#: front/case.form.php:32 msgid "Case has been deleted!" msgstr "Le cas a été effacé !" -#: front/case.form.php:37 +#: front/case.form.php:34 msgid "Unable to delete case!" msgstr "Impossible d'effacer le cas !" -#: front/case.form.php:50 +#: front/case.form.php:46 msgid "Case has been cancelled!" msgstr "Le cas a été annulé !" -#: front/case.form.php:52 front/case.form.php:55 +#: front/case.form.php:48 front/case.form.php:51 msgid "Unable to cancel case!" msgstr "Impossible d'annuler le cas !" -#: front/case.form.php:76 front/case.form.php:78 inc/case.class.php:1018 +#: front/case.form.php:70 front/case.form.php:72 inc/case.class.php:1310 msgid "Process cases" msgstr "Cas des processus" -#: front/case.php:5 front/caselink.form.php:27 front/caselink.php:5 -#: front/process.form.php:25 front/process.php:5 inc/caselink.class.php:143 -#: inc/config.class.php:50 inc/config.class.php:354 inc/process.class.php:393 +#: front/case.php:5 front/caselink.form.php:29 front/caselink.php:5 +#: front/process.form.php:27 front/process.php:5 inc/caselink.class.php:157 +#: inc/config.class.php:50 inc/config.class.php:363 inc/process.class.php:409 #: inc/profile.class.php:52 inc/profile.class.php:83 msgid "ProcessMaker" msgstr "ProcessMaker" -#: front/processmaker.form.php:85 +#: front/processmaker.form.php:80 msgid "Task re-assigned!" msgstr "Tâche ré-affectée !" -#: front/processmaker.form.php:87 +#: front/processmaker.form.php:82 msgid "Error re-assigning task: " -msgstr "Impossible de re-affecter cette tâche : " +msgstr "Impossible de ré-affecter cette tâche :" -#: front/processmaker.form.php:90 -msgid "Task already assigned to this person!" -msgstr "Tâche déjà affectée à cette personne !" +#: front/processmaker.form.php:93 +#| msgid "Task name" +msgid "Task un-claimed!" +msgstr "Annulation de l'affectation de la tâche effectuée !" + +#: front/processmaker.form.php:95 +msgid "Can't un-claim task! Verify 'Assignement Rules' in the process definition." +msgstr "Annulation de l'affectation impossible ! Vérifiez les règles d'assignation dans la définition du Processus." #: front/processmaker.helpdesk.form.php:21 msgid "Process - Case" msgstr "Processus - Cas" -#: front/processmaker.helpdesk.form.php:24 inc/case.class.php:605 +#: front/processmaker.helpdesk.form.php:24 inc/case.class.php:799 msgid "Select the process you want to add" msgstr "Choisir le processus à démarrer" -#: hook.php:31 inc/taskcategory.class.php:98 +#: hook.php:9 inc/taskcategory.class.php:214 msgid "Synchronize Task List" msgstr "Synchroniser la liste des Tâches" -#: hook.php:158 inc/case.class.php:77 +#: hook.php:76 inc/case.class.php:89 msgid "Case" msgstr "Cas" -#: hook.php:158 inc/case.class.php:586 inc/case.class.php:1062 +#: hook.php:76 inc/case.class.php:778 inc/case.class.php:1355 msgid "Status" msgstr "Statut" -#: inc/case.class.php:23 inc/case.class.php:90 inc/case.class.php:92 +#: inc/case.class.php:25 inc/case.class.php:102 inc/case.class.php:104 msgid "Process case" msgid_plural "Process cases" msgstr[0] "Cas du processus" msgstr[1] "Cas des processus" -#: inc/case.class.php:80 +#: inc/case.class.php:92 msgid "Sub-case" msgstr "Sous-cas" -#: inc/case.class.php:312 +#: inc/case.class.php:303 +#, php-format +msgid "Task un-claimed!
Case: %s
Task: \"%s\" has been un-assigned from \"%s\" and assigned to \"%s\" group.
Reason: %s" +msgstr "Annulation de l'affection de la tâche effectuée !
Cas : %s
Tâche : \"%s\" a été libérée de \"%s\" et assignée au groupe \"%s\".
Motif : %s" + +#: inc/case.class.php:420 +#, php-format +msgid "Task re-assigned!
Case: %s
Task: \"%s\" has been re-assigned from \"%s\" to \"%s\".
Reason: %s" +msgstr "Tâche ré-assignée !
Cas : %s
Tâche : \"%s\" a été ré-assignée de \"%s\" à \"%s\".
Motif : %s" + +#: inc/case.class.php:429 +#, php-format +msgid "Task assigned!
Case: %s
Task: \"%s\" has been assigned to \"%s\".
Reason: %s" +msgstr "Tâche assignée !
Cas : %s
Tâche : \"%s\" a été asignée à \"%s\".
Motif : %s" + +#: inc/case.class.php:510 msgid "Current task(s) properties" msgstr "Propriétés des tâches en cours" -#: inc/case.class.php:316 inc/task.class.php:263 +#: inc/case.class.php:514 inc/task.class.php:283 msgid "Task" msgstr "Tâche" -#: inc/case.class.php:317 inc/task.class.php:264 +#: inc/case.class.php:515 inc/task.class.php:284 msgid "Task guid" msgstr "Guid de la tâche" -#: inc/case.class.php:318 inc/task.class.php:265 +#: inc/case.class.php:516 inc/task.class.php:285 msgid "Current user" msgstr "Utilisateur actuel" -#: inc/case.class.php:319 inc/task.class.php:266 +#: inc/case.class.php:517 inc/task.class.php:286 msgid "Task delegation date" msgstr "Date de délégation de tâche" -#: inc/case.class.php:341 inc/task.class.php:275 +#: inc/case.class.php:539 inc/task.class.php:295 msgid "To be claimed" msgstr "A réclamer" -#: inc/case.class.php:377 +#: inc/case.class.php:575 msgid "Sub-case properties" msgstr "Propriétés du sous-cas" -#: inc/case.class.php:380 +#: inc/case.class.php:578 msgid "Parent case properties" msgstr "Propriétés du cas parent" -#: inc/case.class.php:382 +#: inc/case.class.php:580 msgid "Case properties" msgstr "Propriétés du cas" -#: inc/case.class.php:387 inc/case.class.php:584 inc/case.class.php:1036 -#: inc/process.class.php:548 +#: inc/case.class.php:585 inc/case.class.php:776 inc/case.class.php:1328 +#: inc/process.class.php:576 msgid "Process" msgstr "Processus" -#: inc/case.class.php:388 +#: inc/case.class.php:586 inc/notificationtargetprocessmaker.class.php:64 msgid "Case title" msgstr "Titre du cas" -#: inc/case.class.php:389 +#: inc/case.class.php:587 msgid "Case number" msgstr "Numéro du cas" -#: inc/case.class.php:390 +#: inc/case.class.php:588 msgid "Case status" msgstr "Statut du cas" -#: inc/case.class.php:391 +#: inc/case.class.php:589 msgid "Case guid" msgstr "Guid du cas" -#: inc/case.class.php:392 +#: inc/case.class.php:590 msgid "Creator" msgstr "Créateur" -#: inc/case.class.php:393 +#: inc/case.class.php:591 inc/case.class.php:1370 msgid "Creation date" msgstr "Date de création" -#: inc/case.class.php:394 +#: inc/case.class.php:592 msgid "Last update" msgstr "Dernière mise à jour" -#: inc/case.class.php:479 +#: inc/case.class.php:675 #, php-format msgid "Case is linked to a %1s" msgstr "Le cas est lié à un %1s" -#: inc/case.class.php:481 +#: inc/case.class.php:677 #, php-format msgid "Sub-case is linked to a %1s" msgstr "Le sous-cas est lié à un %1s" -#: inc/case.class.php:506 +#: inc/case.class.php:698 msgid "Case cancellation" msgstr "Annulation du cas" -#: inc/case.class.php:507 +#: inc/case.class.php:699 msgid "Cancel case" msgstr "Annuler cas" -#: inc/case.class.php:511 +#: inc/case.class.php:703 msgid "Confirm cancellation?" msgstr "Confirmer l’annulation ?" -#: inc/case.class.php:511 inc/profile.class.php:23 +#: inc/case.class.php:703 inc/profile.class.php:23 msgid "Cancel" msgstr "Annuler" -#: inc/case.class.php:532 +#: inc/case.class.php:717 msgid "Case deletion" msgstr "Suppression du cas" -#: inc/case.class.php:533 -msgid "Delete case" -msgstr "Supprimer le cas" - -#: inc/case.class.php:585 inc/case.class.php:1029 +#: inc/case.class.php:777 inc/case.class.php:1321 msgid "Title" msgstr "Titre" -#: inc/case.class.php:587 inc/case.class.php:1070 +#: inc/case.class.php:779 inc/case.class.php:1362 msgid "Sub-case of" msgstr "Sous-cas de" -#: inc/case.class.php:602 +#: inc/case.class.php:796 msgid "Add a new case" msgstr "Ajouter un nouveau cas" -#: inc/case.class.php:995 +#: inc/case.class.php:1227 msgctxt "case_status" msgid "Draft" msgstr "Brouillon" -#: inc/case.class.php:996 +#: inc/case.class.php:1228 msgctxt "case_status" msgid "To do" msgstr "A faire" -#: inc/case.class.php:997 +#: inc/case.class.php:1229 msgctxt "case_status" msgid "Completed" msgstr "Terminé" -#: inc/case.class.php:998 +#: inc/case.class.php:1230 msgctxt "case_status" msgid "Cancelled" msgstr "Annulé" -#: inc/case.class.php:1022 +#: inc/case.class.php:1314 msgid "ID" msgstr "ID" -#: inc/case.class.php:1049 +#: inc/case.class.php:1335 inc/notificationtargetprocessmaker.class.php:72 +#| msgid "Item entity" +msgid "Item type" +msgstr "Type de l'item" + +#: inc/case.class.php:1342 msgid "Item" msgstr "Item" -#: inc/case.class.php:1056 +#: inc/case.class.php:1349 msgid "Item entity" msgstr "Entité de l'item" -#: inc/casechangelog.class.php:35 +#: inc/case.class.php:1379 +#| msgid "Last update" +msgid "Last update date" +msgstr "Date de dernière mise à jour" + +#: inc/case.class.php:1392 +#, php-format +#| msgid "Case status" +msgid "Case status is '%s'" +msgstr "L'état du cas est '%s'" + +#: inc/casechangelog.class.php:36 msgid "Change log" msgstr "Evolution" -#: inc/casedynaform.class.php:80 +#: inc/casedynaform.class.php:83 msgid "Dynaforms" msgstr "DynaForms" -#: inc/casehistory.class.php:35 +#: inc/casehistory.class.php:36 msgid "History" msgstr "Historique" @@ -269,43 +337,51 @@ msgstr "Liens-cas" msgid "Case-link" msgstr "Lien-cas" -#: inc/caselink.class.php:75 inc/caselink.class.php:165 +#: inc/caselink.class.php:75 +msgid "Synchronous" +msgstr "Synchrone" + +#: inc/caselink.class.php:80 inc/caselink.class.php:179 msgid "External data" msgstr "Données externes" -#: inc/caselink.class.php:80 inc/caselink.class.php:171 +#: inc/caselink.class.php:85 inc/caselink.class.php:185 msgid "Self" msgstr "Self" -#: inc/caselink.class.php:85 inc/caselink.class.php:189 +#: inc/caselink.class.php:90 inc/caselink.class.php:203 msgid "Source task GUID" msgstr "GUID de la tâche source" -#: inc/caselink.class.php:93 inc/caselink.class.php:195 +#: inc/caselink.class.php:98 inc/caselink.class.php:209 msgid "Target task GUID" msgstr "GUID de la tâche cible" -#: inc/caselink.class.php:101 inc/caselink.class.php:207 +#: inc/caselink.class.php:106 inc/caselink.class.php:221 msgid "Target process GUID" msgstr "GUID du Processus cible" -#: inc/caselink.class.php:110 inc/caselink.class.php:201 +#: inc/caselink.class.php:115 inc/caselink.class.php:215 msgid "Target dynaform GUID" msgstr "GUID du dynaform cible" -#: inc/caselink.class.php:115 inc/caselink.class.php:213 +#: inc/caselink.class.php:120 inc/caselink.class.php:227 msgid "Source condition" msgstr "Condition d'activation du lien" -#: inc/caselink.class.php:121 inc/caselink.class.php:177 +#: inc/caselink.class.php:126 inc/caselink.class.php:191 msgid "Claim target task" msgstr "Tâche cible 'à réclamer'" -#: inc/caselink.class.php:126 inc/caselink.class.php:183 +#: inc/caselink.class.php:136 +msgid "Impersonate target task user" +msgstr "Personnifier l'utilisateur de la tâche cible" + +#: inc/caselink.class.php:141 inc/caselink.class.php:197 msgid "External application JSON config" msgstr "Configuration JSON de l'application externe" -#: inc/casemap.class.php:43 +#: inc/casemap.class.php:44 msgid "Map" msgstr "Carte" @@ -314,190 +390,294 @@ msgid "ProcessMaker setup" msgstr "Configuration du serveur ProcessMaker" #: inc/config.class.php:159 -msgid "Server URL (must be in same domain than GLPI)" -msgstr "URL du serveur (doit être dans le même domaine que GLPI)" +#| msgid "Server URL (must be in same domain than GLPI)" +msgid "Server URL (must be in same domain than GLPI, if GLPI is using HTTPS, PM server must also use HTTPS)" +msgstr "URL du serveur (doit être dans le même domaine que GLPI, si GLPI utilise HTTPS, alors PM doit aussi utiliser HTTPS)" -#: inc/config.class.php:164 +#: inc/config.class.php:163 msgid "Common domain with GLPI" msgstr "Domaine commun avec GLPI" -#: inc/config.class.php:193 +#: inc/config.class.php:192 msgid "None!" msgstr "Aucun !" -#: inc/config.class.php:202 +#: inc/config.class.php:201 +msgid "Verify SSL certificate" +msgstr "Verification du certificat SSL" + +#: inc/config.class.php:206 msgid "Workspace Name" msgstr "Nom du Workspace" -#: inc/config.class.php:207 +#: inc/config.class.php:211 msgid "Server administrator name" msgstr "Non de l'administreur du server ProcessMaker" -#: inc/config.class.php:212 +#: inc/config.class.php:216 msgid "Server administrator password" msgstr "Mot de passe de l'administrateur du serveur ProcessMaker" -#: inc/config.class.php:218 inc/config.class.php:258 +#: inc/config.class.php:222 inc/config.class.php:262 msgid "Connection status" msgstr "Status de la connexion" -#: inc/config.class.php:234 +#: inc/config.class.php:238 msgid "SQL server setup" msgstr "Configuration du serveur SQL" -#: inc/config.class.php:237 +#: inc/config.class.php:241 msgid "SQL server (MariaDB or MySQL)" msgstr "SQL server (MariaDB ou MySQL)" -#: inc/config.class.php:242 +#: inc/config.class.php:246 msgid "Database name" msgstr "Nom de la base de données" -#: inc/config.class.php:247 +#: inc/config.class.php:251 msgid "SQL user" msgstr "Utilisateur SQL" -#: inc/config.class.php:252 +#: inc/config.class.php:256 msgid "SQL password" msgstr "Mot de passe SQL" -#: inc/config.class.php:269 +#: inc/config.class.php:273 msgid "Theme Name" msgstr "Nom du thème" -#: inc/config.class.php:275 +#: inc/config.class.php:279 msgid "Main Task Category (edit to change name)" msgstr "Catégorie principale des tâches (éditer pour changer le nom)" -#: inc/config.class.php:282 +#: inc/config.class.php:286 msgid "Task Writer (edit to change name)" msgstr "Auteur des tâches (éditer pour changer le nom)" -#: inc/config.class.php:302 +#: inc/config.class.php:306 msgid "Group in ProcessMaker which will contain all GLPI users" msgstr "Groupe dans ProcessMaker qui contiendra les utilisateurs de GLPI" -#: inc/config.class.php:331 +#: inc/config.class.php:321 inc/process.class.php:510 inc/process.class.php:637 +msgid "Max cases per item (0=unlimited)" +msgstr "Nombre de cas maxi par item (0 = pas de limite)" + +#: inc/config.class.php:340 msgid "Processmaker system information" msgstr "Informations système du serveur ProcessMaker" -#: inc/config.class.php:334 inc/config.class.php:344 +#: inc/config.class.php:343 inc/config.class.php:353 msgid "Version" msgstr "Version" -#: inc/config.class.php:335 +#: inc/config.class.php:344 msgid "Web server" msgstr "Serveur web" -#: inc/config.class.php:336 +#: inc/config.class.php:345 msgid "Server name" msgstr "Nom du serveur" -#: inc/config.class.php:337 +#: inc/config.class.php:346 msgid "PHP version" msgstr "Version de PHP" -#: inc/config.class.php:338 +#: inc/config.class.php:347 msgid "DB version" msgstr "Version de la Db" -#: inc/config.class.php:339 +#: inc/config.class.php:348 msgid "DB server IP" msgstr "IP du serveur DB" -#: inc/config.class.php:340 +#: inc/config.class.php:349 msgid "DB name" msgstr "Nom de la BD" -#: inc/config.class.php:341 +#: inc/config.class.php:350 msgid "User browser" msgstr "Navigateur de l’utilisateur" -#: inc/config.class.php:342 +#: inc/config.class.php:351 msgid "User IP" msgstr "IP de l'utilisateur" -#: inc/config.class.php:344 +#: inc/config.class.php:353 msgid "Not yet!" msgstr "Pas encore !" -#: inc/process.class.php:350 +#: inc/notificationtargetcase.class.php:26 +msgid "Send email" +msgstr "Envoi d'email" + +#: inc/notificationtargetcase.class.php:37 +msgid "eMail recipients" +msgstr "Destinataires des emails" + +#: inc/notificationtargetprocessmaker.class.php:60 +#| msgid "Process case" +#| msgid_plural "Process cases" +msgid "Process category" +msgstr "Catégorie du processus" + +#: inc/notificationtargetprocessmaker.class.php:61 +#| msgid "Process case" +#| msgid_plural "Process cases" +msgid "Process category id" +msgstr "ID de la catégorie du processus" + +#: inc/notificationtargetprocessmaker.class.php:62 +#| msgid "Process case task" +#| msgid_plural "Process case tasks" +msgid "Process category comment" +msgstr "Commentaire de la catégorie du processus" + +#: inc/notificationtargetprocessmaker.class.php:63 +#| msgid "Case guid" +msgid "Case id" +msgstr "ID du cas" + +#: inc/notificationtargetprocessmaker.class.php:65 +#| msgid "Case deletion" +msgid "Case description" +msgstr "Description du cas" + +#: inc/notificationtargetprocessmaker.class.php:67 +msgid "Case variable 'XXX'" +msgstr "Variable de cas 'XXX'" + +#: inc/notificationtargetprocessmaker.class.php:68 +msgid "List of values in 'YYY' array" +msgstr "Liste des valeurs du tableau 'YYY'" + +#: inc/notificationtargetprocessmaker.class.php:69 +msgid "Number of rows in 'YYY' array" +msgstr "Nombre de lignes du tableau 'YYY'" + +#: inc/notificationtargetprocessmaker.class.php:70 +msgid "Value for colname in 'YYY' array" +msgstr "Valeur de la colonne 'colname' du tableau 'YYY'" + +#: inc/notificationtargetprocessmaker.class.php:71 +msgid "Value for key in 'ZZZ' assoc array (1-dimension array)" +msgstr "Valeur pour la clé 'key' du tableau associatif à une dimension 'ZZZ'" + +#: inc/notificationtargetprocessmaker.class.php:73 +#| msgid "Item" +msgid "Item id" +msgstr "ID de l'item" + +#: inc/notificationtargetprocessmaker.class.php:74 +#| msgid "Item" +msgid "Item URL" +msgstr "URL de l'item" + +#: inc/notificationtargetprocessmaker.class.php:75 +#| msgid "Item entity" +msgid "Item title" +msgstr "Titre de l'item" + +#: inc/notificationtargetprocessmaker.class.php:83 +msgid "XXX is to be replaced by any case variable names" +msgstr "XXX doit être remplacé par n'importe quel nom de variable de cas" + +#: inc/notificationtargetprocessmaker.class.php:86 +msgid "YYY is to be replaced by any array variables" +msgstr "YYY doit être remplacé par n'importe quel nom de tableau" + +#: inc/notificationtargetprocessmaker.class.php:90 +msgid "ZZZ is to be replaced by any assoc array variables (1-dimension array with key/value pairs)" +msgstr "ZZZ doit être replacé par n'importe quel nom de tableau associatif à une dimension (paire clé/valeur)" + +#: inc/notificationtargettask.class.php:195 +#| msgid "Task delegation date" +msgid "Task action" +msgstr "Action de la tâche" + +#: inc/process.class.php:366 msgid "Synchronize Process List" msgstr "Synchroniser la liste des processus" -#: inc/process.class.php:427 inc/process.class.php:589 +#: inc/process.class.php:443 inc/process.class.php:617 msgid "Process GUID" msgstr "GUID du Processus" -#: inc/process.class.php:433 +#: inc/process.class.php:449 msgid "Process type" msgstr "Type de processus" -#: inc/process.class.php:439 +#: inc/process.class.php:455 msgid "Hide case num. & title" msgstr "Cacher num. et titre du cas" -#: inc/process.class.php:445 +#: inc/process.class.php:461 msgid "Insert Task Category" msgstr "Insérer la catégorie des tâches" -#: inc/process.class.php:457 +#: inc/process.class.php:473 msgid "Ticket type (self-service)" msgstr "Type de ticket (self-service)" -#: inc/process.class.php:464 inc/process.class.php:609 +#: inc/process.class.php:480 inc/process.class.php:642 msgid "Visible in Incident for Central interface" msgstr "Visible pour un Incident sur l'interface Centrale" -#: inc/process.class.php:470 inc/process.class.php:614 +#: inc/process.class.php:486 inc/process.class.php:647 msgid "Visible in Request for Central interface" msgstr "Visible pour une demande sur l'interface Centrale" -#: inc/process.class.php:476 inc/process.class.php:666 +#: inc/process.class.php:492 inc/process.class.php:699 msgid "Visible in Change" msgstr "Visible dans un Changement" -#: inc/process.class.php:482 inc/process.class.php:671 +#: inc/process.class.php:498 inc/process.class.php:704 msgid "Visible in Problem" msgstr "Visible dans un Problème" -#: inc/process.class.php:519 +#: inc/process.class.php:504 +msgid "Maintenance" +msgstr "Maintenance" + +#: inc/process.class.php:547 msgctxt "process_type" msgid "Classic" msgstr "Classique" -#: inc/process.class.php:520 +#: inc/process.class.php:548 msgctxt "process_type" msgid "BPMN" msgstr "BPMN" -#: inc/process.class.php:546 +#: inc/process.class.php:574 msgid "Processes" msgstr "Processus" -#: inc/process.class.php:599 +#: inc/process.class.php:627 msgid "Hide case number and title in task descriptions" msgstr "Masquer numéro et titre des cas dans les descriptions des tâches" -#: inc/process.class.php:604 +#: inc/process.class.php:632 msgid "Insert Task Category comments in Task Description" -msgstr "" -"Insérer les commentaires des Catégories de Tâches dans les descriptions des " -"Tâches" +msgstr "Insérer les commentaires des Catégories de Tâches dans les descriptions des Tâches" -#: inc/process.class.php:619 +#: inc/process.class.php:652 msgid "ITIL Category for Self-service interface (left empty to disable)" -msgstr "" -"Catégorie ITIL pour l'interface libre-service (laissez vide pour désactiver)" +msgstr "Catégorie ITIL pour l'interface libre-service (laissez vide pour désactiver)" -#: inc/process.class.php:646 +#: inc/process.class.php:679 msgid "Type for Self-service interface" msgstr "Type de ticket pour l'interface libre-service" -#: inc/process.class.php:676 +#: inc/process.class.php:709 msgid "Process type (to be changed only if not up-to-date)" msgstr "Type de processus (à modifier uniquement si pas à jour)" +#: inc/process.class.php:862 +#, php-format +#| msgid "ProcessMaker plugin is under maintenance, please retry later, thank you." +msgid "Process '%s' is under maintenance, please retry later, thank you." +msgstr "Le processus '%s' est en maintenance, ré-essayez plus tard, merci." + #: inc/process_profile.class.php:26 inc/process_profile.class.php:45 msgid "Authorizations" msgstr "Autorisations" @@ -516,40 +696,42 @@ msgctxt "errors" msgid "Can't create case: no rights for it!" msgstr "Impossible de créer le cas : pas de droits pour cela !" -#: inc/processmaker.class.php:984 +#: inc/processmaker.class.php:1012 msgid "Syncs GLPI users and groups into ProcessMaker." msgstr "Synchronisation des utilisateurs GLPI et des groups avec ProcessMaker." -#: inc/processmaker.class.php:986 +#: inc/processmaker.class.php:1014 msgid "Cleaning of orphan cases." msgstr "Nettoyage des cas orphelins." -#: inc/processmaker.class.php:986 +#: inc/processmaker.class.php:1014 msgid "Number of days to keep orphan cases" msgstr "Nombre de jours avant nettoyage des cas orphelins" -#: inc/processmaker.class.php:988 +#: inc/processmaker.class.php:1016 msgid "To apply task actions between cases." msgstr "Pour appliquer des actions de tâches entre cas." -#: inc/processmaker.class.php:1696 +#: inc/processmaker.class.php:1720 msgid "Case title: " msgstr "Titre du cas : " -#: inc/processmaker.class.php:2178 +#: inc/processmaker.class.php:2275 msgid "A 'Case' is running!" msgstr "Un 'Cas' est en cours !" -#: inc/processmaker.class.php:2179 +#: inc/processmaker.class.php:2276 msgid "You must manage it first (see 'Process - Case' tab)!" msgstr "Vous devez d'abord le terminer (voir onglet 'Processus - Cas') !" -#: inc/processmaker.class.php:3038 -msgid "" -"ProcessMaker plugin is under maintenance, please retry later, thank you." -msgstr "" -"Le plugin ProcessMaker est en maintenance, veuillez ré-essayer plus tard, " -"merci." +#: inc/processmaker.class.php:2774 +#, php-format +msgid "Unable to derivate case! Retry in a moment, or ask your administrator.
Error code: %u
Error message: %s
" +msgstr "Impossible de dériver le cas ! Ré-essayez dans un moment, ou demandez à votre administrateur.
Code d'erreur : %u
Message d'erreur : %s
" + +#: inc/processmaker.class.php:3281 +msgid "ProcessMaker plugin is under maintenance, please retry later, thank you." +msgstr "Le plugin ProcessMaker est en maintenance, veuillez ré-essayer plus tard, merci." #: inc/profile.class.php:17 msgid "Process configuration" @@ -559,36 +741,62 @@ msgstr "Configuration des Processus" msgid "Cases" msgstr "Cas" +#: inc/profile.class.php:23 +msgid "Ad Hoc user re-assign" +msgstr "Ré-assignation d'un utilisateur Ad Hoc" + #: inc/task.class.php:29 msgid "Process case task" msgid_plural "Process case tasks" msgstr[0] "Tâche d'un cas" msgstr[1] "Tâches d'un cas" -#: inc/task.class.php:258 +#: inc/task.class.php:278 msgid "Sub-case task(s)" msgstr "Tache(s) du sous-cas" -#: inc/taskcategory.class.php:21 inc/taskcategory.class.php:31 +#: inc/taskcategory.class.php:24 inc/taskcategory.class.php:116 +#| msgid "Process case" +#| msgid_plural "Process cases" +msgid "Process task" +msgstr "Tâche du processus" + +#: inc/taskcategory.class.php:29 +#| msgid "Task List" +msgid "Task list" +msgstr "List des tâches" + +#: inc/taskcategory.class.php:39 msgid "Task List" msgstr "Liste des tâches" -#: inc/taskcategory.class.php:32 +#: inc/taskcategory.class.php:40 inc/taskcategory.class.php:118 msgid "Task name" msgstr "Nom de la Tâche" -#: inc/taskcategory.class.php:34 inc/taskcategory.class.php:60 +#: inc/taskcategory.class.php:42 inc/taskcategory.class.php:68 +#: inc/taskcategory.class.php:121 inc/taskcategory.class.php:155 msgid "Start" msgstr "Démarrer" -#: inc/taskcategory.class.php:35 +#: inc/taskcategory.class.php:43 inc/taskcategory.class.php:122 msgid "Task GUID" msgstr "GUID de la Tâche" -#: inc/taskcategory.class.php:38 inc/taskcategory.class.php:78 +#: inc/taskcategory.class.php:46 inc/taskcategory.class.php:86 +#: inc/taskcategory.class.php:125 inc/taskcategory.class.php:173 msgid "Sub-process" msgstr "Sous-processus" +#: inc/taskcategory.class.php:117 +#| msgid "Process case" +#| msgid_plural "Process cases" +msgid "Process name" +msgstr "Nom du procesus" + +#~ msgid "Delete case" +#~ msgstr "Delete case" + #~ msgid "Case item" #~ msgstr "Case item" diff --git a/locales/source.po b/locales/source.po index 17ae5a9..ea91229 100644 --- a/locales/source.po +++ b/locales/source.po @@ -1,15 +1,15 @@ msgid "" msgstr "" "Project-Id-Version: Processmaker plugin 3.3.0\n" -"POT-Creation-Date: 2018-08-06 14:32+0200\n" -"PO-Revision-Date: 2018-08-06 14:33+0200\n" +"POT-Creation-Date: 2020-07-13 09:41+0200\n" +"PO-Revision-Date: 2020-07-13 11:03+0200\n" "Last-Translator: tomolimo\n" "Language-Team: en_GB\n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.1.1\n" +"X-Generator: Poedit 2.3.1\n" "X-Poedit-Basepath: ..\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-KeywordsList: ;__:1,2t;_e:1,2t;_x:1c,2,3t;_n:1,2,4t;__s:1,2t;" @@ -22,239 +22,324 @@ msgstr "" "X-Poedit-SearchPath-5: hook.php\n" "X-Poedit-SearchPath-6: setup.php\n" -#: ajax/task_users.php:25 +#: ajax/task_users.php:36 msgid "Re-assign task to" msgstr "Re-assign task to" -#: ajax/task_users.php:45 +#: ajax/task_users.php:60 ajax/task_users.php:61 ajax/task_users.php:124 msgid "Re-assign" msgstr "Re-assign" -#: front/case.form.php:35 +#: ajax/task_users.php:110 +#| msgid "Task already assigned to this person!" +msgid "Task is already assigned to this user or group!" +msgstr "Task is already assigned to this user or group!" + +#: ajax/task_users.php:110 ajax/task_users.php:122 +#| msgid "Re-assign task to" +msgid "Re-assign task" +msgstr "Re-assign task" + +#: ajax/task_users.php:114 ajax/task_users.php:119 +#| msgid "Claim target task" +msgid "Un-claim task" +msgstr "Un-claim task" + +#: ajax/task_users.php:115 +msgid "" +"Please input reason to un-claim
(task will be re-assigned to former " +"group):" +msgstr "" +"Please input reason to un-claim
(task will be re-assigned to former " +"group):" + +#: ajax/task_users.php:116 +msgid "Un-claim" +msgstr "Un-claim" + +#: ajax/task_users.php:119 +msgid "Can\\'t un-assign Task!" +msgstr "Can\\'t un-assign Task!" + +#: ajax/task_users.php:123 +msgid "Please input reason to re-assign:" +msgstr "Please input reason to re-assign:" + +#: ajax/task_users.php:134 +msgid "Send reminder" +msgstr "Send reminder" + +#: front/case.form.php:32 msgid "Case has been deleted!" msgstr "Case has been deleted!" -#: front/case.form.php:37 +#: front/case.form.php:34 msgid "Unable to delete case!" msgstr "Unable to delete case!" -#: front/case.form.php:50 +#: front/case.form.php:46 msgid "Case has been cancelled!" msgstr "Case has been cancelled!" -#: front/case.form.php:52 front/case.form.php:55 +#: front/case.form.php:48 front/case.form.php:51 msgid "Unable to cancel case!" msgstr "Unable to cancel case!" -#: front/case.form.php:76 front/case.form.php:78 inc/case.class.php:1018 +#: front/case.form.php:70 front/case.form.php:72 inc/case.class.php:1310 msgid "Process cases" msgstr "Process cases" -#: front/case.php:5 front/caselink.form.php:27 front/caselink.php:5 -#: front/process.form.php:25 front/process.php:5 inc/caselink.class.php:143 -#: inc/config.class.php:50 inc/config.class.php:354 inc/process.class.php:393 +#: front/case.php:5 front/caselink.form.php:29 front/caselink.php:5 +#: front/process.form.php:27 front/process.php:5 inc/caselink.class.php:157 +#: inc/config.class.php:50 inc/config.class.php:363 inc/process.class.php:409 #: inc/profile.class.php:52 inc/profile.class.php:83 msgid "ProcessMaker" msgstr "ProcessMaker" -#: front/processmaker.form.php:85 +#: front/processmaker.form.php:80 msgid "Task re-assigned!" msgstr "Task re-assigned!" -#: front/processmaker.form.php:87 +#: front/processmaker.form.php:82 msgid "Error re-assigning task: " msgstr "Error re-assigning task: " -#: front/processmaker.form.php:90 -msgid "Task already assigned to this person!" -msgstr "Task already assigned to this person!" +#: front/processmaker.form.php:93 +#| msgid "Task name" +msgid "Task un-claimed!" +msgstr "Task un-claimed!" + +#: front/processmaker.form.php:95 +msgid "" +"Can't un-claim task! Verify 'Assignement Rules' in the process definition." +msgstr "" +"Can't un-claim task! Verify 'Assignement Rules' in the process definition." #: front/processmaker.helpdesk.form.php:21 msgid "Process - Case" msgstr "Process - Case" -#: front/processmaker.helpdesk.form.php:24 inc/case.class.php:605 +#: front/processmaker.helpdesk.form.php:24 inc/case.class.php:799 msgid "Select the process you want to add" msgstr "Select the process you want to add" -#: hook.php:31 inc/taskcategory.class.php:98 +#: hook.php:9 inc/taskcategory.class.php:214 msgid "Synchronize Task List" msgstr "Synchronize Task List" -#: hook.php:158 inc/case.class.php:77 +#: hook.php:76 inc/case.class.php:89 msgid "Case" msgstr "Case" -#: hook.php:158 inc/case.class.php:586 inc/case.class.php:1062 +#: hook.php:76 inc/case.class.php:778 inc/case.class.php:1355 msgid "Status" msgstr "Status" -#: inc/case.class.php:23 inc/case.class.php:90 inc/case.class.php:92 +#: inc/case.class.php:25 inc/case.class.php:102 inc/case.class.php:104 msgid "Process case" msgid_plural "Process cases" msgstr[0] "Process case" msgstr[1] "Process cases" -#: inc/case.class.php:80 +#: inc/case.class.php:92 msgid "Sub-case" msgstr "Sub-case" -#: inc/case.class.php:312 +#: inc/case.class.php:303 +#, php-format +msgid "" +"Task un-claimed!
Case: %s
Task: \"%s\" has been " +"un-assigned from \"%s\" and assigned to \"%s\" group.
Reason: %s" +msgstr "" +"Task un-claimed!
Case: %s
Task: \"%s\" has been " +"un-assigned from \"%s\" and assigned to \"%s\" group.
Reason: %s" + +#: inc/case.class.php:420 +#, php-format +msgid "" +"Task re-assigned!
Case: %s
Task: \"%s\" has " +"been re-assigned from \"%s\" to \"%s\".
Reason: %s" +msgstr "" +"Task re-assigned!
Case: %s
Task: \"%s\" has " +"been re-assigned from \"%s\" to \"%s\".
Reason: %s" + +#: inc/case.class.php:429 +#, php-format +msgid "" +"Task assigned!
Case: %s
Task: \"%s\" has been " +"assigned to \"%s\".
Reason: %s" +msgstr "" +"Task assigned!
Case: %s
Task: \"%s\" has been " +"assigned to \"%s\".
Reason: %s" + +#: inc/case.class.php:510 msgid "Current task(s) properties" msgstr "Current task(s) properties" -#: inc/case.class.php:316 inc/task.class.php:263 +#: inc/case.class.php:514 inc/task.class.php:283 msgid "Task" msgstr "Task" -#: inc/case.class.php:317 inc/task.class.php:264 +#: inc/case.class.php:515 inc/task.class.php:284 msgid "Task guid" msgstr "Task guid" -#: inc/case.class.php:318 inc/task.class.php:265 +#: inc/case.class.php:516 inc/task.class.php:285 msgid "Current user" msgstr "Current user" -#: inc/case.class.php:319 inc/task.class.php:266 +#: inc/case.class.php:517 inc/task.class.php:286 msgid "Task delegation date" msgstr "Task delegation date" -#: inc/case.class.php:341 inc/task.class.php:275 +#: inc/case.class.php:539 inc/task.class.php:295 msgid "To be claimed" msgstr "To be claimed" -#: inc/case.class.php:377 +#: inc/case.class.php:575 msgid "Sub-case properties" msgstr "Sub-case properties" -#: inc/case.class.php:380 +#: inc/case.class.php:578 msgid "Parent case properties" msgstr "Parent case properties" -#: inc/case.class.php:382 +#: inc/case.class.php:580 msgid "Case properties" msgstr "Case properties" -#: inc/case.class.php:387 inc/case.class.php:584 inc/case.class.php:1036 -#: inc/process.class.php:548 +#: inc/case.class.php:585 inc/case.class.php:776 inc/case.class.php:1328 +#: inc/process.class.php:576 msgid "Process" msgstr "Process" -#: inc/case.class.php:388 +#: inc/case.class.php:586 inc/notificationtargetprocessmaker.class.php:64 msgid "Case title" msgstr "Case title" -#: inc/case.class.php:389 +#: inc/case.class.php:587 msgid "Case number" msgstr "Case number" -#: inc/case.class.php:390 +#: inc/case.class.php:588 msgid "Case status" msgstr "Case status" -#: inc/case.class.php:391 +#: inc/case.class.php:589 msgid "Case guid" msgstr "Case guid" -#: inc/case.class.php:392 +#: inc/case.class.php:590 msgid "Creator" msgstr "Creator" -#: inc/case.class.php:393 +#: inc/case.class.php:591 inc/case.class.php:1370 msgid "Creation date" msgstr "Creation date" -#: inc/case.class.php:394 +#: inc/case.class.php:592 msgid "Last update" msgstr "Last update" -#: inc/case.class.php:479 +#: inc/case.class.php:675 #, php-format msgid "Case is linked to a %1s" msgstr "Case is linked to a %1s" -#: inc/case.class.php:481 +#: inc/case.class.php:677 #, php-format msgid "Sub-case is linked to a %1s" msgstr "Sub-case is linked to a %1s" -#: inc/case.class.php:506 +#: inc/case.class.php:698 msgid "Case cancellation" msgstr "Case cancellation" -#: inc/case.class.php:507 +#: inc/case.class.php:699 msgid "Cancel case" msgstr "Cancel case" -#: inc/case.class.php:511 +#: inc/case.class.php:703 msgid "Confirm cancellation?" msgstr "Confirm cancellation?" -#: inc/case.class.php:511 inc/profile.class.php:23 +#: inc/case.class.php:703 inc/profile.class.php:23 msgid "Cancel" msgstr "Cancel" -#: inc/case.class.php:532 +#: inc/case.class.php:717 msgid "Case deletion" msgstr "Case deletion" -#: inc/case.class.php:533 -msgid "Delete case" -msgstr "Delete case" - -#: inc/case.class.php:585 inc/case.class.php:1029 +#: inc/case.class.php:777 inc/case.class.php:1321 msgid "Title" msgstr "Title" -#: inc/case.class.php:587 inc/case.class.php:1070 +#: inc/case.class.php:779 inc/case.class.php:1362 msgid "Sub-case of" msgstr "Sub-case of" -#: inc/case.class.php:602 +#: inc/case.class.php:796 msgid "Add a new case" msgstr "Add a new case" -#: inc/case.class.php:995 +#: inc/case.class.php:1227 msgctxt "case_status" msgid "Draft" msgstr "Draft" -#: inc/case.class.php:996 +#: inc/case.class.php:1228 msgctxt "case_status" msgid "To do" msgstr "To do" -#: inc/case.class.php:997 +#: inc/case.class.php:1229 msgctxt "case_status" msgid "Completed" msgstr "Completed" -#: inc/case.class.php:998 +#: inc/case.class.php:1230 msgctxt "case_status" msgid "Cancelled" msgstr "Cancelled" -#: inc/case.class.php:1022 +#: inc/case.class.php:1314 msgid "ID" msgstr "ID" -#: inc/case.class.php:1049 +#: inc/case.class.php:1335 inc/notificationtargetprocessmaker.class.php:72 +#| msgid "Item entity" +msgid "Item type" +msgstr "Item type" + +#: inc/case.class.php:1342 msgid "Item" msgstr "Item" -#: inc/case.class.php:1056 +#: inc/case.class.php:1349 msgid "Item entity" msgstr "Item entity" -#: inc/casechangelog.class.php:35 +#: inc/case.class.php:1379 +#| msgid "Last update" +msgid "Last update date" +msgstr "Last update date" + +#: inc/case.class.php:1392 +#, php-format +#| msgid "Case status" +msgid "Case status is '%s'" +msgstr "Case status is '%s'" + +#: inc/casechangelog.class.php:36 msgid "Change log" msgstr "Change log" -#: inc/casedynaform.class.php:80 +#: inc/casedynaform.class.php:83 msgid "Dynaforms" msgstr "Dynaforms" -#: inc/casehistory.class.php:35 +#: inc/casehistory.class.php:36 msgid "History" msgstr "History" @@ -266,43 +351,51 @@ msgstr "Case-links" msgid "Case-link" msgstr "Case-link" -#: inc/caselink.class.php:75 inc/caselink.class.php:165 +#: inc/caselink.class.php:75 +msgid "Synchronous" +msgstr "Synchronous" + +#: inc/caselink.class.php:80 inc/caselink.class.php:179 msgid "External data" msgstr "External data" -#: inc/caselink.class.php:80 inc/caselink.class.php:171 +#: inc/caselink.class.php:85 inc/caselink.class.php:185 msgid "Self" msgstr "Self" -#: inc/caselink.class.php:85 inc/caselink.class.php:189 +#: inc/caselink.class.php:90 inc/caselink.class.php:203 msgid "Source task GUID" msgstr "Source task GUID" -#: inc/caselink.class.php:93 inc/caselink.class.php:195 +#: inc/caselink.class.php:98 inc/caselink.class.php:209 msgid "Target task GUID" msgstr "Target task GUID" -#: inc/caselink.class.php:101 inc/caselink.class.php:207 +#: inc/caselink.class.php:106 inc/caselink.class.php:221 msgid "Target process GUID" msgstr "Target process GUID" -#: inc/caselink.class.php:110 inc/caselink.class.php:201 +#: inc/caselink.class.php:115 inc/caselink.class.php:215 msgid "Target dynaform GUID" msgstr "Target dynaform GUID" -#: inc/caselink.class.php:115 inc/caselink.class.php:213 +#: inc/caselink.class.php:120 inc/caselink.class.php:227 msgid "Source condition" msgstr "Source condition" -#: inc/caselink.class.php:121 inc/caselink.class.php:177 +#: inc/caselink.class.php:126 inc/caselink.class.php:191 msgid "Claim target task" msgstr "Claim target task" -#: inc/caselink.class.php:126 inc/caselink.class.php:183 +#: inc/caselink.class.php:136 +msgid "Impersonate target task user" +msgstr "Impersonate target task user" + +#: inc/caselink.class.php:141 inc/caselink.class.php:197 msgid "External application JSON config" msgstr "External application JSON config" -#: inc/casemap.class.php:43 +#: inc/casemap.class.php:44 msgid "Map" msgstr "Map" @@ -311,187 +404,303 @@ msgid "ProcessMaker setup" msgstr "ProcessMaker setup" #: inc/config.class.php:159 -msgid "Server URL (must be in same domain than GLPI)" -msgstr "Server URL (must be in same domain than GLPI)" +#| msgid "Server URL (must be in same domain than GLPI)" +msgid "" +"Server URL (must be in same domain than GLPI, if GLPI is using HTTPS, PM " +"server must also use HTTPS)" +msgstr "" +"Server URL (must be in same domain than GLPI, if GLPI is using HTTPS, PM " +"server must also use HTTPS)" -#: inc/config.class.php:164 +#: inc/config.class.php:163 msgid "Common domain with GLPI" msgstr "Common domain with GLPI" -#: inc/config.class.php:193 +#: inc/config.class.php:192 msgid "None!" msgstr "None!" -#: inc/config.class.php:202 +#: inc/config.class.php:201 +msgid "Verify SSL certificate" +msgstr "Verify SSL certificate" + +#: inc/config.class.php:206 msgid "Workspace Name" msgstr "Workspace Name" -#: inc/config.class.php:207 +#: inc/config.class.php:211 msgid "Server administrator name" msgstr "Server administrator name" -#: inc/config.class.php:212 +#: inc/config.class.php:216 msgid "Server administrator password" msgstr "Server administrator password" -#: inc/config.class.php:218 inc/config.class.php:258 +#: inc/config.class.php:222 inc/config.class.php:262 msgid "Connection status" msgstr "Connection status" -#: inc/config.class.php:234 +#: inc/config.class.php:238 msgid "SQL server setup" msgstr "SQL server setup" -#: inc/config.class.php:237 +#: inc/config.class.php:241 msgid "SQL server (MariaDB or MySQL)" msgstr "SQL server (MariaDB or MySQL)" -#: inc/config.class.php:242 +#: inc/config.class.php:246 msgid "Database name" msgstr "Database name" -#: inc/config.class.php:247 +#: inc/config.class.php:251 msgid "SQL user" msgstr "SQL user" -#: inc/config.class.php:252 +#: inc/config.class.php:256 msgid "SQL password" msgstr "SQL password" -#: inc/config.class.php:269 +#: inc/config.class.php:273 msgid "Theme Name" msgstr "Theme Name" -#: inc/config.class.php:275 +#: inc/config.class.php:279 msgid "Main Task Category (edit to change name)" msgstr "Main Task Category (edit to change name)" -#: inc/config.class.php:282 +#: inc/config.class.php:286 msgid "Task Writer (edit to change name)" msgstr "Task Writer (edit to change name)" -#: inc/config.class.php:302 +#: inc/config.class.php:306 msgid "Group in ProcessMaker which will contain all GLPI users" msgstr "Group in ProcessMaker which will contain all GLPI users" -#: inc/config.class.php:331 +#: inc/config.class.php:321 inc/process.class.php:510 inc/process.class.php:637 +msgid "Max cases per item (0=unlimited)" +msgstr "Max cases per item (0=unlimited)" + +#: inc/config.class.php:340 msgid "Processmaker system information" msgstr "Processmaker system information" -#: inc/config.class.php:334 inc/config.class.php:344 +#: inc/config.class.php:343 inc/config.class.php:353 msgid "Version" msgstr "Version" -#: inc/config.class.php:335 +#: inc/config.class.php:344 msgid "Web server" msgstr "Web server" -#: inc/config.class.php:336 +#: inc/config.class.php:345 msgid "Server name" msgstr "Server name" -#: inc/config.class.php:337 +#: inc/config.class.php:346 msgid "PHP version" msgstr "PHP version" -#: inc/config.class.php:338 +#: inc/config.class.php:347 msgid "DB version" msgstr "DB version" -#: inc/config.class.php:339 +#: inc/config.class.php:348 msgid "DB server IP" msgstr "DB server IP" -#: inc/config.class.php:340 +#: inc/config.class.php:349 msgid "DB name" msgstr "DB name" -#: inc/config.class.php:341 +#: inc/config.class.php:350 msgid "User browser" msgstr "User browser" -#: inc/config.class.php:342 +#: inc/config.class.php:351 msgid "User IP" msgstr "User IP" -#: inc/config.class.php:344 +#: inc/config.class.php:353 msgid "Not yet!" msgstr "Not yet!" -#: inc/process.class.php:350 +#: inc/notificationtargetcase.class.php:26 +msgid "Send email" +msgstr "Send email" + +#: inc/notificationtargetcase.class.php:37 +msgid "eMail recipients" +msgstr "eMail recipients" + +#: inc/notificationtargetprocessmaker.class.php:60 +#| msgid "Process case" +#| msgid_plural "Process cases" +msgid "Process category" +msgstr "Process category" + +#: inc/notificationtargetprocessmaker.class.php:61 +#| msgid "Process case" +#| msgid_plural "Process cases" +msgid "Process category id" +msgstr "Process category id" + +#: inc/notificationtargetprocessmaker.class.php:62 +#| msgid "Process case task" +#| msgid_plural "Process case tasks" +msgid "Process category comment" +msgstr "Process category comment" + +#: inc/notificationtargetprocessmaker.class.php:63 +#| msgid "Case guid" +msgid "Case id" +msgstr "Case id" + +#: inc/notificationtargetprocessmaker.class.php:65 +#| msgid "Case deletion" +msgid "Case description" +msgstr "Case description" + +#: inc/notificationtargetprocessmaker.class.php:67 +msgid "Case variable 'XXX'" +msgstr "Case variable 'XXX'" + +#: inc/notificationtargetprocessmaker.class.php:68 +msgid "List of values in 'YYY' array" +msgstr "List of values in 'YYY' array" + +#: inc/notificationtargetprocessmaker.class.php:69 +msgid "Number of rows in 'YYY' array" +msgstr "Number of rows in 'YYY' array" + +#: inc/notificationtargetprocessmaker.class.php:70 +msgid "Value for colname in 'YYY' array" +msgstr "Value for colname in 'YYY' array" + +#: inc/notificationtargetprocessmaker.class.php:71 +msgid "Value for key in 'ZZZ' assoc array (1-dimension array)" +msgstr "Value for key in 'ZZZ' assoc array (1-dimension array)" + +#: inc/notificationtargetprocessmaker.class.php:73 +#| msgid "Item" +msgid "Item id" +msgstr "Item id" + +#: inc/notificationtargetprocessmaker.class.php:74 +#| msgid "Item" +msgid "Item URL" +msgstr "Item URL" + +#: inc/notificationtargetprocessmaker.class.php:75 +#| msgid "Item entity" +msgid "Item title" +msgstr "Item title" + +#: inc/notificationtargetprocessmaker.class.php:83 +msgid "XXX is to be replaced by any case variable names" +msgstr "XXX is to be replaced by any case variable names" + +#: inc/notificationtargetprocessmaker.class.php:86 +msgid "YYY is to be replaced by any array variables" +msgstr "YYY is to be replaced by any array variables" + +#: inc/notificationtargetprocessmaker.class.php:90 +msgid "" +"ZZZ is to be replaced by any assoc array variables (1-dimension array with " +"key/value pairs)" +msgstr "" +"ZZZ is to be replaced by any assoc array variables (1-dimension array with " +"key/value pairs)" + +#: inc/notificationtargettask.class.php:195 +#| msgid "Task delegation date" +msgid "Task action" +msgstr "Task action" + +#: inc/process.class.php:366 msgid "Synchronize Process List" msgstr "Synchronize Process List" -#: inc/process.class.php:427 inc/process.class.php:589 +#: inc/process.class.php:443 inc/process.class.php:617 msgid "Process GUID" msgstr "Process GUID" -#: inc/process.class.php:433 +#: inc/process.class.php:449 msgid "Process type" msgstr "Process type" -#: inc/process.class.php:439 +#: inc/process.class.php:455 msgid "Hide case num. & title" msgstr "Hide case num. & title" -#: inc/process.class.php:445 +#: inc/process.class.php:461 msgid "Insert Task Category" msgstr "Insert Task Category" -#: inc/process.class.php:457 +#: inc/process.class.php:473 msgid "Ticket type (self-service)" msgstr "Ticket type (self-service)" -#: inc/process.class.php:464 inc/process.class.php:609 +#: inc/process.class.php:480 inc/process.class.php:642 msgid "Visible in Incident for Central interface" msgstr "Visible in Incident for Central interface" -#: inc/process.class.php:470 inc/process.class.php:614 +#: inc/process.class.php:486 inc/process.class.php:647 msgid "Visible in Request for Central interface" msgstr "Visible in Request for Central interface" -#: inc/process.class.php:476 inc/process.class.php:666 +#: inc/process.class.php:492 inc/process.class.php:699 msgid "Visible in Change" msgstr "Visible in Change" -#: inc/process.class.php:482 inc/process.class.php:671 +#: inc/process.class.php:498 inc/process.class.php:704 msgid "Visible in Problem" msgstr "Visible in Problem" -#: inc/process.class.php:519 +#: inc/process.class.php:504 +msgid "Maintenance" +msgstr "Maintenance" + +#: inc/process.class.php:547 msgctxt "process_type" msgid "Classic" msgstr "Classic" -#: inc/process.class.php:520 +#: inc/process.class.php:548 msgctxt "process_type" msgid "BPMN" msgstr "BPMN" -#: inc/process.class.php:546 +#: inc/process.class.php:574 msgid "Processes" msgstr "Processes" -#: inc/process.class.php:599 +#: inc/process.class.php:627 msgid "Hide case number and title in task descriptions" msgstr "Hide case number and title in task descriptions" -#: inc/process.class.php:604 +#: inc/process.class.php:632 msgid "Insert Task Category comments in Task Description" msgstr "Insert Task Category comments in Task Description" -#: inc/process.class.php:619 +#: inc/process.class.php:652 msgid "ITIL Category for Self-service interface (left empty to disable)" msgstr "ITIL Category for Self-service interface (left empty to disable)" -#: inc/process.class.php:646 +#: inc/process.class.php:679 msgid "Type for Self-service interface" msgstr "Type for Self-service interface" -#: inc/process.class.php:676 +#: inc/process.class.php:709 msgid "Process type (to be changed only if not up-to-date)" msgstr "Process type (to be changed only if not up-to-date)" +#: inc/process.class.php:862 +#, php-format +#| msgid "" +#| "ProcessMaker plugin is under maintenance, please retry later, thank you." +msgid "Process '%s' is under maintenance, please retry later, thank you." +msgstr "Process '%s' is under maintenance, please retry later, thank you." + #: inc/process_profile.class.php:26 inc/process_profile.class.php:45 msgid "Authorizations" msgstr "Authorizations" @@ -510,35 +719,44 @@ msgctxt "errors" msgid "Can't create case: no rights for it!" msgstr "Can't create case: no rights for it!" -#: inc/processmaker.class.php:984 +#: inc/processmaker.class.php:1012 msgid "Syncs GLPI users and groups into ProcessMaker." msgstr "Syncs GLPI users and groups into ProcessMaker." -#: inc/processmaker.class.php:986 +#: inc/processmaker.class.php:1014 msgid "Cleaning of orphan cases." msgstr "Cleaning of orphan cases." -#: inc/processmaker.class.php:986 +#: inc/processmaker.class.php:1014 msgid "Number of days to keep orphan cases" msgstr "Number of days to keep orphan cases" -#: inc/processmaker.class.php:988 +#: inc/processmaker.class.php:1016 msgid "To apply task actions between cases." msgstr "To apply task actions between cases." -#: inc/processmaker.class.php:1696 +#: inc/processmaker.class.php:1720 msgid "Case title: " msgstr "Case title: " -#: inc/processmaker.class.php:2178 +#: inc/processmaker.class.php:2275 msgid "A 'Case' is running!" msgstr "A 'Case' is running!" -#: inc/processmaker.class.php:2179 +#: inc/processmaker.class.php:2276 msgid "You must manage it first (see 'Process - Case' tab)!" msgstr "You must manage it first (see 'Process - Case' tab)!" -#: inc/processmaker.class.php:3038 +#: inc/processmaker.class.php:2774 +#, php-format +msgid "" +"Unable to derivate case! Retry in a moment, or ask your administrator." +"
Error code: %u
Error message: %s
" +msgstr "" +"Unable to derivate case! Retry in a moment, or ask your administrator." +"
Error code: %u
Error message: %s
" + +#: inc/processmaker.class.php:3281 msgid "" "ProcessMaker plugin is under maintenance, please retry later, thank you." msgstr "" @@ -552,36 +770,62 @@ msgstr "Process configuration" msgid "Cases" msgstr "Cases" +#: inc/profile.class.php:23 +msgid "Ad Hoc user re-assign" +msgstr "Ad Hoc user re-assign" + #: inc/task.class.php:29 msgid "Process case task" msgid_plural "Process case tasks" msgstr[0] "Process case task" msgstr[1] "Process case tasks" -#: inc/task.class.php:258 +#: inc/task.class.php:278 msgid "Sub-case task(s)" msgstr "Sub-case task(s)" -#: inc/taskcategory.class.php:21 inc/taskcategory.class.php:31 +#: inc/taskcategory.class.php:24 inc/taskcategory.class.php:116 +#| msgid "Process case" +#| msgid_plural "Process cases" +msgid "Process task" +msgstr "Process task" + +#: inc/taskcategory.class.php:29 +#| msgid "Task List" +msgid "Task list" +msgstr "Task list" + +#: inc/taskcategory.class.php:39 msgid "Task List" msgstr "Task List" -#: inc/taskcategory.class.php:32 +#: inc/taskcategory.class.php:40 inc/taskcategory.class.php:118 msgid "Task name" msgstr "Task name" -#: inc/taskcategory.class.php:34 inc/taskcategory.class.php:60 +#: inc/taskcategory.class.php:42 inc/taskcategory.class.php:68 +#: inc/taskcategory.class.php:121 inc/taskcategory.class.php:155 msgid "Start" msgstr "Start" -#: inc/taskcategory.class.php:35 +#: inc/taskcategory.class.php:43 inc/taskcategory.class.php:122 msgid "Task GUID" msgstr "Task GUID" -#: inc/taskcategory.class.php:38 inc/taskcategory.class.php:78 +#: inc/taskcategory.class.php:46 inc/taskcategory.class.php:86 +#: inc/taskcategory.class.php:125 inc/taskcategory.class.php:173 msgid "Sub-process" msgstr "Sub-process" +#: inc/taskcategory.class.php:117 +#| msgid "Process case" +#| msgid_plural "Process cases" +msgid "Process name" +msgstr "Process name" + +#~ msgid "Delete case" +#~ msgstr "Delete case" + #~ msgid "Case item" #~ msgstr "Case item" diff --git a/processmaker.xml b/processmaker.xml index 983992e..f189806 100644 --- a/processmaker.xml +++ b/processmaker.xml @@ -29,15 +29,15 @@ 9.1 - 3.4.14 + 3.4.25 9.2 - 3.5.5 + 3.5.10 9.3 - 3.6.5 + 3.6.16 9.4 diff --git a/setup.php b/setup.php index a70fb89..1afeba4 100644 --- a/setup.php +++ b/setup.php @@ -1,6 +1,6 @@ 'plugin_item_update_processmaker_satisfaction']; + $hooks = ['TicketSatisfaction' => 'plugin_item_update_processmaker_satisfaction', + 'User' => 'plugin_item_update_processmaker_user']; foreach ($objects as $obj) { $hooks[$obj.'Task'] = 'plugin_item_update_processmaker_tasks'; } @@ -91,6 +92,7 @@ function plugin_init_processmaker() { } $PLUGIN_HOOKS['item_get_pdfdatas']['processmaker'] = $hooks; + // Javascript $plugin = new Plugin(); if ($plugin->isActivated('processmaker') && Session::getLoginUserID() ) {