From ca197c9f435b891010f22bd80d9ebe2795294eaa Mon Sep 17 00:00:00 2001 From: tomolimo Date: Wed, 7 Oct 2020 15:40:05 +0200 Subject: [PATCH] Cherry pick from 3.5.10 to 3.6.16 Added feature GLPI_TASK_PREVENT_REASSIGN to prevent assignment of a list of users (can be PM UID, GLPI id, GLPI logon) to a specific task (can be task list) Cherry pick from 3.4.24 to 3.6.15 Cherry pick from 3.4.23 Added a proxy and SSL mangement to external application calls Added an escape DB for ticket name and ticket solution description Updated translation Added swingcall.php file (to test swing api) Set version to 3.6.14 Cherry pick from version 3.4.22 Added a new case variable to be able to create information tasks GLPI_ITEM_INFORMATION_TASK Cherry pick from 3.4.21 Revert back $_REQUEST into $_POST cherry pick from version 3.4.20 Added Send reminder Added unclaim task Rewrite some code for clearer maintenance commented line HTTPROXY setup Bugfixe : remove the default setting of a followup bugfixes: - list the processes according to the type of ticket (request or incident). - set variable 'content' according to the variable sent by processmaker in the addItemFollowup function - logged error information of curl Set content to tinymce content field Bugfixes : Update the taskId (value and letter case) Bugfixes requests. bad syntax with the new ORM Changed folder properties Changed text Deleted unused param Added a hook to manage the change of user login Cleaning of unused code Set version to 3.6.8 add condition to set user = admin when script is run in crontask fixes --- ajax/dropdownUsers.php | 5 - ajax/task_users.php | 125 ++++- front/processmaker.form.php | 105 ++-- front/processmaker.helpdesk.form.php | 2 +- hook.php | 51 +- inc/case.class.php | 225 ++++++-- inc/caselink.class.php | 11 + inc/config.class.php | 2 +- inc/notificationtargetprocessmaker.class.php | 7 +- inc/notificationtargettask.class.php | 147 +++--- inc/processmaker.class.php | 169 ++++-- inc/task.class.php | 123 +++-- inc/user.class.php | 26 + install/mysql/processmaker-empty.sql | 2 +- install/update.php | 4 + install/update_3_4_9_to_3_4_10.php | 12 + js/cases.helpdesk.js | 10 +- locales/fr_FR.mo | Bin 9870 -> 14622 bytes locales/fr_FR.po | 508 ++++++++++++------ locales/source.po | 516 ++++++++++++++----- processmaker.xml | 6 +- setup.php | 6 +- 22 files changed, 1477 insertions(+), 585 deletions(-) create mode 100644 install/update_3_4_9_to_3_4_10.php 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 @@ } //} -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 @@ 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']]]); + '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 ""; -Html::closeForm(true); +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 @@ // 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 @@ } } - 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); - - // $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']['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); + } elseif (isset($_POST['reminder'])) { + // send notification remider as requested for this task - // $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); - // } - // } + $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']); + + // 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 @@ function in_array_recursive($needle, $haystack) { 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 c03179c..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)) { @@ -376,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']); + } - $response = curl_exec ($ch); + if (isset($externalapplication['proxy'])) { + curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1 ) ; + curl_setopt($ch, CURLOPT_PROXY, $externalapplication['proxy']); + } - //Toolbox::logDebug( $response ) ; + $response = curl_exec ($ch); + if ($response === false) { + //throw new Exception(curl_error($ch), curl_errno($ch)); + Toolbox::logDebug( curl_error($ch).":".curl_errno($ch) ); + } curl_close ($ch); } diff --git a/inc/case.class.php b/inc/case.class.php index cd03c0a..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 @@ function unpauseCase($delIndex, $userGuid) { } + /** + * 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 @@ function unpauseCase($delIndex, $userGuid) { * @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 @@ function reassignCase($delIndex, $taskGuid, $delThread, $users_id_source, $users 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 @@ function reassignCase($delIndex, $taskGuid, $delThread, $users_id_source, $users * @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 ); @@ -298,37 +417,68 @@ public function reassignTask ($delIndex, $newDelIndex, $delThread, $newDelThread ] ); - // 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 - ]); + // 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 { - $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 - ]); + $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 */ @@ -719,16 +869,13 @@ static function showForItem(CommonITILObject $item) { 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 @@ function rawSearchOptions() { 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 @@ static function showConfigForm($item) { 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 63eed6f..cb11f33 100644 --- a/inc/notificationtargetprocessmaker.class.php +++ b/inc/notificationtargetprocessmaker.class.php @@ -10,7 +10,12 @@ * @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 diff --git a/inc/notificationtargettask.class.php b/inc/notificationtargettask.class.php index 3e1868f..1deff80 100644 --- a/inc/notificationtargettask.class.php +++ b/inc/notificationtargettask.class.php @@ -12,18 +12,33 @@ // 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')], - 'task_done' => ['event' => 'task_done_', 'label' => __('Task done')] + 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 @@ -54,9 +69,7 @@ public function getEvents() { $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; @@ -67,9 +80,9 @@ public function getEvents() { } $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']; - $actions[$defaultEvents['task_done']['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $defaultEvents['task_done']['label']; + foreach($defaultEvents as $events) { + $actions[$events['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $events['label']; + } } return $actions; @@ -82,7 +95,7 @@ public function getEvents() { 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; @@ -98,8 +111,8 @@ public function addDataForTemplate($event, $options = []) { $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']; @@ -133,13 +146,18 @@ public function addDataForTemplate($event, $options = []) { $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; - $tech->getFromDB($taskobj->fields['users_id_tech']); - $this->data['##task.user.login##'] = $tech->fields['name']; - if (isset($options['old_users_id_tech'])) { - $oldtech = new User; - $oldtech->getFromDB($options['old_users_id_tech']); + 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']; } @@ -215,6 +233,11 @@ function addAdditionalTargets($event = '') { $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')); @@ -230,12 +253,35 @@ function addAdditionalTargets($event = '') { */ 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); @@ -253,72 +299,15 @@ function addSpecificTargets($data, $options) { } } - } - - - /** - * Add user assigned to task - * - * @param array $options Options - * - * @return void - */ - 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); - } - } + $this->obj = $obj; } /** - * Add group assigned to the task - * - * @param array $options Options - * - * @return void + * Summary of addOldAssignTechnician + * @param $options */ - 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 3ff5deb..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 @@ static function getPMErrorMessage($value) { 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; @@ -1330,9 +1330,9 @@ static function cronPMUsers($task) { // 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 @@ public function addTask($cases_id, $itemtype, $items_id, $caseInfo, $delIndex, $ $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 @@ public function addTask($cases_id, $itemtype, $items_id, $caseInfo, $delIndex, $ $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 @@ public function addTask($cases_id, $itemtype, $items_id, $caseInfo, $delIndex, $ $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; @@ -1889,6 +1912,24 @@ public function addTask($cases_id, $itemtype, $items_id, $caseInfo, $delIndex, $ } + /** + * 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 @@ public function setItemStatus($itemtype, $itemId, $newstatus) { * @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 @@ public function setItemDuedate($itemtype, $itemId, $duedate) { * @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 @@ public function setItemSolution($itemType, $itemId, $casevariablevalues) { 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 @@ function computeTaskDuration($begin, $end, $entity) { * '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; @@ -2170,8 +2215,10 @@ public function solveTask($cases_id, $delIndex, $options = []) { // restore current glpi time $_SESSION["glpi_currenttime"] = $saved_date_time; + return $glpi_task; } + return false; } /** @@ -2313,10 +2360,24 @@ static function multiexplode($delimiters, $string) { */ 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 @@ -2329,7 +2390,7 @@ public static function pre_show_item_processmaker($params) { } 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 @@ -2602,7 +2663,10 @@ public function saveForm($request) { // ### 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" ); @@ -2924,7 +2988,7 @@ public function startNewCase($processes_id, $itemtype, $items_id, $users_id = nu */ 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'); @@ -2975,12 +3039,18 @@ public function derivateCase($myCase, $request, $users_id = null) { "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); @@ -3074,20 +3144,23 @@ public function derivateCase($myCase, $request, $users_id = null) { // reset those variables $resetcasevariables = []; foreach ($casevariables as $val) { - $resetcasevariables[$val] = ''; + if (!empty($casevariablevalues[$val])) { + $resetcasevariables[$val] = ''; + } } $resultSave = $myCase->sendVariables($resetcasevariables); // 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') { @@ -3118,6 +3191,38 @@ public function derivateCase($myCase, $request, $users_id = null) { // 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 @@ function getFromDB($items_id) { 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 @@ static function displayTabContentForItem(CommonGLPI $case, $tabnum = 1, $withtem } 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 @@ static function displayTabContentForItem(CommonGLPI $case, $tabnum = 1, $withtem $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 @@ function urldecode(url) { } }); "); + } + + + /** + * 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 @@ public static function getGLPIUserId($pmUserId) { return 0; } + /** * Summary of getPMUserId * returns processmaker user id for given GLPI user id @@ -309,6 +310,31 @@ public static function getPMUserId($glpiUserId) { 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 9299adb384a3ff982f23e3e750803bb6acc8462d..a72879c76d0b1aa022fc544db053320a77fab2f7 100644 GIT binary patch literal 14622 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 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:93 +#| msgid "Task name" +msgid "Task un-claimed!" +msgstr "Annulation de l'affectation de la tâche effectuée !" -#: 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: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 57e65b1..f189806 100644 --- a/processmaker.xml +++ b/processmaker.xml @@ -29,15 +29,15 @@ 9.1 - 3.4.17 + 3.4.25 9.2 - 3.5.6 + 3.5.10 9.3 - 3.6.6 + 3.6.16 9.4 diff --git a/setup.php b/setup.php index e82b62c..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() ) {