Merge pull request #110 from tomolimo/3.6/bugfixes

3.6/bugfixes
This commit is contained in:
tomolimo
2020-10-07 15:43:16 +02:00
committed by GitHub
22 changed files with 1649 additions and 655 deletions

View File

@@ -87,11 +87,6 @@ $count = 0;
}
//}
if (!function_exists('dpuser_cmp')) {
function dpuser_cmp($a, $b) {
return strcasecmp($a, $b);
}
}
$datas = [];

View File

@@ -18,31 +18,120 @@ if (!defined('GLPI_ROOT')) {
Session::checkLoginUser();
$commoninputs = "<input type='hidden' name='items_id' value='".$_REQUEST['items_id']."'>".
"<input type='hidden' name='itemtype' value='".$_REQUEST['itemtype']."'>".
"<input type='hidden' name='cases_id' value='".$_REQUEST['cases_id']."'>".
"<input type='hidden' name='delIndex' value='".$_REQUEST['delIndex']."'>".
"<input type='hidden' name='users_id' value='".$_REQUEST['users_id']."'>".
"<input type='hidden' name='taskGuid' value='".$_REQUEST['taskGuid']."'>".
"<input type='hidden' name='delThread' value='".$_REQUEST['delThread']."'>".
"<input type='hidden' name='tasktype' value='".$_REQUEST['tasktype']."'>".
"<input type='hidden' name='tasks_id' value='".$_REQUEST['tasks_id']."'>";
$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 "<form style='margin-bottom: 0px' name='processmaker_form_task$rand-".$_REQUEST['delIndex']."' id='processmaker_form_task$rand-".$_REQUEST['delIndex']."' method='post' action='".Toolbox::getItemTypeFormURL("PluginProcessmakerProcessmaker")."'>";
echo __('Re-assign task to', 'processmaker')."&nbsp;";
echo "<input type='hidden' name='action' value='unpausecase_or_reassign_or_delete'>";
echo "<input type='hidden' name='items_id' value='".$_REQUEST['items_id']."'>";
echo "<input type='hidden' name='itemtype' value='".$_REQUEST['itemtype']."'>";
echo "<input type='hidden' name='cases_id' value='".$_REQUEST['cases_id']."'>";
echo "<input type='hidden' name='delIndex' value='".$_REQUEST['delIndex']."'>";
echo "<input type='hidden' name='users_id' value='".$_REQUEST['users_id']."'>";
echo "<input type='hidden' name='taskGuid' value='".$_REQUEST['taskGuid']."'>";
echo "<input type='hidden' name='delThread' value='".$_REQUEST['delThread']."'>";
echo "<input type='hidden' name='action' value='reassign_reminder'>";
echo "<input type='hidden' name='comment' value=''>";
echo $commoninputs;
$can_unclaim = false; // by default
$query = "SELECT TAS_GROUP_VARIABLE FROM TASK WHERE TAS_UID='".$_REQUEST['taskGuid']."' AND TAS_ASSIGN_TYPE='SELF_SERVICE';";
$res = $PM_DB->query($query);
if ($PM_DB->numrows($res) > 0) {
$can_unclaim = true;
}
PluginProcessmakerUser::dropdown( ['name' => 'users_id_recipient',
'value' => $_REQUEST['users_id'],
'used' => [$_REQUEST['users_id']],
'entity' => 0, //$item->fields["entities_id"], // not used, as any user can be assigned to any tasks
'entity_sons' => false, // not used, as any user can be assigned to any tasks
'right' => 'all',
'rand' => $rand,
'width' => '',
'specific_tags' => ['taskGuid' => $_REQUEST['taskGuid']]]);
echo "&nbsp;&nbsp;";
echo "<input type='submit' name='reassign' value='".__('Re-assign', 'processmaker')."' class='submit'>";
Html::closeForm(true);
'value' => $_REQUEST['users_id'],
'used' => $_REQUEST['used'],
'entity' => 0, //$item->fields["entities_id"], // not used, as any user can be assigned to any tasks
'entity_sons' => false, // not used, as any user can be assigned to any tasks
'right' => 'all',
'rand' => $rand,
'width' => '',
'specific_tags' => ['taskGuid' => $_REQUEST['taskGuid']]
]);
echo "&nbsp;&nbsp;";
echo "<input type='submit' name='reassign$rand' value='".__('Re-assign', 'processmaker')."' class='submit'>";
echo "<input type='submit' name='reassign' value='".__('Re-assign', 'processmaker')."' class='submit' style='display:none'>";
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
}
$('<div id=reassign$rand></div>').appendTo($('#processmaker_form_task$rand-".$_REQUEST['delIndex']."'));
var locDlg = $('#reassign$rand').html(content + '<p><textarea id=comment$rand rows=6 cols=60></textarea></p><font color=red>Input at least 10 words in English to justify.</font>').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<br/>(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 "&nbsp;&nbsp;";
echo "<input type='submit' name='reminder' value='".__('Send reminder', 'processmaker')."' class='submit'>";
}
Html::closeForm(true);

View File

@@ -62,7 +62,7 @@ switch ($_POST["action"]) {
// Must show it...
//
$rand = rand( );
Html::redirect($CFG_GLPI['root_doc']."/plugins/processmaker/front/processmaker.helpdesk.form.php?processes_id=".$_POST['plugin_processmaker_processes_id']."&case_guid=".$resultCase->caseId."&rand=$rand&itilcategories_id=".$_POST["itilcategories_id"]."&type=".$_REQUEST["type"]."&entities_id=".$_REQUEST['entities_id']);
Html::redirect($CFG_GLPI['root_doc']."/plugins/processmaker/front/processmaker.helpdesk.form.php?processes_id=".$_POST['plugin_processmaker_processes_id']."&case_guid=".$resultCase->caseId."&rand=$rand&itilcategories_id=".$_POST["itilcategories_id"]."&type=".$_POST["type"]."&entities_id=".$_POST['entities_id']);
} else {
Session::addMessageAfterRedirect( PluginProcessmakerProcessmaker::getPMErrorMessage($resultCase->status_code)."<br>$resultCase->message ($resultCase->status_code)", true, ERROR);
@@ -70,94 +70,55 @@ switch ($_POST["action"]) {
}
}
break;
break;
case 'unpausecase_or_reassign_or_delete' :
if (isset($_POST['unpause'])) {
case 'reassign_reminder' :
if (isset($_POST['reassign'])) {
// here we should re-assign the current task to $_POST['users_id_recipient']
$locCase = new PluginProcessmakerCase;
$locCase->getFromDB($_POST['cases_id']);
$pmResultUnpause = $locCase->unpauseCase($_POST['delIndex'], $_POST['users_id']);
if ($pmResultUnpause->status_code == 0) {
Html::back();
} else {
echo "Error unpausing case: ".$pmResultUnpause->message." \n";
}
} else if (isset($_POST['reassign'])) {
// here we should re-assign the current task to $_POST['users_id_recipient']
//$GLPINewPMUserId = PluginProcessmakerUser::getPMUserId( $_POST['users_id_recipient'] );
if ($_POST['users_id'] != $_POST['users_id_recipient'] && $_POST['users_id_recipient'] != 0) { // normally should be different as of the dropdown prevents already used
$locCase = new PluginProcessmakerCase;
$locCase->getFromDB($_POST['cases_id']);
if ($_POST['users_id_recipient'] != 0) {
// we are assigning a new tech to a task
$pmResponse = $locCase->reassignCase($_POST['delIndex'],
$_POST['taskGuid'],
$_POST['delThread'],
$_POST['users_id'],
$_POST['users_id_recipient']);
$_POST['users_id_recipient'],
['comment' => $_POST['comment']]);
if ($pmResponse) {
Session::addMessageAfterRedirect(__('Task re-assigned!', 'processmaker'), true, INFO);
} else {
Session::addMessageAfterRedirect(__('Error re-assigning task: ', 'processmaker').$pmResponse->message, true, ERROR);
}
} else {
if ($_POST['users_id_recipient'] == 0) {
Session::addMessageAfterRedirect(__('Can\'t un-assign Task!', 'processmaker'), true, ERROR);
} elseif ($_POST['users_id_recipient'] == 0) {
// we are unassigning a task, i.e.: task un-claim
$pmResponse = $locCase->unassignCase($_POST['delIndex'],
$_POST['taskGuid'],
$_POST['tasktype'],
$_POST['tasks_id'],
$_POST['itemtype'],
['comment' => $_POST['comment']]);
if ($pmResponse) {
Session::addMessageAfterRedirect(__('Task un-claimed!', 'processmaker'), true, INFO);
} else {
if ($_POST['users_id'] === $_POST['users_id_recipient'] ) { // normally should be different as of the dropdown prevents already used
Session::addMessageAfterRedirect(__('Task already assigned to this person!', 'processmaker'), true, ERROR);
}
Session::addMessageAfterRedirect(__("Can't un-claim task! Verify 'Assignement Rules' in the process definition.", 'processmaker'), true, ERROR);
}
}
//} else if (isset($_POST['delete'])) {
// // delete case from case table, this will also delete the tasks
// $locCase = new PluginProcessmakerCase;
// if ($locCase->getFromDB($_POST['cases_id']) && $locCase->deleteCase()) {
// // request delete from pm itself
// $PM_SOAP->login(true);
} elseif (isset($_POST['reminder'])) {
// send notification remider as requested for this task
// $resultPM = $PM_SOAP->deleteCase($locCase->fields['case_guid']);
$locCase = new PluginProcessmakerCase;
$locCase->getFromDB($_POST['cases_id']);
$glpi_item = new $_POST['itemtype'];
$glpi_item->getFromDB($_POST['items_id']);
$pm_task = new PluginProcessmakerTask($_POST['tasktype']);
$pm_task->getFromDB($_POST['tasks_id']);
$glpi_task = new $_POST['tasktype'];
$glpi_task->getFromDB($_POST['tasks_id']);
// if ($resultPM->status_code == 0) {
// Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['deleted'], true, INFO);
// } else {
// Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errordeleted'], true, ERROR);
// }
// } else {
// Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errordeleted'], true, ERROR);
// }
//} else if (isset($_POST['cancel'])) {
// // cancel case from PM
// $locCase = new PluginProcessmakerCase;
// $locCase->getFromDB($_POST['cases_id']);
// $resultPM = $PM_SOAP->cancelCase($locCase->fields['case_guid']); //, $_POST['plugin_processmaker_del_index'], $_POST['plugin_processmaker_users_id'] ) ;
// if ($resultPM->status_code === 0) {
// //$locCase = new PluginProcessmakerCase;
// //$locCase->getFromDB($_POST['cases_id']);
// if ($locCase->cancelCase()) {
// Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['cancelled'], true, INFO);
// } else {
// Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errorcancelled'], true, ERROR);
// }
// } else {
// if ($resultPM->status_code == 100 && $locCase->deleteCase()) { // case is draft then delete it
// // request delete from pm itself
// $PM_SOAP->login(true);
// $resultPM = $PM_SOAP->deleteCase($locCase->fields['case_guid']);
// if ($resultPM->status_code == 0) {
// Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['deleted'], true, INFO);
// } else {
// Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errordeleted'], true, ERROR);
// }
// } else {
// Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['errorcancelled']. " " . $resultPM->message, true, ERROR);
// }
// }
// send notification now!
$pm_task->sendNotification('task_reminder', $glpi_task, $glpi_item, $locCase);
}
break;
}
// to return to item

View File

@@ -247,7 +247,7 @@ Html::helpHeader(__('New ticket'), $_SERVER['PHP_SELF'], $_SESSION["glpiname"]);
if (isset($_REQUEST['case_guid'])) {
$res = $DB->request(
'glpi_plugin_processmaker_cases', [
' case_guid'=>$_REQUEST['case_guid']
'case_guid'=>$_REQUEST['case_guid']
]);
$query = "SELECT * FROM glpi_plugin_processmaker_cases WHERE case_guid='".$_REQUEST['case_guid']."'";
//$res = $DB->query( $query );

View File

@@ -180,7 +180,10 @@ function plugin_pre_item_update_processmaker(CommonITILObject $parm) {
* @param mixed $parm is the object
*/
function plugin_item_update_processmaker_satisfaction($parm) {
global $PM_SOAP;
if (Session::isCron()) { // Task cron log with user admin
$PM_SOAP->login(true);
}
$cases = PluginProcessmakerCase::getIDsFromItem('Ticket', $parm->fields['tickets_id']);
foreach ($cases as $cases_id) {
$locCase = new PluginProcessmakerCase;
@@ -192,6 +195,33 @@ function plugin_item_update_processmaker_satisfaction($parm) {
}
/**
* Summary of plugin_item_update_processmaker_user
* When a user login is changed, then must change it in the PM tables
* @param User $param is the user being changed
*/
function plugin_item_update_processmaker_user(User $param) {
// Must test if user login has been changed
// if yes, must change the login in the PM tables:
// USERS and RBAC_USERS, othewise the link in the processmaker_users table will be invalid
if (in_array('name', $param->updates)) {
// check if user is in the processmaker_user table
$pm_user = PluginProcessmakerUser::getPMUserId($param->getID());
if ($pm_user) {
// must update the user in PM tables
global $PM_SOAP;
if ($param->fields['is_active'] == 0 || $param->fields['is_deleted'] == 1) {
$status = "INACTIVE";
} else {
$status = "ACTIVE";
}
$PM_SOAP->login(true);
$pmResult = $PM_SOAP->updateUser( $pm_user, $param->fields['name'], $param->fields['firstname'], $param->fields['realname'], $status );
}
}
}
function plugin_processmaker_post_init() {
global $PM_DB, $PM_SOAP;
if (!isset($PM_DB)) {
@@ -241,10 +271,11 @@ function plugin_item_update_processmaker_tasks($parm) {
$locCase->getFromDB($pmTask->fields['plugin_processmaker_cases_id']);
$srccase_guid = $locCase->fields['case_guid'];
$msg = ' $locCase: '.str_replace("\n", "\n ", print_r($locCase, true))."\n";
$msg .= ' $task: '.str_replace("\n", "\n ", print_r($parm, true))."\n";
$msg .= ' $pmTask: '.str_replace("\n", "\n ", print_r($pmTask, true))."\n";
$msg .= "\n";
//$msg = Toolbox::backtrace(false);
//$msg .= ' $locCase: '.str_replace("\n", "\n ", print_r($locCase, true))."\n";
//$msg .= ' $task: '.str_replace("\n", "\n ", print_r($parm, true))."\n";
//$msg .= ' $pmTask: '.str_replace("\n", "\n ", print_r($pmTask, true))."\n";
//$msg .= "\n";
foreach ($DB->request( 'glpi_plugin_processmaker_caselinks', "is_active = 1 AND sourcetask_guid='".$pmTaskCat->fields['pm_task_guid']."'") as $targetTask) {
@@ -289,17 +320,17 @@ function plugin_item_update_processmaker_tasks($parm) {
unset( $infoForTasks[ $casevar ] );
}
$msg .= " ***********\n";
$msg .= ' $targetTask: '.str_replace("\n", "\n ", print_r($targetTask, true))."\n";
//$msg .= " ***********\n";
//$msg .= ' $targetTask: '.str_replace("\n", "\n ", print_r($targetTask, true))."\n";
$targetTask['sourcecondition'] = str_replace( array_keys($infoForTasks), $infoForTasks, $targetTask['sourcecondition'] );
$eval = eval( "return (".$targetTask['sourcecondition']." ? 1 : 0);" );
$msg .= ' $infoForTasks: '.str_replace("\n", "\n ", print_r($infoForTasks, true))."\n";
$msg .= ' $targetTask[\'sourcecondition\']: '.str_replace("\n", "\n ", print_r($targetTask['sourcecondition'], true))."\n";
$msg .= ' $result: '."$eval\n";
$msg .= "\n";
//$msg .= ' $infoForTasks: '.str_replace("\n", "\n ", print_r($infoForTasks, true))."\n";
//$msg .= ' $targetTask[\'sourcecondition\']: '.str_replace("\n", "\n ", print_r($targetTask['sourcecondition'], true))."\n";
//$msg .= ' $result: '."$eval\n";
//$msg .= "\n";
if ($eval) {
// look at each linked ticket if a case is attached and then if a task like $val is TO_DO
@@ -375,15 +406,22 @@ function plugin_item_update_processmaker_tasks($parm) {
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Content-Length: ' . strlen($externalapplicationparams), 'Expect:']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $pmconfig->fields['ssl_verify']);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $pmconfig->fields['ssl_verify']);
//curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1 ) ;
//curl_setopt($ch, CURLOPT_PROXY, "localhost:8889");
if (isset($externalapplication['ssl_verify'])) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $externalapplication['ssl_verify']);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, $externalapplication['ssl_verify']);
}
if (isset($externalapplication['proxy'])) {
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1 ) ;
curl_setopt($ch, CURLOPT_PROXY, $externalapplication['proxy']);
}
$response = curl_exec ($ch);
//Toolbox::logDebug( $response ) ;
if ($response === false) {
//throw new Exception(curl_error($ch), curl_errno($ch));
Toolbox::logDebug( curl_error($ch).":".curl_errno($ch) );
}
curl_close ($ch);
}
@@ -429,8 +467,8 @@ function plugin_item_update_processmaker_tasks($parm) {
}
$msg .= "================\n";
Toolbox::logInFile("processmaker", $msg);
//$msg .= "================\n";
//Toolbox::logInFile("processmaker", $msg);
}
}

View File

@@ -14,6 +14,8 @@ class PluginProcessmakerCase extends CommonDBTM {
//static public $items_id = 'items_id'; // Field name
static $rightname = 'plugin_processmaker_case';
private $process = null;
const DRAFT = 'DRAFT';
const TO_DO = 'TO_DO';
const COMPLETED = 'COMPLETED';
@@ -221,6 +223,123 @@ class PluginProcessmakerCase extends CommonDBTM {
}
/**
* Summary of unassignCase
* Will unassign the delIndex task, restoring the assigned group
* @param $delIndex int the delegation index
* @param $taskGuid string the GUID of the task
* @param $tasktype string the type of task (TicketTask, ChangeTask, ProblemTask)
* @param $tasks_id int the id of the task
* @param $itemtype string the type of the ITIL object (Ticket, Change, Problem)
* @return bool
*/
function unassignCase($delIndex, $taskGuid, $tasktype, $tasks_id, $itemtype, $options) {
global $PM_DB, $PM_SOAP, $DB;
// un-claim task
// will unclaim the task
// to unclaim a task, we must un-assign the task in the APP_DELEGATION table
// and un-assign the task in glpi_itemtypeTask table
$groupname = '';
// should get the group that is assigned to the task in SELF_SERVICE assign type
$query = "SELECT TAS_GROUP_VARIABLE FROM TASK WHERE TAS_UID='".$taskGuid."' AND TAS_ASSIGN_TYPE='SELF_SERVICE' LIMIT 1;";
foreach($PM_DB->request($query) as $pmGroup) {
// should have only one record
if ($pmGroup['TAS_GROUP_VARIABLE'] == '') {
// then we are in the self-service with a group in the TASK_USER table
// TU_RELATION=2 is groups and TU_TYPE=1 means normal (= not adhoc)
// then get the group name from the CONTENT table
$query = "SELECT CONTENT.CON_VALUE FROM TASK_USER
JOIN CONTENT ON CONTENT.CON_ID=TASK_USER.USR_UID AND CONTENT.CON_CATEGORY='GRP_TITLE' AND CONTENT.CON_LANG = 'en'
WHERE TASK_USER.TAS_UID='".$taskGuid."' AND TASK_USER.TU_RELATION=2 AND TASK_USER.TU_TYPE=1 LIMIT 1;";
foreach ($PM_DB->request($query) as $onlyrec) {
$groupname = $onlyrec['CON_VALUE'];
}
} else {
// then we are in the self-service with a case variable that contains either a group either an array of users
// array of users is not yet supported by PM plugin, as GLPI tasks have one and only one users_id_tech.
// group guid (in the case variable) must be retrieved from APP DATA
// TODO
////////////////////////////////////////////////////////////////
// Currently this case is not manageable by GLPI
// as GLPI needs at least a user or a group to be assigned to a task
// and when using the self-service value based assignment, there
// is a case variable that contains a list of users. This list of users cannot be mapped to a group in GLI
// OR may be we may create an artificial group in GLPI that would contains the list of users
////////////////////////////////////////////////////////////////
// and then we get the name of the group from the CONTENT table
//$query = "SELECT CON_VALUE FROM CONTENT
// WHERE CONTENT.CON_ID='$groupId' AND CONTENT.CON_CATEGORY='GRP_TITLE' AND CONTENT.CON_LANG='en' ;";
}
}
$groups_id_tech = PluginProcessmakerProcessmaker::getGLPIGroupId($groupname);
if ($groups_id_tech) {
// unclaim the case only when a GLPI group can be found
$query = "UPDATE APP_DELEGATION SET USR_UID='', DEL_INIT_DATE=NULL, USR_ID=0 WHERE APP_NUMBER=".$this->getID()." AND DEL_INDEX=$delIndex;";
$PM_DB->query($query);
$glpi_task = new $tasktype;
$glpi_task->getFromDB($tasks_id);
$foreignkey = getForeignKeyFieldForItemType( $itemtype );
$donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState(false); // do not send notification yet
$glpi_task->update( ['id' => $glpi_task->getID(),
$foreignkey => $glpi_task->fields[$foreignkey],
'users_id_tech' => 0,
'groups_id_tech' => $groups_id_tech,
'update' => true] );
PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif);
// send notification now!
$pm_task = new PluginProcessmakerTask($tasktype);
$pm_task->getFromDB($tasks_id);
$glpi_item = new $itemtype;
$glpi_item->getFromDB($glpi_task->fields[$foreignkey]);
$pm_task->sendNotification('task_unclaim', $glpi_task, $glpi_item, $this);
// create an information task and add comment
$pm_process = $this->getProcess();
$dbu = new DbUtils;
$info = __('<b>Task un-claimed!</b><br/><b>Case: </b>%s<br/><b>Task: </b>"%s" has been un-assigned from "%s" and assigned to "%s" group.<br/><b>Reason: </b>%s', 'processmaker');
$info .= "<input name='caseid' type='hidden' value='".$this->getID()."'><input name='taskid' type='hidden' value='".$pm_task->getID()."'>";
$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 <br/>
$info = str_replace(["\\'", '\\"', '\r\n', '\r', '\n'], ["'", '"', '<br>', '<br>', '<br>'], $info);
$glpi_task->add([$foreignkey => $glpi_task->fields[$foreignkey],
'is_private' => 0, // a post-only user can't create private task
'taskcategories_id' => $pm_process->fields['taskcategories_id'],
'content' => $DB->escape($info),
'users_id' => $PM_SOAP->taskWriter,
'state' => Planning::INFO,
'users_id_tech' => Session::getLoginUserID(),
]);
return true;
}
return false;
}
/**
* Summary of reassignCase
* @param mixed $delIndex
@@ -230,7 +349,7 @@ class PluginProcessmakerCase extends CommonDBTM {
* @param mixed $users_id_target
* @return mixed
*/
function reassignCase($delIndex, $taskGuid, $delThread, $users_id_source, $users_id_target) {
function reassignCase($delIndex, $taskGuid, $delThread, $users_id_source, $users_id_target, $options) {
global $PM_SOAP;
$users_guid_source = ''; // by default
if ($users_id_source !== 0) { // when task is not 'to be claimed'
@@ -253,7 +372,7 @@ class PluginProcessmakerCase extends CommonDBTM {
break;
}
}
$this->reassignTask($delIndex, $newDelIndex, $delThread, $newDelThread, $users_id_target );
$this->reassignTask($delIndex, $newDelIndex, $delThread, $newDelThread, $users_id_target, $options);
return true;
}
return false;
@@ -266,15 +385,15 @@ class PluginProcessmakerCase extends CommonDBTM {
* @param mixed $newDelIndex
* @param mixed $newTech
*/
public function reassignTask ($delIndex, $newDelIndex, $delThread, $newDelThread, $newTech) {
global $DB;
public function reassignTask ($delIndex, $newDelIndex, $delThread, $newDelThread, $newTech, $options) {
global $DB, $PM_SOAP;
$dbu = new DbUtils;
$pm_task_row = $dbu->getAllDataFromTable(PluginProcessmakerTask::getTable(), ['plugin_processmaker_cases_id' => $this->getID(), 'del_index' => $delIndex, 'del_thread' => $delThread]);
if ($pm_task_row && count($pm_task_row) == 1) {
$pm_task_row = array_shift($pm_task_row);
$glpi_task = new $pm_task_row['itemtype'];
$glpi_task->getFromDB( $pm_task_row['items_id'] );
$glpi_task->getFromDB($pm_task_row['items_id']);
$itilobject_itemtype = $this->fields['itemtype'];
$foreignkey = getForeignKeyFieldForItemType( $itilobject_itemtype );
@@ -289,37 +408,7 @@ class PluginProcessmakerCase extends CommonDBTM {
'update' => true] );
PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif);
// Notification management
// search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id']
$res = PluginProcessmakerNotificationTargetTask::getNotifications('task_update', $glpi_task->fields['taskcategories_id'], $this->fields['entities_id']);
if ($res['notifications'] && count($res['notifications']) > 0) {
$pm_task = new PluginProcessmakerTask($pm_task_row['itemtype']);
$pm_task->getFromDB($pm_task_row['items_id']);
NotificationEvent::raiseEvent($res['event'],
$pm_task,
['plugin_processmaker_cases_id' => $this->getID(),
'itemtype' => $pm_task_row['itemtype'],
'task_id' => $glpi_task->getID(),
'old_users_id_tech' => $glpi_task->oldvalues['users_id_tech'],
'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0,
'entities_id' => $this->fields['entities_id'],
'case' => $this
]);
} else {
$item = new $itilobject_itemtype;
$item->getFromDB($glpi_task->fields[$foreignkey]);
NotificationEvent::raiseEvent('update_task',
$item,
['plugin_processmaker_cases_id' => $this->getID(),
'itemtype' => $pm_task_row['itemtype'],
'task_id' => $glpi_task->getID(),
'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0
]);
}
// then update the delIndex and delThread
//$query = "UPDATE glpi_plugin_processmaker_tasks SET del_index = $newDelIndex, del_thread = $newDelThread WHERE id={$row['id']}; ";
//$res = $DB->query($query);
$DB->Update( 'glpi_plugin_processmaker_tasks', [
'del_index' => $newDelIndex,
'del_thread' => $newDelThread
@@ -327,10 +416,69 @@ class PluginProcessmakerCase extends CommonDBTM {
'id' => $pm_task_row['id']
]
);
// send notification now!
$pm_task = new PluginProcessmakerTask($pm_task_row['itemtype']);
$pm_task->getFromDB($pm_task_row['items_id']);
$glpi_item = new $itilobject_itemtype;
$glpi_item->getFromDB($glpi_task->fields[$foreignkey]);
$pm_task->sendNotification('task_reassign', $glpi_task, $glpi_item, $this);
// create an information task and add comment
$pm_process = $this->getProcess();
$old_users_tech_id = isset($glpi_task->oldvalues['users_id_tech']) ? $glpi_task->oldvalues['users_id_tech'] : 0;
$taskCat = new TaskCategory;
$taskCat->getFromDB( $glpi_task->fields['taskcategories_id'] );
$task_name = DropdownTranslation::getTranslatedValue($glpi_task->fields['taskcategories_id'], 'TaskCategory', 'name', $_SESSION['glpilanguage'], $taskCat->fields['name']);
$new_tech_name = Html::clean($dbu->getUserName($newTech));
if ($old_users_tech_id) {
$info = __('<b>Task re-assigned!</b><br/><b>Case: </b>%s<br/><b>Task: </b>"%s" has been re-assigned from "%s" to "%s".<br/><b>Reason: </b>%s', 'processmaker');
$info = sprintf($info,
$this->getNameID(['forceid' => true]),
$task_name,
Html::clean($dbu->getUserName(isset($glpi_task->oldvalues['users_id_tech']) ? $glpi_task->oldvalues['users_id_tech'] : 0)),
$new_tech_name,
$options['comment']
);
} else {
$info = __('<b>Task assigned!</b><br/><b>Case: </b>%s<br/><b>Task: </b>"%s" has been assigned to "%s".<br/><b>Reason: </b>%s', 'processmaker');
$info = sprintf($info,
$this->getNameID(['forceid' => true]),
$task_name,
$new_tech_name,
$options['comment']
);
}
$info .= "<input name='caseid' type='hidden' value='".$this->getID()."'><input name='taskid' type='hidden' value='".$pm_task->getID()."'>";
// unescape some chars and replace CRLF, CR or LF by <br/>
$info = str_replace(["\\'", '\\"', '\r\n', '\r', '\n'], ["'", '"', '<br>', '<br>', '<br>'], $info);
$glpi_task->add([$foreignkey => $glpi_task->fields[$foreignkey],
'is_private' => 0, // a post-only user can't create private task
'taskcategories_id' => $pm_process->fields['taskcategories_id'],
'content' => $DB->escape($info),
'users_id' => $PM_SOAP->taskWriter,
'state' => Planning::INFO,
'users_id_tech' => Session::getLoginUserID(),
]);
}
}
/**
* Summary of getProcess
* Returns process object
* @return bool|PluginProcessmakerProcess
*/
function getProcess() {
$pm_process = new PluginProcessmakerProcess;
if (!$this->process && $pm_process->getFromDB($this->fields['plugin_processmaker_processes_id'])) {
$this->process = $pm_process;
}
return $this->process;
}
/**
* Summary of showCaseProperties
*/
@@ -721,16 +869,13 @@ class PluginProcessmakerCase extends CommonDBTM {
echo "<tr class='tab_bg_2'><td class='tab_bg_2'>";
echo __('Select the process you want to add', 'processmaker');
echo "</td><td class='tab_bg_2'>";
$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,

View File

@@ -271,4 +271,15 @@ class PluginProcessmakerCaselink extends CommonDBTM {
return $tab;
}
function prepareInputForUpdate($input) {
return Toolbox::unclean_cross_side_scripting_deep($input);
}
function prepareInputForAdd($input) {
return Toolbox::unclean_cross_side_scripting_deep($input);
}
}

View File

@@ -156,7 +156,7 @@ class PluginProcessmakerConfig extends CommonDBTM {
if (!$config->fields['maintenance']) {
echo "<tr class='tab_bg_1'>";
echo "<td >".__('Server URL (must be in same domain than GLPI)', 'processmaker')."</td><td >";
echo "<td >".__('Server URL (must be in same domain than GLPI, if GLPI is using HTTPS, PM server must also use HTTPS)', 'processmaker')."</td><td >";
echo "<input size='50' type='text' name='pm_server_URL' value='".$config->fields['pm_server_URL']."'>";
echo "</td></tr>\n";

View File

@@ -4,13 +4,18 @@
* PluginProcessmakerNotificationTargetProcessmaker short summary.
*
* PluginProcessmakerNotificationTargetProcessmaker description.
*
*
* Common notificationtarget class for cases and tasks
*
* @version 1.0
* @author MoronO
*/
class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarget {
class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTargetCommonITILObject {
const PM_USER_TYPE = 1000;
const OLD_TASK_TECH_IN_CHARGE = 1;
/**
* Summary of saveNotificationState
@@ -58,11 +63,16 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
'case.id' => __('Case id', 'processmaker'),
'case.title' => __('Case title', 'processmaker'),
'case.description' => __('Case description', 'processmaker'),
'case.url' => __('URL'),
'case.url' => __('Case URL'),
'var.XXX' => __('Case variable \'XXX\'', 'processmaker'),
'array.YYY' => __('List of values in \'YYY\' array', 'processmaker'),
'array.numberofYYY' => __('Number of rows in \'YYY\' array', 'processmaker'),
'array.YYY.colname' => __('Value for colname in case array \'YYY\'', 'processamker')
'array.YYY.colname' => __('Value for colname in \'YYY\' array', 'processmaker'),
'1darray.ZZZ.key' => __('Value for key in \'ZZZ\' assoc array (1-dimension array)', 'processmaker'),
'item.type' => __('Item type', 'processmaker'),
'item.id' => __('Item id', 'processmaker'),
'item.url' => __('Item URL', 'processmaker'),
'item.title' => __('Item title', 'processmaker')
];
foreach ($tags as $tag => $label) {
@@ -76,6 +86,9 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
$elt['allowed_values'] = [__('YYY is to be replaced by any array variables', 'processmaker')];
$elt['foreach'] = true;
}
if ($tag == '1darray.ZZZ.key') {
$elt['allowed_values'] = [__('ZZZ is to be replaced by any assoc array variables (1-dimension array with key/value pairs)', 'processmaker')];
}
$this->addTagToList($elt);
}
@@ -87,7 +100,7 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
* Get all data needed for template processing
**/
public function addDataForTemplate($event, $options = []) {
global $PM_DB, $CFG_GLPI;
global $CFG_GLPI, $PM_DB;
$excluded = ['_VAR_CHANGED_',
'PIN',
@@ -107,11 +120,6 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
$process->getFromDB($options['case']->fields['plugin_processmaker_processes_id']);
$taskcat_id = $process->fields['taskcategories_id'];
// set defaults to all
foreach ($this->tags as $key => $val) {
$this->data["##$key##"] = "-";
}
// get case variable values
$res = $PM_DB->query("SELECT APP_DATA, APP_TITLE, APP_DESCRIPTION FROM APPLICATION WHERE APP_NUMBER = ".$options['case']->fields['id']);
if ($res && $PM_DB->numrows($res) == 1) {
@@ -125,10 +133,16 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
// add numberof for count of rows
$this->data["##array.numberof$key##"] = count($val);
// get the keys/vals of the sub-array
foreach ($val as $row) {
foreach ($row as $col_name => $col_val) {
$this->data["array.$key"][]["##array.$key.$col_name##"] = $col_val;
$this->data["##lang.array.$key.$col_name##"] = $col_name;
foreach ($val as $attribute => $row) {
if (is_array($row)) {
$index = isset($this->data["array.$key"]) ? count($this->data["array.$key"]) : 0;
foreach ($row as $col_name => $col_val) {
$this->data["array.$key"][$index]["##array.$key.$col_name##"] = $col_val;
$this->data["##lang.array.$key.$col_name##"] = $col_name;
}
} else {
$this->data["1darray.$key"]["##array.$key.$attribute##"] = $row;
$this->data["##lang.1darray.$key.$attribute##"] = $attribute;
}
}
} else {
@@ -145,18 +159,29 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
$this->data['##case.id##'] = $options['case']->fields['id'];
// case URL
$this->data['##case.url##'] = $CFG_GLPI["url_base"]."/index.php?redirect=".urlencode("/plugins/processmaker/front/case.form.php?id=".$options['case']->fields['id']);
$this->data['##case.url##'] = $this->formatURL($options['additionnaloption']['usertype'],
urlencode(urlencode($CFG_GLPI["url_base"] .
PluginProcessmakerCase::getFormURLWithID($options['case']->fields['id'], false))));
// parent task information: meta data on process
// will get parent of task which is the process task category
$tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'name');
$tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'comment');
$tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'name');
$tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'comment');
// process title
$this->data['##process.categoryid##'] = $taskcat_id;
$this->data['##process.category##'] = $tmp_taskcatinfo['name'];
$this->data['##process.categorycomment##'] = $tmp_taskcatinfo['comment'];
// add labels
// add information about item that hosts the case
$item = new $options['case']->fields['itemtype'];
$item->getFromDB($options['case']->fields['items_id']);
$this->data['##item.type##'] = $item->getTypeName(1);
$this->data['##item.id##'] = sprintf("%07d", $options['case']->fields['items_id']); // to have items_id with 7 digits with leading 0
$this->data['##item.url##'] = $this->formatURL($options['additionnaloption']['usertype'],
urlencode(urlencode($CFG_GLPI["url_base"] .
$item::getFormURLWithID($options['case']->fields['items_id'], false))));
$this->data['##item.title##'] = HTML::entities_deep($item->fields['name']);
// add labels to tags that are not set
$this->getTags();
foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) {
if (!isset($this->data[$tag])) {
@@ -165,4 +190,36 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
}
}
/**
* Get header to add to content
**/
function getContentHeader() {
if ($this->getMode() == \Notification_NotificationTemplate::MODE_MAIL
&& MailCollector::getNumberOfActiveMailCollectors()
) {
return NotificationTargetTicket::HEADERTAG.' '.__('To answer by email, write above this line').' '.
NotificationTargetTicket::HEADERTAG;
}
return '';
}
/**
* Get footer to add to content
**/
function getContentFooter() {
if ($this->getMode() == \Notification_NotificationTemplate::MODE_MAIL
&& MailCollector::getNumberOfActiveMailCollectors()
) {
return NotificationTargetTicket::FOOTERTAG.' '.__('To answer by email, write under this line').' '.
NotificationTargetTicket::FOOTERTAG;
}
return '';
}
}

View File

@@ -12,17 +12,33 @@ if (!defined('GLPI_ROOT')) {
// Class NotificationTarget
class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotificationTargetProcessmaker {
/**
* Summary of getDefaultEvents
* @return array[]
*/
private static function getDefaultEvents() {
return ['task_add' => ['event' => 'task_add_', 'label' => __('New task')],
'task_update' => ['event' => 'task_update_', 'label' => __('Update of a task')]
return ['task_add' => ['event' => 'task_add_', 'label' => __('Task add'), 'glpi' => 'add_task'],
'task_reassign' => ['event' => 'task_reassign_', 'label' => __('Task re-assign'), 'glpi' => 'update_task'],
'task_unclaim' => ['event' => 'task_unclaim_', 'label' => __('Task un-claim'), 'glpi' => 'update_task'],
'task_done' => ['event' => 'task_done_', 'label' => __('Task done'), 'glpi' => 'update_task'],
'task_reminder' => ['event' => 'task_reminder_', 'label' => __('Task reminder'), 'glpi' => 'update_task']
];
}
/**
* Summary of getDefaultGLPIEvents
* Will return the GLPI default task event matching a self type
* @param string $type
* @return string
*/
static function getDefaultGLPIEvents($type) {
$events = self::getDefaultEvents();
return $events[$type]['glpi'];
}
/**
* Summary of getNotification
* @param mixed $evt
@@ -53,9 +69,7 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
$table = PluginProcessmakerTaskCategory::getTable();
$ptable = PluginProcessmakerProcess::getTable();
$query = "SELECT $table.taskcategories_id AS taskcat, $ptable.taskcategories_id AS ptaskcat FROM $table
LEFT JOIN $ptable ON $ptable.id=$table.plugin_processmaker_processes_id
WHERE $table.is_active = 1
AND $ptable.is_active = 1";
LEFT JOIN $ptable ON $ptable.id=$table.plugin_processmaker_processes_id";
$ptaskcats = [];
$temp = new TaskCategory;
@@ -66,8 +80,9 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
}
$temp->getFromDB($row['taskcat']);
$actions[$defaultEvents['task_add']['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $defaultEvents['task_add']['label'];
$actions[$defaultEvents['task_update']['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $defaultEvents['task_update']['label'];
foreach($defaultEvents as $events) {
$actions[$events['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $events['label'];
}
}
return $actions;
@@ -80,7 +95,7 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
public function addDataForTemplate($event, $options = []) {
global $PM_DB, $CFG_GLPI;
if (!isset($options['case'])) {
if (!isset($options['case']) || $options['case'] == null) {
$mycase = new PluginProcessmakerCase;
$mycase->getFromDB($options['plugin_processmaker_cases_id']);
$options['case'] = $mycase;
@@ -92,12 +107,12 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
$baseevent = $locevent[0].'_'.$locevent[1];
$taskcat_id = $locevent[2];
// task action: add or update
// task action: add, update or done
$this->data['##task.action##'] = $events[$baseevent]['label'];
// task category information: meta data on task
$tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'name');
$tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'comment');
$tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'name');
$tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'comment');
$this->data['##task.categoryid##'] = $taskcat_id;
$this->data['##task.category##'] = $tmp_taskcatinfo['name'];
$this->data['##task.categorycomment##'] = $tmp_taskcatinfo['comment'];
@@ -131,7 +146,21 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
$this->data['##task.lastupdater##'] = Html::clean($dbu->getUserName($taskobj->fields['users_id_editor']));
// task technician
$this->data['##task.user##'] = Html::clean($dbu->getUserName($taskobj->fields['users_id_tech']));
$this->data['##task.user##'] = '';
$this->data['##task.user.login##'] = ''; // by default
$tech = new User;
if ($taskobj->fields['users_id_tech'] > 0
&& $tech->getFromDB($taskobj->fields['users_id_tech'])) {
$this->data['##task.user##'] = Html::clean($dbu->getUserName($taskobj->fields['users_id_tech']));
$this->data['##task.user.login##'] = $tech->fields['name'];
}
$oldtech = new User;
if (isset($options['old_users_id_tech'])
&& $options['old_users_id_tech'] > 0
&& $oldtech->getFromDB($options['old_users_id_tech'])) {
$this->data['##task.former.user##'] = Html::clean($dbu->getUserName($options['old_users_id_tech']));
$this->data['##task.former.user.login##'] = $oldtech->fields['name'];
}
// task group technician
$this->data['##task.group##'] = Html::clean(Toolbox::clean_cross_side_scripting_deep(Dropdown::getDropdownName("glpi_groups", $taskobj->fields['groups_id_tech'])), true, 2, false);
@@ -146,7 +175,7 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
// task duration
$this->data['##task.time##'] = Html::timestampToString($taskobj->fields['actiontime'], false);
// add labels
// add labels to tags that are not set
$this->getTags();
foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) {
if (!isset($this->data[$tag])) {
@@ -173,6 +202,9 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
'task.categorycomment' => __('Category comment'),
'task.time' => __('Total duration'),
'task.user' => __('User assigned to task'),
'task.user.login' => __('User login assigned to task'),
'task.former.user' => __('Former user assigned to task'),
'task.former.user.login' => __('Former user login assigned to task'),
'task.group' => __('Group assigned to task'),
'task.begin' => __('Start date'),
'task.end' => __('End date'),
@@ -201,6 +233,11 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
$this->addTarget(Notification::TASK_ASSIGN_TECH, __('Technician in charge of the task'));
$this->addTarget(Notification::TASK_ASSIGN_GROUP, __('Group in charge of the task'));
$this->addTarget(Notification::OBSERVER_GROUP, __('Watcher group'));
$this->addTarget(Notification::OBSERVER, __('Watcher'));
$this->addTarget(Notification::AUTHOR, __('Requester'), PluginProcessmakerNotificationTargetProcessmaker::PM_USER_TYPE);
if (strpos($event, 'task_update_') === 0) {
$this->addTarget(Notification::OLD_TECH_IN_CHARGE,
__('Former technician in charge of the task'));
@@ -216,12 +253,35 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
*/
function addSpecificTargets($data, $options) {
//Look for all targets whose type is Notification::ITEM_USER
$obj = $this->obj;
$this->obj = $options['obj'];
switch ($data['type']) {
case PluginProcessmakerNotificationTargetProcessmaker::PM_USER_TYPE :
switch ($data['items_id']) {
//Send to the requester of the ITIL object
case Notification::AUTHOR :
$this->addItemAuthor();
break;
}
break;
case Notification::USER_TYPE :
switch ($data['items_id']) {
//Notification to the ITIL object's observer group
case Notification::OBSERVER_GROUP :
$this->addLinkedGroupByType(CommonITILActor::OBSERVER);
break;
//Notification to the ITIL object's observer user
case Notification::OBSERVER :
$this->addLinkedUserByType(CommonITILActor::OBSERVER);
break;
//Send to the ITIL object followup author
case Notification::TASK_ASSIGN_TECH :
$this->addTaskAssignUser($options);
@@ -239,72 +299,15 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
}
}
$this->obj = $obj;
}
/**
* Add user assigned to task
*
* @param array $options Options
*
* @return void
* Summary of addOldAssignTechnician
* @param $options
*/
function addTaskAssignUser($options = []) {
global $DB;
// In case of delete task pass user id
if (isset($options['task_users_id_tech'])) {
$query = $this->getDistinctUserSql()."
FROM `glpi_users` ".
$this->getProfileJoinSql()."
WHERE `glpi_users`.`id` = '".$options['task_users_id_tech']."'";
foreach ($DB->request($query) as $data) {
$this->addToRecipientsList($data);
}
} else if (isset($options['task_id'])) {
$dbu = new DbUtils;
$tasktable = $dbu->getTableForItemType($options['itemtype']); //getTableForItemType($this->obj->getType().'Task');
$query = $this->getDistinctUserSql()."
FROM `$tasktable`
INNER JOIN `glpi_users`
ON (`glpi_users`.`id` = `$tasktable`.`users_id_tech`)".
$this->getProfileJoinSql()."
WHERE `$tasktable`.`id` = '".$options['task_id']."'";
foreach ($DB->request($query) as $data) {
$this->addToRecipientsList($data);
}
}
}
/**
* Add group assigned to the task
*
* @param array $options Options
*
* @return void
*/
function addTaskAssignGroup($options = []) {
global $DB;
// In case of delete task pass user id
if (isset($options['task_groups_id_tech'])) {
$this->addForGroup(0, $options['task_groups_id_tech']);
} else if (isset($options['task_id'])) {
$dbu = new DbUtils;
$tasktable = $dbu->getTableForItemType($options['itemtype']); //getTableForItemType($this->obj->getType().'Task');
foreach ($DB->request([$tasktable, 'glpi_groups'], "`glpi_groups`.`id` = `$tasktable`.`groups_id_tech`
AND `$tasktable`.`id` = '".$options['task_id']."'") as $data) {
$this->addForGroup(0, $data['groups_id_tech']);
}
}
}
function addOldAssignTechnician($options = []) {
global $DB;

View File

@@ -84,7 +84,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
private $pmWorkspace = "";
private $pmAdminSession = false;
private $taskWriter = 0;
var $taskWriter = 0;
private $pm_group_guid = ''; // guid for default user group in Process Maker is used for all GLPI user synchronization into ProcessMaker
var $lasterror;
var $lang;
@@ -143,24 +143,24 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
public function addItemFollowup($itemtype, $itemId, $txtForFollowup, $users_id = null) {
global $DB;
$fu = new ITILFollowup();//new TicketFollowup();
$fu->getEmpty(); // to get default values
//$fu->getEmpty(); // to get default values
$input = $fu->fields;
if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_CONTENT'] )) {
if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_CONTENT']) && $txtForFollowup['GLPI_TICKET_FOLLOWUP_CONTENT'] != "" ) {
$input['content'] = $DB->escape($txtForFollowup['GLPI_TICKET_FOLLOWUP_CONTENT']);
}
if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_CONTENT'] )) {
if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_CONTENT']) && $txtForFollowup['GLPI_ITEM_FOLLOWUP_CONTENT'] != "" ) {
$input['content'] = $DB->escape($txtForFollowup['GLPI_ITEM_FOLLOWUP_CONTENT']);
}
if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE'] )) {
if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE'] ) && $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE'] != "") {
$input['is_private'] = $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE'];
}
if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_IS_PRIVATE'] )) {
if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_IS_PRIVATE'] ) && $txtForFollowup['GLPI_TICKET_FOLLOWUP_IS_PRIVATE'] != "") {
$input['is_private'] = $txtForFollowup['GLPI_ITEM_FOLLOWUP_IS_PRIVATE'];
}
if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_REQUESTTYPES_ID'] )) {
if (isset( $txtForFollowup['GLPI_TICKET_FOLLOWUP_REQUESTTYPES_ID'] ) && $txtForFollowup['GLPI_TICKET_FOLLOWUP_REQUESTTYPES_ID'] != "") {
$input['requesttypes_id'] = $txtForFollowup['GLPI_TICKET_FOLLOWUP_REQUESTTYPES_ID'];
}
if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_REQUESTTYPES_ID'] )) {
if (isset( $txtForFollowup['GLPI_ITEM_FOLLOWUP_REQUESTTYPES_ID'] ) && $txtForFollowup['GLPI_ITEM_FOLLOWUP_REQUESTTYPES_ID'] != "") {
$input['requesttypes_id'] = $txtForFollowup['GLPI_ITEM_FOLLOWUP_REQUESTTYPES_ID'];
}
$input['items_id'] = $itemId;//$input['tickets_id'] = $itemId;
@@ -385,9 +385,9 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
* routes a case (i.e., moves the case to the next task in the process according to its routing rules).
* Embedded routeCase() PM web service call (definition: http://wiki.processmaker.com/index.php/2.0/ProcessMaker_WSDL_Web_Services#routeCase.28.29)
* A session must be open before with login()
* @param $case_guid The case ID, which can be obtained with the caseList() function
* @param $delIndex The delegation index, which is a positive integer to identify the current task of the case. If empty then use current delIndex.
* @return a routeCaseResponse object, or false exception occured. routing is normalized to be always an array of routeListStruct
* @param $case_guid string The case GUID, which can be obtained with the caseList() function
* @param $delIndex integer The delegation index, which is a positive integer to identify the current task of the case. If empty then use current delIndex.
* @return stdClass|boolean routeCaseResponse object or false when exception occured. routing is normalized to be always an array of routeListStruct
*/
function routeCase($case_guid, $delIndex) {
try {
@@ -1330,9 +1330,9 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// insert into DB the link between glpi users and pm user
$pmuser = new PluginProcessmakerUser;
if ($pmuser->getFromDB( $user['id'] )) {
$pmuser->update( [ 'id' => $user['id'], 'pm_users_id' => $pmResult->userUID, 'password' => md5( $pass ) ] );
$pmuser->update( [ 'id' => $user['id'], 'pm_users_id' => $pmResult->userUID ] );
} else {
$pmuser->add( [ 'id' => $user['id'], 'pm_users_id' => $pmResult->userUID, 'password' => md5( $pass ) ] );
$pmuser->add( [ 'id' => $user['id'], 'pm_users_id' => $pmResult->userUID ] );
}
$actionCode = 1;
@@ -1747,8 +1747,25 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
$res = $PM_DB->request([
'SELECT' => 'CONTENT.CON_VALUE',
'FROM' => 'TASK_USER',
'INNER JOIN' => ['CONTENT' => ['AND' => ['FKEY' => ['CONTENT' => 'CON_ID', 'TASK_USER' => 'USR_UID'], ['CONTENT' => 'CON_CATEGORY', 'GRP_TITLE'], ['CONTENT' => 'CON_LANG', 'en']]]],
'WHERE' => ['AND' => ['TASK_USER.TAS_UID' => $pmTaskId, 'TASK_USER.TU_RELATION' => 2, 'TASK_USER.TU_TYPE' => 1]],
'INNER JOIN' => [
'CONTENT' => [
'AND' => [
'FKEY' => [
'CONTENT' => 'CON_ID',
'TASK_USER' => 'USR_UID'
],
['CONTENT.CON_CATEGORY' => 'GRP_TITLE'],
['CONTENT.CON_LANG' => 'en']
]
]
],
'WHERE' => [
'AND' => [
'TASK_USER.TAS_UID' => $pmTaskId,
'TASK_USER.TU_RELATION' => 2,
'TASK_USER.TU_TYPE' => 1
]
],
'LIMIT' => 1
]);
//$query = "SELECT CONTENT.CON_VALUE FROM TASK_USER
@@ -1758,7 +1775,13 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
$res = $PM_DB->request([
'SELECT' => 'CON_VALUE',
'FROM' => 'CONTENT',
'WHERE' => ['AND' => ['CONTENT.CON_ID' => $groupId, 'CONTENT.CON_CATEGORY' => 'GRP_TITLE', 'CONTENT.CON_LANG' => 'en']]
'WHERE' => [
'AND' => [
'CONTENT.CON_ID' => $groupId,
'CONTENT.CON_CATEGORY' => 'GRP_TITLE',
'CONTENT.CON_LANG' => 'en'
]
]
]);
//$query = "SELECT CON_VALUE FROM CONTENT
// WHERE CONTENT.CON_ID='$groupId' AND CONTENT.CON_CATEGORY='GRP_TITLE' AND CONTENT.CON_LANG='en' ;";
@@ -1809,7 +1832,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
$input['is_private'] = 0;
$input['actiontime'] = 0;
$input['state'] = 1; // == TO_DO
$input['state'] = Planning::TODO; // == TO_DO
$input['users_id_tech'] = 0; // by default as it can't be empty
if ($techId) {
$input['users_id_tech'] = $techId;
@@ -1854,41 +1877,59 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
//$query = "INSERT INTO glpi_plugin_processmaker_tasks (items_id, itemtype, plugin_processmaker_cases_id, plugin_processmaker_taskcategories_id, del_index, del_thread)
// VALUES ({$glpi_task->getId()}, '{$glpi_task->getType()}', $cases_id, {$pmtaskcat->fields['id']}, $delIndex, $delThread);";
//$DB->query( $query );
//}
// send notification if needed for new task as now we have the PluginProcessmakerTask in the DB
$donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState($options['notif']);
// Notification management
$item = new $itemtype;
$item->getFromDB($items_id);
// search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id']
$res = PluginProcessmakerNotificationTargetTask::getNotifications('task_add', $glpi_task->fields['taskcategories_id'], $item->fields['entities_id']);
if ($res['notifications'] && count($res['notifications']) > 0) {
$pm_task = new PluginProcessmakerTask($glpi_task->getType());
$pm_task->getFromDB($glpi_task->getId());
NotificationEvent::raiseEvent($res['event'],
$pm_task,
['plugin_processmaker_cases_id' => $cases_id,
'itemtype' => $glpi_task->getType(),
'task_id' => $glpi_task->getID(),
'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0,
'entities_id' => $item->fields['entities_id']
]);
} else {
NotificationEvent::raiseEvent('add_task',
$item,
['plugin_processmaker_cases_id' => $cases_id,
'itemtype' => $itemtype,
'task_id' => $glpi_task->getID(),
'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0
]);
}
PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif);
}
// send notification if needed for new task as now we have the PluginProcessmakerTask in the DB
$donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState($options['notif']);
// Notification management
$item = new $itemtype;
$item->getFromDB($items_id);
// search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id']
$res = PluginProcessmakerNotificationTargetTask::getNotifications('task_add', $glpi_task->fields['taskcategories_id'], $item->fields['entities_id']);
if ($res['notifications'] && count($res['notifications']) > 0) {
$pm_task = new PluginProcessmakerTask($glpi_task->getType());
$pm_task->getFromDB($glpi_task->getId());
NotificationEvent::raiseEvent($res['event'],
$pm_task,
['plugin_processmaker_cases_id' => $cases_id,
'itemtype' => $glpi_task->getType(),
'task_id' => $glpi_task->getID(),
'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0,
'entities_id' => $item->fields['entities_id']
]);
} else {
NotificationEvent::raiseEvent('add_task',
$item,
['plugin_processmaker_cases_id' => $cases_id,
'itemtype' => $itemtype,
'task_id' => $glpi_task->getID(),
'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0
]);
}
PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif);
}
/**
* Summary of getGLPIGroupId
* returns GLPI group id from pm group name
* returns false when not found
* @param string $pmGroupName
* @return bool|integer
*/
static function getGLPIGroupId(string $pmGroupName) {
global $DB;
$query = "SELECT id AS glpi_group_id FROM glpi_groups WHERE name LIKE '$pmGroupName';";
$res = $DB->query($query);
if ($DB->numrows($res) > 0) {
$row = $DB->fetch_array($res);
return $row['glpi_group_id'];
}
return false;
}
/**
* Summary of add1stTask
* adds a GLPI task to ticket
@@ -1958,10 +1999,12 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
* @param mixed $newtitle
*/
public function setItemTitle($itemtype, $itemId, $newtitle) {
global $DB;
$dbu = new DbUtils;
$item = $dbu->getItemForItemtype( $itemtype );
if ($item->getFromDB( $itemId )) {
$item->update( ['id' => $itemId, 'name' => $newtitle] );
$item->update( ['id' => $itemId, 'name' => $DB->escape($newtitle)] );
}
}
@@ -1988,6 +2031,8 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
* @param mixed $casevariablevalues
*/
public function setItemSolution($itemType, $itemId, $casevariablevalues) {
global $DB;
$dbu = new DbUtils;
$item = $dbu->getItemForItemtype( $itemType );
if ($item->getFromDB( $itemId )) {
@@ -2035,7 +2080,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
if ($solution != '') {
$solution .= "\n";
}
$solution .= $casevariablevalues[ 'GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION' ];
$solution .= $DB->escape($casevariablevalues[ 'GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION' ]);
$to_update = true;
}
@@ -2078,7 +2123,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
* 'begin' => is the new begin date of the task
* 'end' => is the new end date of the task
* 'toInformation' => is the new status of the task (usually set to INFORMATION)
*
* @return false|object the solved task, when found
*/
public function solveTask($cases_id, $delIndex, $options = []) {
global $DB;
@@ -2098,7 +2143,6 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
$hostItem->getFromDB( $glpi_task->fields[ $itemFKField ] );
// change current glpi_currenttime to be sure that date_mode for solved task will not be identical than date_mode of the newly started task
//$end_date = new DateTime( $_SESSION["glpi_currenttime"] );
$saved_date_time = $_SESSION["glpi_currenttime"];
$_SESSION["glpi_currenttime"] = (new DateTime($saved_date_time))->sub(new DateInterval("PT1S"))->format("Y-m-d H:i:s");
@@ -2132,18 +2176,49 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
//'groups_id_tech' => 0,
'content' => $DB->escape($glpi_task->fields[ 'content' ].$options['txtToAppend'])
];
$donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState($options['notif']);
$donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState(false); // do not send notification yet
$glpi_task->update($params);
PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif);
// Close the task
//$DB->query("UPDATE glpi_plugin_processmaker_tasks SET del_thread_status = '".PluginProcessmakerTask::CLOSED."' WHERE id = {$row['id']}");
$DB->update('glpi_plugin_processmaker_tasks', ['del_thread_status' => PluginProcessmakerTask::CLOSED], ['id' => $row['id']]);
// send notification if needed for new task as now the PluginProcessmakerTask has been updated in the DB
$donotif = PluginProcessmakerNotificationTargetProcessmaker::saveNotificationState($options['notif']);
// Notification management
// search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id']
$res = PluginProcessmakerNotificationTargetTask::getNotifications('task_done', $glpi_task->fields['taskcategories_id'], $hostItem->fields['entities_id']);
if ($res['notifications'] && count($res['notifications']) > 0) {
$pm_task = new PluginProcessmakerTask($glpi_task->getType());
$pm_task->getFromDB($glpi_task->getId());
NotificationEvent::raiseEvent($res['event'],
$pm_task,
['plugin_processmaker_cases_id' => $cases_id,
'itemtype' => $glpi_task->getType(),
'task_id' => $glpi_task->getID(),
'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0,
'entities_id' => $hostItem->fields['entities_id']
]);
} else {
NotificationEvent::raiseEvent('update_task',
$hostItem,
['plugin_processmaker_cases_id' => $cases_id,
'itemtype' => $hostItem->getType(),
'task_id' => $glpi_task->getID(),
'is_private' => isset($glpi_task->fields['is_private']) ? $glpi_task->fields['is_private'] : 0
]);
}
PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif);
// restore current glpi time
$_SESSION["glpi_currenttime"] = $saved_date_time;
return $glpi_task;
}
return false;
}
/**
@@ -2285,10 +2360,24 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
*/
public static function pre_show_item_processmaker($params) {
if (!is_array($params['item']) && is_subclass_of( $params['item'], 'CommonITILTask')) {
if (!is_array($params['item']) && is_subclass_of($params['item'], 'CommonITILTask')) {
// must check if Task is bound to a PM task
$pmTask = new PluginProcessmakerTask($params['item']->getType());
if ($pmTask->getFromDB($params['item']->getId())) {//$pmTask->getFromDBByQuery("WHERE itemtype='".$params['item']->getType()."' and items_id=".$params['item']->getId())) {
$is_pmtask = $pmTask->getFromDB($params['item']->getId());
if (!$is_pmtask && $params['item']->fields['state'] == Planning::INFO) {
// look if it is a meta task for this process
// means a re-assign or an un-claim task info
$pm_process = new PluginProcessmakerProcess;
if ($pm_process->getFromDBByQuery( " WHERE `taskcategories_id` = ".$params['item']->fields['taskcategories_id'])) {
// then look into content to get case id
$re = '/<input name=\'caseid\' type=\'hidden\' value=\'(?\'caseid\'\d+)\'><input name=\'taskid\' type=\'hidden\' value=\'(?\'taskid\'\d+)\'>/';
if (preg_match($re, $params['item']->fields['content'], $matches)) {
// here we get the case id and the task id
$is_pmtask = $pmTask->getFromDB($matches['taskid']);
}
}
}
if ($is_pmtask) {
$params['item']->fields['can_edit'] = false; // to prevent task edition
// replace ##ticket.url##_PluginProcessmakerCase$processmakercases by a setActiveTab to the Case panel
@@ -2301,7 +2390,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
} else {
$params['item']->fields['content'] = str_replace( '##processmaker.taskcomment##', $taskComment, $params['item']->fields['content'] );
}
$taskJSId = "viewitem".$params['item']->getType().$params['item']->getId().$params['options']['rand'];
$taskJSId = strtolower("viewitem".$params['item']->getType().$params['item']->getId());
// special case for <hr> which will provoke the rendering to be split into several <p>
// add <p></p> which othervise will be missing
@@ -2574,7 +2663,10 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// ### 2nd call to save Data POST ###
curl_setopt($ch, CURLOPT_URL, $this->serverURL."/cases/cases_SaveData?UID=".$request['UID']."&APP_UID=".$request['APP_UID'] );
$response = curl_exec ($ch);
if ($response === false) {
//throw new Exception(curl_error($ch), curl_errno($ch));
Toolbox::logInFile( "pmtrace", curl_error($ch).":".curl_errno($ch)."\n" );
}
curl_close ($ch);
if ($loggable) {
Toolbox::logInFile( "pmtrace", "URL:\n".$this->serverURL."/cases/cases_SaveData?UID=".$request['UID']."&APP_UID=".$request['APP_UID']."\nData:\n".print_r($data, true )."\nResponse:\n".$response."\n\n\n" );
@@ -2896,13 +2988,15 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
*/
public function derivateCase($myCase, $request, $users_id = null) {
//$cookies,
global $PM_DB, $CFG_GLPI;
global $PM_DB, $CFG_GLPI, $DB;
$itemtype = $myCase->getField('itemtype');
$items_id = $myCase->getField('items_id');
$item = new $itemtype;
$item->getFromDB($items_id);
//Toolbox::logInFile("processmaker_derivate", Toolbox::backtrace(false) . "derivateCase: myCase = " . print_r($myCase, true) . "\nrequest = " . print_r($request, true) . "\nusers_id = " . print_r($users_id, true) );
// save the dynaform variables into the current case
if (isset($request['UID']) && isset($request['APP_UID']) && isset($request['__DynaformName__'])) {
$resultSave = $this->saveForm( $request );
@@ -2910,6 +3004,16 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// now derivate the case !!!
$pmRouteCaseResponse = $this->routeCase($myCase->fields['case_guid'], $request['DEL_INDEX']);
//Toolbox::logInFile("processmaker_derivate", "routeCase: pmRouteCaseResponse = " . print_r($pmRouteCaseResponse, true));
if ($pmRouteCaseResponse->status_code != 0) {
Session::addMessageAfterRedirect(sprintf(__('Unable to derivate case! Retry in a moment, or ask your administrator.<hr>Error code: %u<br/>Error message: %s<br/>', 'processmaker'),
$pmRouteCaseResponse->status_code,
$pmRouteCaseResponse->message),
true,
ERROR);
return;
}
$casevariables = ["GLPI_ITEM_TASK_CONTENT",
"GLPI_ITEM_APPEND_TO_TASK",
@@ -2935,12 +3039,18 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
"GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION",
"GLPI_ITEM_INITIAL_DUE_DATE",
"GLPI_ITEM_DUE_DATE",
"GLPI_SEND_EMAIL"
"GLPI_SEND_EMAIL",
"GLPI_ITEM_INFORMATION_TASK"
];
// now tries to get some variables to setup content for new task and to append text to solved task
$casevariablevalues = $myCase->getVariables($casevariables);
$information_task = '';
if (array_key_exists( 'GLPI_ITEM_INFORMATION_TASK', $casevariablevalues ) && $casevariablevalues[ 'GLPI_ITEM_INFORMATION_TASK' ] != '') {
$information_task = $casevariablevalues[ 'GLPI_ITEM_INFORMATION_TASK' ];
}
$sendemail = '';
if (array_key_exists( 'GLPI_SEND_EMAIL', $casevariablevalues ) && $casevariablevalues[ 'GLPI_SEND_EMAIL' ] != '') {
$sendemail = json_decode($casevariablevalues[ 'GLPI_SEND_EMAIL' ], true);
@@ -3034,23 +3144,23 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// reset those variables
$resetcasevariables = [];
foreach ($casevariables as $val) {
$resetcasevariables[$val] = '';
if (!empty($casevariablevalues[$val])) {
$resetcasevariables[$val] = '';
}
}
$resultSave = $myCase->sendVariables($resetcasevariables);
// print_r( $pmRouteCaseResponse ) ;
// die() ;
// now manage tasks associated with item
// switch own task to 'done' and create a new one
$this->solveTask($myCase->getID(),
$request['DEL_INDEX'],
['txtToAppend' => $txtToAppendToTask,
'users_id_tech' => $users_id,
'begin' => $solvedTaskStartDate,
'end' => $solvedTaskEndDate,
'toInformation' => $solvedTaskSetToInformation
] );
$glpi_task = $this->solveTask($myCase->getID(),
$request['DEL_INDEX'],
['txtToAppend' => $txtToAppendToTask,
'users_id_tech' => $users_id,
'begin' => $solvedTaskStartDate,
'end' => $solvedTaskEndDate,
'toInformation' => $solvedTaskSetToInformation
]
);
// create a followup if requested
if ($createFollowup) { // && $itemtype == 'Ticket') {
@@ -3081,6 +3191,38 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// get the new case info
$caseInfo = $myCase->getCaseInfo($request['DEL_INDEX']); // not sure that it should passed this
// create an information task if requested
if ($information_task != '' && $glpi_task) {
// create an information task and add comment
// $information_task is the content of the task
$pm_process = $myCase->getProcess();
$taskCat = new TaskCategory;
$taskCat->getFromDB($glpi_task->fields['taskcategories_id']);
// we may replace ##casename## by the name of the case, and ##taskname## by the task name
$search = ['##casename##',
'##taskname##'
];
$replace = [$caseInfo->caseName." (".$myCase->getID().")",
DropdownTranslation::getTranslatedValue($glpi_task->fields['taskcategories_id'], 'TaskCategory', 'name', $_SESSION['glpilanguage'], $taskCat->fields['name'])
];
$info = str_replace($search, $replace, $information_task);
$info .= "<input name='caseid' type='hidden' value='".$myCase->getID()."'><input name='taskid' type='hidden' value='".$glpi_task->getID()."'>";
// unescape some chars and replace CRLF, CR or LF by <br/>
$info = str_replace(["\\'", '\\"', '\r\n', '\r', '\n'], ["'", '"', '<br>', '<br>', '<br>'], $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' )) {

View File

@@ -67,6 +67,15 @@ class PluginProcessmakerTask extends CommonITILTask
return false;
}
/**
* Summary of getPMTaskID
* @return mixed
*/
function getPMTaskID() {
return $this->fields['items_id'];
}
/**
* Summary of getToDoTasks
* returns all 'to do' tasks associated with this case
@@ -377,31 +386,53 @@ class PluginProcessmakerTask extends CommonITILTask
}
if (isset($currentUser)) {
if (/*$currentUser->userId &&*/ $task[$tabnum]['del_index']) {
if ($task[$tabnum]['del_index']) {
// to load users for task re-assign only when task is not a sub-case
echo "<div class='tab_bg_2' id='divUsers-".$currentUser->delIndex."'><div class='loadingindicator'>".__('Loading...')."</div></div>";
echo "<script>$('#divUsers-{$task[$tabnum]['del_index']}').load( '".$CFG_GLPI["root_doc"]."/plugins/processmaker/ajax/task_users.php?cases_id="
.$case->getID()
."&items_id="
.$case->fields['items_id']
."&itemtype="
.$case->fields['itemtype']
."&users_id="
.PluginProcessmakerUser::getGLPIUserId($currentUser->userId)
."&taskGuid="
.$currentUser->taskId
."&delIndex={$task[$tabnum]['del_index']}&delThread={$currentUser->delThread}&rand=$rand' ); </script>";
//} else {
// // manages the claim
// // current task is to be claimed
// // get the assigned group to the item task
// $itemtask = $dbu->getItemForItemtype( $task[$tabnum]['itemtype'] );
// $itemtask->getFromDB( $task[$tabnum]['items_id'] );
// // check if this group can be found in the current user's groups
// if (!isset($_SESSION['glpigroups']) || !in_array( $itemtask->fields['groups_id_tech'], $_SESSION['glpigroups'] )) {
// $hide_claim_button=true;
// }
// try to get users whom can't be assigned to this task
// already assigned user can't be assigned again to this task
$current_assigned_user = PluginProcessmakerUser::getGLPIUserId($currentUser->userId);
// and then any forbiden users defined from the case itself
$casevariablevalues = $case->getVariables(['GLPI_TASK_PREVENT_REASSIGN']);
$prevent_assign = [];
if (array_key_exists( 'GLPI_TASK_PREVENT_REASSIGN', $casevariablevalues ) && $casevariablevalues[ 'GLPI_TASK_PREVENT_REASSIGN' ] != '') {
$prevent_assign = json_decode($casevariablevalues[ 'GLPI_TASK_PREVENT_REASSIGN' ], true);
}
$used_users = [];
$used_users[] = $current_assigned_user;
if (array_key_exists($currentUser->taskId, $prevent_assign)) {
if (is_array($prevent_assign[$currentUser->taskId])) {
foreach ($prevent_assign[$currentUser->taskId] as $pmuser) {
$usr_id = PluginProcessmakerUser::getGlpiIdFromAny($pmuser);
if ($usr_id) {
$used_users[] = $usr_id;
}
}
} else {
$usr_id = PluginProcessmakerUser::getGlpiIdFromAny($prevent_assign[$currentUser->taskId]);
if ($usr_id) {
$used_users[] = $usr_id;
}
}
}
$data = "{
cases_id : {$case->getID()},
items_id : {$case->fields['items_id']},
itemtype : '{$case->fields['itemtype']}',
tasktype : '{$task[$tabnum]['itemtype']}',
tasks_id : {$task[$tabnum]['items_id']},
users_id : {$current_assigned_user},
taskGuid : '{$currentUser->taskId}',
delIndex : {$task[$tabnum]['del_index']},
delThread : {$currentUser->delThread},
used : [".join(',', array_unique($used_users))."]
}";
echo html::scriptBlock("$('#divUsers-{$task[$tabnum]['del_index']}').load('".$CFG_GLPI["root_doc"]."/plugins/processmaker/ajax/task_users.php', $data);");
}
if (!$currentUser->userId || !$task[$tabnum]['del_index']) {
@@ -422,18 +453,6 @@ class PluginProcessmakerTask extends CommonITILTask
$csrf = Session::getNewCSRFToken();
//echo "<iframe id='caseiframe-task-{$task[$tabnum]['del_index']}' onload=\"onTaskFrameLoad( event, {$task[$tabnum]['del_index']}, "
// .($hide_claim_button?"true":"false")
// .", '$csrf' );\" style='border:none;' class='tab_bg_2' width='100%' src='";
//echo $PM_SOAP->serverURL
// ."/cases/cases_Open?sid="
// .$PM_SOAP->getPMSessionID()
// ."&APP_UID="
// .$case->fields['case_guid']
// ."&DEL_INDEX="
// .$task[$tabnum]['del_index']
// ."&action=TO_DO";
//echo "&rand=$rand&glpi_domain={$config->fields['domain']}'></iframe></div>";
$url = $PM_SOAP->serverURL
."/cases/cases_Open?sid=".$PM_SOAP->getPMSessionID()
."&APP_UID=".$case->fields['case_guid']
@@ -471,6 +490,42 @@ class PluginProcessmakerTask extends CommonITILTask
}
});
");
}
/**
* Summary of sendNotification
* Will send either dedicated notification, or standard one
* @param string $type is 'task_add', 'task_reassign', 'task_done', 'task_reminder'
* @param CommonITILTask $task is the task (TicketTask,...)
* @param CommonITILObject $item is the ITIL item (Ticket,...)
* @param PluginProcessmakerCase $case is the case
*/
function sendNotification(string $type, CommonITILTask $task, CommonITILObject $item, PluginProcessmakerCase $case = null) {
// Notification management
// search if at least one active notification is existing for that pm task with that event 'task_update_'.$glpi_task->fields['taskcategories_id']
$res = PluginProcessmakerNotificationTargetTask::getNotifications($type, $task->fields['taskcategories_id'], $item->fields['entities_id']);
if ($res['notifications'] && count($res['notifications']) > 0) {
NotificationEvent::raiseEvent($res['event'],
$this,
['plugin_processmaker_cases_id' => $this->fields['plugin_processmaker_cases_id'],
'itemtype' => $item->getType(),
'task_id' => $task->getID(),
'old_users_id_tech' => isset($task->oldvalues['users_id_tech']) ? $task->oldvalues['users_id_tech'] : 0,
'is_private' => isset($task->fields['is_private']) ? $task->fields['is_private'] : 0,
'entities_id' => $item->fields['entities_id'],
'case' => $case,
'obj' => $item
]);
} else {
NotificationEvent::raiseEvent(PluginProcessmakerNotificationTargetTask::getDefaultGLPIEvents($type),
$item,
['plugin_processmaker_cases_id' => $this->fields['plugin_processmaker_cases_id'],
'itemtype' => $item->getType(),
'task_id' => $task->getID(),
'is_private' => isset($task->fields['is_private']) ? $task->fields['is_private'] : 0
]);
}
}

View File

@@ -295,6 +295,7 @@ class PluginProcessmakerUser extends CommonDBTM {
return 0;
}
/**
* Summary of getPMUserId
* returns processmaker user id for given GLPI user id
@@ -309,6 +310,31 @@ class PluginProcessmakerUser extends CommonDBTM {
return false;
}
/**
* Summary of getGlpiIdFromAny
* Returns the GLPI id of the user or false if not found
* Accept either PM GUID, GLPI logon, or GLPI ID
* @param $any
* @return mixed GLPI ID of the user or fasle if not found
*/
public static function getGlpiIdFromAny($any) {
$ret = self::getGLPIUserId($any);
if ($ret) {
return $ret;
}
$ret = self::getPMUserId($any);
if ($ret) {
return $any;
}
$usr = new User;
if ($usr->getFromDBbyName($any)) {
return $usr->getId();
}
return false;
}
///**
// * Summary of getNewPassword
// * @param mixed $username

View File

@@ -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;

View File

@@ -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)) {

View File

@@ -0,0 +1,12 @@
<?php
function update_3_4_9_to_3_4_10() {
global $DB;
// needs to change _update_ into _reassign_ in the events field of the glpi_notifications table
$query = "UPDATE `glpi_notifications` SET `event` = REPLACE( `event`, '_update_', '_reassign_') WHERE `event` LIKE '%_update_%' AND `itemtype` = 'PluginProcessmakerTask';";
$DB->query($query) or die("error when updating event field in glpi_notifications" . $DB->error());
return '3.4.10';
}

View File

@@ -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, '<br>'));
} else {
tinymce.activeEditor.setContent('_');
}
}
// call old handler if any

Binary file not shown.

View File

@@ -1,22 +1,23 @@
msgid ""
msgstr ""
"Project-Id-Version: processmaker-plugin\n"
"POT-Creation-Date: 2018-08-06 14:32+0200\n"
"PO-Revision-Date: 2018-08-06 14:44+0200\n"
"POT-Creation-Date: 2020-07-13 09:41+0200\n"
"PO-Revision-Date: 2020-07-13 11:02+0200\n"
"Last-Translator: tomolimo\n"
"Language-Team: French\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.1.1\n"
"X-Generator: Poedit 2.3.1\n"
"X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Poedit-KeywordsList: ;__:1,2t;_e:1,2t;_x:1c,2,3t;_n:1,2,4t;__s:1,2t;"
"_ex:1c,2,3t;_sx:1c,2,3t;_nx:1c,2,3,5t\n"
"X-Poedit-KeywordsList: ;__:1,2t;_e:1,2t;_x:1c,2,3t;_n:1,2,4t;__s:1,2t;_ex:1c,2,3t;_sx:1c,2,3t;_nx:1c,2,3,5t\n"
"X-Crowdin-Project: processmaker-plugin\n"
"X-Crowdin-Project-ID: 310131\n"
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /3.3.0/source.po\n"
"X-Crowdin-File: /3.4 - GLPI 9.2/source.po\n"
"X-Crowdin-File-ID: 20\n"
"X-Poedit-SearchPath-0: ajax\n"
"X-Poedit-SearchPath-1: front\n"
"X-Poedit-SearchPath-2: inc\n"
@@ -25,239 +26,306 @@ msgstr ""
"X-Poedit-SearchPath-5: hook.php\n"
"X-Poedit-SearchPath-6: setup.php\n"
#: ajax/task_users.php:25
#: ajax/task_users.php:36
msgid "Re-assign task to"
msgstr "Ré-affecter tâche à"
#: ajax/task_users.php:45
#: ajax/task_users.php:60 ajax/task_users.php:61 ajax/task_users.php:124
msgid "Re-assign"
msgstr "Ré-affecter"
#: front/case.form.php:35
#: ajax/task_users.php:110
#| msgid "Task already assigned to this person!"
msgid "Task is already assigned to this user or group!"
msgstr "La tâche est déjà affectée à cet utilisateur (ou ce groupe) !"
#: ajax/task_users.php:110 ajax/task_users.php:122
#| msgid "Re-assign task to"
msgid "Re-assign task"
msgstr "Ré-affecter tâche"
#: ajax/task_users.php:114 ajax/task_users.php:119
#| msgid "Claim target task"
msgid "Un-claim task"
msgstr "Annuler affectation de la tâche"
#: ajax/task_users.php:115
msgid "Please input reason to un-claim<br/>(task will be re-assigned to former group):"
msgstr "Saisir la raison pour l'annulation de l'affectation<br/>(la tâche sera ré-affectée au groupe précédent) :"
#: ajax/task_users.php:116
msgid "Un-claim"
msgstr "Annulation de l'affectation"
#: ajax/task_users.php:119
msgid "Can\\'t un-assign Task!"
msgstr "Annulation de l'affectation impossible !"
#: ajax/task_users.php:123
msgid "Please input reason to re-assign:"
msgstr "Saisir la raison pour la ré-affectation :"
#: ajax/task_users.php:134
msgid "Send reminder"
msgstr "Envoyer un rappel"
#: front/case.form.php:32
msgid "Case has been deleted!"
msgstr "Le cas a été effacé !"
#: front/case.form.php:37
#: front/case.form.php:34
msgid "Unable to delete case!"
msgstr "Impossible d'effacer le cas !"
#: front/case.form.php:50
#: front/case.form.php:46
msgid "Case has been cancelled!"
msgstr "Le cas a été annulé !"
#: front/case.form.php:52 front/case.form.php:55
#: front/case.form.php:48 front/case.form.php:51
msgid "Unable to cancel case!"
msgstr "Impossible d'annuler le cas !"
#: front/case.form.php:76 front/case.form.php:78 inc/case.class.php:1018
#: front/case.form.php:70 front/case.form.php:72 inc/case.class.php:1310
msgid "Process cases"
msgstr "Cas des processus"
#: front/case.php:5 front/caselink.form.php:27 front/caselink.php:5
#: front/process.form.php:25 front/process.php:5 inc/caselink.class.php:143
#: inc/config.class.php:50 inc/config.class.php:354 inc/process.class.php:393
#: front/case.php:5 front/caselink.form.php:29 front/caselink.php:5
#: front/process.form.php:27 front/process.php:5 inc/caselink.class.php:157
#: inc/config.class.php:50 inc/config.class.php:363 inc/process.class.php:409
#: inc/profile.class.php:52 inc/profile.class.php:83
msgid "ProcessMaker"
msgstr "ProcessMaker"
#: front/processmaker.form.php:85
#: front/processmaker.form.php:80
msgid "Task re-assigned!"
msgstr "Tâche ré-affectée !"
#: front/processmaker.form.php:87
#: front/processmaker.form.php:82
msgid "Error re-assigning task: "
msgstr "Impossible de re-affecter cette tâche : "
msgstr "Impossible de ré-affecter cette tâche :"
#: front/processmaker.form.php:90
msgid "Task already assigned to this person!"
msgstr "Tâche déjà affectée à cette personne !"
#: front/processmaker.form.php:93
#| msgid "Task name"
msgid "Task un-claimed!"
msgstr "Annulation de l'affectation de la tâche effectuée !"
#: front/processmaker.form.php:95
msgid "Can't un-claim task! Verify 'Assignement Rules' in the process definition."
msgstr "Annulation de l'affectation impossible ! Vérifiez les règles d'assignation dans la définition du Processus."
#: front/processmaker.helpdesk.form.php:21
msgid "Process - Case"
msgstr "Processus - Cas"
#: front/processmaker.helpdesk.form.php:24 inc/case.class.php:605
#: front/processmaker.helpdesk.form.php:24 inc/case.class.php:799
msgid "Select the process you want to add"
msgstr "Choisir le processus à démarrer"
#: hook.php:31 inc/taskcategory.class.php:98
#: hook.php:9 inc/taskcategory.class.php:214
msgid "Synchronize Task List"
msgstr "Synchroniser la liste des Tâches"
#: hook.php:158 inc/case.class.php:77
#: hook.php:76 inc/case.class.php:89
msgid "Case"
msgstr "Cas"
#: hook.php:158 inc/case.class.php:586 inc/case.class.php:1062
#: hook.php:76 inc/case.class.php:778 inc/case.class.php:1355
msgid "Status"
msgstr "Statut"
#: inc/case.class.php:23 inc/case.class.php:90 inc/case.class.php:92
#: inc/case.class.php:25 inc/case.class.php:102 inc/case.class.php:104
msgid "Process case"
msgid_plural "Process cases"
msgstr[0] "Cas du processus"
msgstr[1] "Cas des processus"
#: inc/case.class.php:80
#: inc/case.class.php:92
msgid "Sub-case"
msgstr "Sous-cas"
#: inc/case.class.php:312
#: inc/case.class.php:303
#, php-format
msgid "<b>Task un-claimed!</b><br/><b>Case: </b>%s<br/><b>Task: </b>\"%s\" has been un-assigned from \"%s\" and assigned to \"%s\" group.<br/><b>Reason: </b>%s"
msgstr "<b>Annulation de l'affection de la tâche effectuée !</b><br/><b>Cas : </b>%s<br/><b>Tâche : </b>\"%s\" a été libérée de \"%s\" et assignée au groupe \"%s\".<br/><b>Motif : </b>%s"
#: inc/case.class.php:420
#, php-format
msgid "<b>Task re-assigned!</b><br/><b>Case: </b>%s<br/><b>Task: </b>\"%s\" has been re-assigned from \"%s\" to \"%s\".<br/><b>Reason: </b>%s"
msgstr "<b>Tâche ré-assignée !</b><br/><b>Cas : </b>%s<br/><b>Tâche : </b>\"%s\" a été ré-assignée de \"%s\" à \"%s\".<br/><b>Motif : </b>%s"
#: inc/case.class.php:429
#, php-format
msgid "<b>Task assigned!</b><br/><b>Case: </b>%s<br/><b>Task: </b>\"%s\" has been assigned to \"%s\".<br/><b>Reason: </b>%s"
msgstr "<b>Tâche assignée !</b><br/><b>Cas : </b>%s<br/><b>Tâche : </b>\"%s\" a été asignée à \"%s\".<br/><b>Motif : </b>%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 lannulation ?"
#: 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 lutilisateur"
#: 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.<hr>Error code: %u<br/>Error message: %s<br/>"
msgstr "Impossible de dériver le cas ! Ré-essayez dans un moment, ou demandez à votre administrateur.<hr>Code d'erreur : %u<br/>Message d'erreur : %s<br/>"
#: 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"

View File

@@ -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<br/>(task will be re-assigned to former "
"group):"
msgstr ""
"Please input reason to un-claim<br/>(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 ""
"<b>Task un-claimed!</b><br/><b>Case: </b>%s<br/><b>Task: </b>\"%s\" has been "
"un-assigned from \"%s\" and assigned to \"%s\" group.<br/><b>Reason: </b>%s"
msgstr ""
"<b>Task un-claimed!</b><br/><b>Case: </b>%s<br/><b>Task: </b>\"%s\" has been "
"un-assigned from \"%s\" and assigned to \"%s\" group.<br/><b>Reason: </b>%s"
#: inc/case.class.php:420
#, php-format
msgid ""
"<b>Task re-assigned!</b><br/><b>Case: </b>%s<br/><b>Task: </b>\"%s\" has "
"been re-assigned from \"%s\" to \"%s\".<br/><b>Reason: </b>%s"
msgstr ""
"<b>Task re-assigned!</b><br/><b>Case: </b>%s<br/><b>Task: </b>\"%s\" has "
"been re-assigned from \"%s\" to \"%s\".<br/><b>Reason: </b>%s"
#: inc/case.class.php:429
#, php-format
msgid ""
"<b>Task assigned!</b><br/><b>Case: </b>%s<br/><b>Task: </b>\"%s\" has been "
"assigned to \"%s\".<br/><b>Reason: </b>%s"
msgstr ""
"<b>Task assigned!</b><br/><b>Case: </b>%s<br/><b>Task: </b>\"%s\" has been "
"assigned to \"%s\".<br/><b>Reason: </b>%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."
"<hr>Error code: %u<br/>Error message: %s<br/>"
msgstr ""
"Unable to derivate case! Retry in a moment, or ask your administrator."
"<hr>Error code: %u<br/>Error message: %s<br/>"
#: 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"

View File

@@ -29,15 +29,15 @@
<compatibility>9.1</compatibility>
</version>
<version>
<num>3.4.14</num>
<num>3.4.25</num>
<compatibility>9.2</compatibility>
</version>
<version>
<num>3.5.5</num>
<num>3.5.10</num>
<compatibility>9.3</compatibility>
</version>
<version>
<num>3.6.5</num>
<num>3.6.16</num>
<compatibility>9.4</compatibility>
</version>
</versions>

View File

@@ -1,6 +1,6 @@
<?php
define('PROCESSMAKER_VERSION', '3.6.5');
define('PROCESSMAKER_VERSION', '3.6.16');
// used for case cancellation
define("CANCEL", 256);
@@ -67,7 +67,8 @@ function plugin_init_processmaker() {
}
$PLUGIN_HOOKS['pre_item_update']['processmaker'] = $hooks;
$hooks = ['TicketSatisfaction' => '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() ) {