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 = []; $datas = [];

View File

@@ -18,31 +18,120 @@ if (!defined('GLPI_ROOT')) {
Session::checkLoginUser(); 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_SOAP = new PluginProcessmakerProcessmaker; // not used in this context, just here to define the type of $PM_SOAP
$PM_DB = new PluginProcessmakerDB; $PM_DB = new PluginProcessmakerDB;
$rand = rand(); $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 "<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 __('Re-assign task to', 'processmaker')."&nbsp;";
echo "<input type='hidden' name='action' value='unpausecase_or_reassign_or_delete'>"; echo "<input type='hidden' name='action' value='reassign_reminder'>";
echo "<input type='hidden' name='items_id' value='".$_REQUEST['items_id']."'>"; echo "<input type='hidden' name='comment' value=''>";
echo "<input type='hidden' name='itemtype' value='".$_REQUEST['itemtype']."'>"; echo $commoninputs;
echo "<input type='hidden' name='cases_id' value='".$_REQUEST['cases_id']."'>";
echo "<input type='hidden' name='delIndex' value='".$_REQUEST['delIndex']."'>"; $can_unclaim = false; // by default
echo "<input type='hidden' name='users_id' value='".$_REQUEST['users_id']."'>"; $query = "SELECT TAS_GROUP_VARIABLE FROM TASK WHERE TAS_UID='".$_REQUEST['taskGuid']."' AND TAS_ASSIGN_TYPE='SELF_SERVICE';";
echo "<input type='hidden' name='taskGuid' value='".$_REQUEST['taskGuid']."'>"; $res = $PM_DB->query($query);
echo "<input type='hidden' name='delThread' value='".$_REQUEST['delThread']."'>"; if ($PM_DB->numrows($res) > 0) {
$can_unclaim = true;
}
PluginProcessmakerUser::dropdown( ['name' => 'users_id_recipient', PluginProcessmakerUser::dropdown( ['name' => 'users_id_recipient',
'value' => $_REQUEST['users_id'], 'value' => $_REQUEST['users_id'],
'used' => [$_REQUEST['users_id']], 'used' => $_REQUEST['used'],
'entity' => 0, //$item->fields["entities_id"], // not used, as any user can be assigned to any tasks '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 'entity_sons' => false, // not used, as any user can be assigned to any tasks
'right' => 'all', 'right' => 'all',
'rand' => $rand, 'rand' => $rand,
'width' => '', 'width' => '',
'specific_tags' => ['taskGuid' => $_REQUEST['taskGuid']]]); 'specific_tags' => ['taskGuid' => $_REQUEST['taskGuid']]
echo "&nbsp;&nbsp;"; ]);
echo "<input type='submit' name='reassign' value='".__('Re-assign', 'processmaker')."' class='submit'>";
Html::closeForm(true);
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... // Must show it...
// //
$rand = rand( ); $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 { } else {
Session::addMessageAfterRedirect( PluginProcessmakerProcessmaker::getPMErrorMessage($resultCase->status_code)."<br>$resultCase->message ($resultCase->status_code)", true, ERROR); 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' : case 'reassign_reminder' :
if (isset($_POST['unpause'])) { if (isset($_POST['reassign'])) {
// here we should re-assign the current task to $_POST['users_id_recipient']
$locCase = new PluginProcessmakerCase; $locCase = new PluginProcessmakerCase;
$locCase->getFromDB($_POST['cases_id']); $locCase->getFromDB($_POST['cases_id']);
$pmResultUnpause = $locCase->unpauseCase($_POST['delIndex'], $_POST['users_id']); if ($_POST['users_id_recipient'] != 0) {
if ($pmResultUnpause->status_code == 0) { // we are assigning a new tech to a task
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']);
$pmResponse = $locCase->reassignCase($_POST['delIndex'], $pmResponse = $locCase->reassignCase($_POST['delIndex'],
$_POST['taskGuid'], $_POST['taskGuid'],
$_POST['delThread'], $_POST['delThread'],
$_POST['users_id'], $_POST['users_id'],
$_POST['users_id_recipient']); $_POST['users_id_recipient'],
['comment' => $_POST['comment']]);
if ($pmResponse) { if ($pmResponse) {
Session::addMessageAfterRedirect(__('Task re-assigned!', 'processmaker'), true, INFO); Session::addMessageAfterRedirect(__('Task re-assigned!', 'processmaker'), true, INFO);
} else { } else {
Session::addMessageAfterRedirect(__('Error re-assigning task: ', 'processmaker').$pmResponse->message, true, ERROR); Session::addMessageAfterRedirect(__('Error re-assigning task: ', 'processmaker').$pmResponse->message, true, ERROR);
} }
} else { } elseif ($_POST['users_id_recipient'] == 0) {
if ($_POST['users_id_recipient'] == 0) { // we are unassigning a task, i.e.: task un-claim
Session::addMessageAfterRedirect(__('Can\'t un-assign Task!', 'processmaker'), true, ERROR); $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 { } else {
if ($_POST['users_id'] === $_POST['users_id_recipient'] ) { // normally should be different as of the dropdown prevents already used Session::addMessageAfterRedirect(__("Can't un-claim task! Verify 'Assignement Rules' in the process definition.", 'processmaker'), true, ERROR);
Session::addMessageAfterRedirect(__('Task already assigned to this person!', 'processmaker'), true, ERROR);
}
} }
} }
//} else if (isset($_POST['delete'])) { } elseif (isset($_POST['reminder'])) {
// // delete case from case table, this will also delete the tasks // send notification remider as requested for this task
// $locCase = new PluginProcessmakerCase;
// if ($locCase->getFromDB($_POST['cases_id']) && $locCase->deleteCase()) {
// // request delete from pm itself
// $PM_SOAP->login(true);
// $resultPM = $PM_SOAP->deleteCase($locCase->fields['case_guid']); $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) { // send notification now!
// Session::addMessageAfterRedirect($LANG['processmaker']['item']['case']['deleted'], true, INFO); $pm_task->sendNotification('task_reminder', $glpi_task, $glpi_item, $locCase);
// } 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);
// }
// }
} }
break;
} }
// to return to item // to return to item

View File

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

View File

@@ -180,7 +180,10 @@ function plugin_pre_item_update_processmaker(CommonITILObject $parm) {
* @param mixed $parm is the object * @param mixed $parm is the object
*/ */
function plugin_item_update_processmaker_satisfaction($parm) { 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']); $cases = PluginProcessmakerCase::getIDsFromItem('Ticket', $parm->fields['tickets_id']);
foreach ($cases as $cases_id) { foreach ($cases as $cases_id) {
$locCase = new PluginProcessmakerCase; $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() { function plugin_processmaker_post_init() {
global $PM_DB, $PM_SOAP; global $PM_DB, $PM_SOAP;
if (!isset($PM_DB)) { if (!isset($PM_DB)) {
@@ -241,10 +271,11 @@ function plugin_item_update_processmaker_tasks($parm) {
$locCase->getFromDB($pmTask->fields['plugin_processmaker_cases_id']); $locCase->getFromDB($pmTask->fields['plugin_processmaker_cases_id']);
$srccase_guid = $locCase->fields['case_guid']; $srccase_guid = $locCase->fields['case_guid'];
$msg = ' $locCase: '.str_replace("\n", "\n ", print_r($locCase, true))."\n"; //$msg = Toolbox::backtrace(false);
$msg .= ' $task: '.str_replace("\n", "\n ", print_r($parm, true))."\n"; //$msg .= ' $locCase: '.str_replace("\n", "\n ", print_r($locCase, true))."\n";
$msg .= ' $pmTask: '.str_replace("\n", "\n ", print_r($pmTask, true))."\n"; //$msg .= ' $task: '.str_replace("\n", "\n ", print_r($parm, true))."\n";
$msg .= "\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) { 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 ] ); unset( $infoForTasks[ $casevar ] );
} }
$msg .= " ***********\n"; //$msg .= " ***********\n";
$msg .= ' $targetTask: '.str_replace("\n", "\n ", print_r($targetTask, true))."\n"; //$msg .= ' $targetTask: '.str_replace("\n", "\n ", print_r($targetTask, true))."\n";
$targetTask['sourcecondition'] = str_replace( array_keys($infoForTasks), $infoForTasks, $targetTask['sourcecondition'] ); $targetTask['sourcecondition'] = str_replace( array_keys($infoForTasks), $infoForTasks, $targetTask['sourcecondition'] );
$eval = eval( "return (".$targetTask['sourcecondition']." ? 1 : 0);" ); $eval = eval( "return (".$targetTask['sourcecondition']." ? 1 : 0);" );
$msg .= ' $infoForTasks: '.str_replace("\n", "\n ", print_r($infoForTasks, true))."\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 .= ' $targetTask[\'sourcecondition\']: '.str_replace("\n", "\n ", print_r($targetTask['sourcecondition'], true))."\n";
$msg .= ' $result: '."$eval\n"; //$msg .= ' $result: '."$eval\n";
$msg .= "\n"; //$msg .= "\n";
if ($eval) { if ($eval) {
// look at each linked ticket if a case is attached and then if a task like $val is TO_DO // 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_HTTPHEADER, ['Content-Type: application/json', 'Content-Length: ' . strlen($externalapplicationparams), 'Expect:']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_VERBOSE, 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 ) ; if (isset($externalapplication['ssl_verify'])) {
//curl_setopt($ch, CURLOPT_PROXY, "localhost:8889"); 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); $response = curl_exec ($ch);
if ($response === false) {
//Toolbox::logDebug( $response ) ; //throw new Exception(curl_error($ch), curl_errno($ch));
Toolbox::logDebug( curl_error($ch).":".curl_errno($ch) );
}
curl_close ($ch); curl_close ($ch);
} }
@@ -429,8 +467,8 @@ function plugin_item_update_processmaker_tasks($parm) {
} }
$msg .= "================\n"; //$msg .= "================\n";
Toolbox::logInFile("processmaker", $msg); //Toolbox::logInFile("processmaker", $msg);
} }
} }

View File

@@ -14,6 +14,8 @@ class PluginProcessmakerCase extends CommonDBTM {
//static public $items_id = 'items_id'; // Field name //static public $items_id = 'items_id'; // Field name
static $rightname = 'plugin_processmaker_case'; static $rightname = 'plugin_processmaker_case';
private $process = null;
const DRAFT = 'DRAFT'; const DRAFT = 'DRAFT';
const TO_DO = 'TO_DO'; const TO_DO = 'TO_DO';
const COMPLETED = 'COMPLETED'; 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 * Summary of reassignCase
* @param mixed $delIndex * @param mixed $delIndex
@@ -230,7 +349,7 @@ class PluginProcessmakerCase extends CommonDBTM {
* @param mixed $users_id_target * @param mixed $users_id_target
* @return mixed * @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; global $PM_SOAP;
$users_guid_source = ''; // by default $users_guid_source = ''; // by default
if ($users_id_source !== 0) { // when task is not 'to be claimed' if ($users_id_source !== 0) { // when task is not 'to be claimed'
@@ -253,7 +372,7 @@ class PluginProcessmakerCase extends CommonDBTM {
break; break;
} }
} }
$this->reassignTask($delIndex, $newDelIndex, $delThread, $newDelThread, $users_id_target ); $this->reassignTask($delIndex, $newDelIndex, $delThread, $newDelThread, $users_id_target, $options);
return true; return true;
} }
return false; return false;
@@ -266,15 +385,15 @@ class PluginProcessmakerCase extends CommonDBTM {
* @param mixed $newDelIndex * @param mixed $newDelIndex
* @param mixed $newTech * @param mixed $newTech
*/ */
public function reassignTask ($delIndex, $newDelIndex, $delThread, $newDelThread, $newTech) { public function reassignTask ($delIndex, $newDelIndex, $delThread, $newDelThread, $newTech, $options) {
global $DB; global $DB, $PM_SOAP;
$dbu = new DbUtils; $dbu = new DbUtils;
$pm_task_row = $dbu->getAllDataFromTable(PluginProcessmakerTask::getTable(), ['plugin_processmaker_cases_id' => $this->getID(), 'del_index' => $delIndex, 'del_thread' => $delThread]); $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) { if ($pm_task_row && count($pm_task_row) == 1) {
$pm_task_row = array_shift($pm_task_row); $pm_task_row = array_shift($pm_task_row);
$glpi_task = new $pm_task_row['itemtype']; $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']; $itilobject_itemtype = $this->fields['itemtype'];
$foreignkey = getForeignKeyFieldForItemType( $itilobject_itemtype ); $foreignkey = getForeignKeyFieldForItemType( $itilobject_itemtype );
@@ -289,37 +408,7 @@ class PluginProcessmakerCase extends CommonDBTM {
'update' => true] ); 'update' => true] );
PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif); 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 // 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', [ $DB->Update( 'glpi_plugin_processmaker_tasks', [
'del_index' => $newDelIndex, 'del_index' => $newDelIndex,
'del_thread' => $newDelThread 'del_thread' => $newDelThread
@@ -327,10 +416,69 @@ class PluginProcessmakerCase extends CommonDBTM {
'id' => $pm_task_row['id'] '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 * Summary of showCaseProperties
*/ */
@@ -721,16 +869,13 @@ class PluginProcessmakerCase extends CommonDBTM {
echo "<tr class='tab_bg_2'><td class='tab_bg_2'>"; echo "<tr class='tab_bg_2'><td class='tab_bg_2'>";
echo __('Select the process you want to add', 'processmaker'); echo __('Select the process you want to add', 'processmaker');
echo "</td><td class='tab_bg_2'>"; echo "</td><td class='tab_bg_2'>";
$condition[] = ['is_active' => 1]; $condition['is_active'] = 1;
if ($itemtype == 'Ticket') { if ($itemtype == 'Ticket' && $item->fields['type'] == Ticket::INCIDENT_TYPE) {
$condition[] = ['is_incident' => 1]; $condition['is_incident'] = 1;
//$is_itemtype = "AND is_incident=1"; } else if ($itemtype == 'Ticket' && $item->fields['type'] == Ticket::DEMAND_TYPE) {
if ($item->fields['type'] == Ticket::DEMAND_TYPE) { $condition['is_request'] = 1;
$condition[] = ['is_request' => 1];
//$is_itemtype = "AND is_request=1";
}
} else { } else {
$condition[] = ['is_'.strtolower($itemtype) => 1]; $condition['is_'.strtolower($itemtype)] = 1;
//$is_itemtype = "AND is_".strtolower($itemtype)."=1"; //$is_itemtype = "AND is_".strtolower($itemtype)."=1";
} }
PluginProcessmakerProcess::dropdown(['value' => 0, PluginProcessmakerProcess::dropdown(['value' => 0,

View File

@@ -271,4 +271,15 @@ class PluginProcessmakerCaselink extends CommonDBTM {
return $tab; 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']) { if (!$config->fields['maintenance']) {
echo "<tr class='tab_bg_1'>"; 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 "<input size='50' type='text' name='pm_server_URL' value='".$config->fields['pm_server_URL']."'>";
echo "</td></tr>\n"; echo "</td></tr>\n";

View File

@@ -4,13 +4,18 @@
* PluginProcessmakerNotificationTargetProcessmaker short summary. * PluginProcessmakerNotificationTargetProcessmaker short summary.
* *
* PluginProcessmakerNotificationTargetProcessmaker description. * PluginProcessmakerNotificationTargetProcessmaker description.
* *
* Common notificationtarget class for cases and tasks * Common notificationtarget class for cases and tasks
* *
* @version 1.0 * @version 1.0
* @author MoronO * @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 * Summary of saveNotificationState
@@ -58,11 +63,16 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
'case.id' => __('Case id', 'processmaker'), 'case.id' => __('Case id', 'processmaker'),
'case.title' => __('Case title', 'processmaker'), 'case.title' => __('Case title', 'processmaker'),
'case.description' => __('Case description', 'processmaker'), 'case.description' => __('Case description', 'processmaker'),
'case.url' => __('URL'), 'case.url' => __('Case URL'),
'var.XXX' => __('Case variable \'XXX\'', 'processmaker'), 'var.XXX' => __('Case variable \'XXX\'', 'processmaker'),
'array.YYY' => __('List of values in \'YYY\' array', 'processmaker'), 'array.YYY' => __('List of values in \'YYY\' array', 'processmaker'),
'array.numberofYYY' => __('Number of rows 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) { 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['allowed_values'] = [__('YYY is to be replaced by any array variables', 'processmaker')];
$elt['foreach'] = true; $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); $this->addTagToList($elt);
} }
@@ -87,7 +100,7 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
* Get all data needed for template processing * Get all data needed for template processing
**/ **/
public function addDataForTemplate($event, $options = []) { public function addDataForTemplate($event, $options = []) {
global $PM_DB, $CFG_GLPI; global $CFG_GLPI, $PM_DB;
$excluded = ['_VAR_CHANGED_', $excluded = ['_VAR_CHANGED_',
'PIN', 'PIN',
@@ -107,11 +120,6 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
$process->getFromDB($options['case']->fields['plugin_processmaker_processes_id']); $process->getFromDB($options['case']->fields['plugin_processmaker_processes_id']);
$taskcat_id = $process->fields['taskcategories_id']; $taskcat_id = $process->fields['taskcategories_id'];
// set defaults to all
foreach ($this->tags as $key => $val) {
$this->data["##$key##"] = "-";
}
// get case variable values // get case variable values
$res = $PM_DB->query("SELECT APP_DATA, APP_TITLE, APP_DESCRIPTION FROM APPLICATION WHERE APP_NUMBER = ".$options['case']->fields['id']); $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) { if ($res && $PM_DB->numrows($res) == 1) {
@@ -125,10 +133,16 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
// add numberof for count of rows // add numberof for count of rows
$this->data["##array.numberof$key##"] = count($val); $this->data["##array.numberof$key##"] = count($val);
// get the keys/vals of the sub-array // get the keys/vals of the sub-array
foreach ($val as $row) { foreach ($val as $attribute => $row) {
foreach ($row as $col_name => $col_val) { if (is_array($row)) {
$this->data["array.$key"][]["##array.$key.$col_name##"] = $col_val; $index = isset($this->data["array.$key"]) ? count($this->data["array.$key"]) : 0;
$this->data["##lang.array.$key.$col_name##"] = $col_name; 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 { } else {
@@ -145,18 +159,29 @@ class PluginProcessmakerNotificationTargetProcessmaker extends NotificationTarge
$this->data['##case.id##'] = $options['case']->fields['id']; $this->data['##case.id##'] = $options['case']->fields['id'];
// case URL // 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 // parent task information: meta data on process
// will get parent of task which is the process task category // will get parent of task which is the process task category
$tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'name'); $tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'name');
$tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'comment'); $tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'comment');
// process title // process title
$this->data['##process.categoryid##'] = $taskcat_id; $this->data['##process.categoryid##'] = $taskcat_id;
$this->data['##process.category##'] = $tmp_taskcatinfo['name']; $this->data['##process.category##'] = $tmp_taskcatinfo['name'];
$this->data['##process.categorycomment##'] = $tmp_taskcatinfo['comment']; $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(); $this->getTags();
foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) { foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) {
if (!isset($this->data[$tag])) { 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 NotificationTarget
class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotificationTargetProcessmaker { class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotificationTargetProcessmaker {
/** /**
* Summary of getDefaultEvents * Summary of getDefaultEvents
* @return array[] * @return array[]
*/ */
private static function getDefaultEvents() { private static function getDefaultEvents() {
return ['task_add' => ['event' => 'task_add_', 'label' => __('New task')], return ['task_add' => ['event' => 'task_add_', 'label' => __('Task add'), 'glpi' => 'add_task'],
'task_update' => ['event' => 'task_update_', 'label' => __('Update of a 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 * Summary of getNotification
* @param mixed $evt * @param mixed $evt
@@ -53,9 +69,7 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
$table = PluginProcessmakerTaskCategory::getTable(); $table = PluginProcessmakerTaskCategory::getTable();
$ptable = PluginProcessmakerProcess::getTable(); $ptable = PluginProcessmakerProcess::getTable();
$query = "SELECT $table.taskcategories_id AS taskcat, $ptable.taskcategories_id AS ptaskcat FROM $table $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 LEFT JOIN $ptable ON $ptable.id=$table.plugin_processmaker_processes_id";
WHERE $table.is_active = 1
AND $ptable.is_active = 1";
$ptaskcats = []; $ptaskcats = [];
$temp = new TaskCategory; $temp = new TaskCategory;
@@ -66,8 +80,9 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
} }
$temp->getFromDB($row['taskcat']); $temp->getFromDB($row['taskcat']);
$actions[$defaultEvents['task_add']['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $defaultEvents['task_add']['label']; foreach($defaultEvents as $events) {
$actions[$defaultEvents['task_update']['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $defaultEvents['task_update']['label']; $actions[$events['event'].$row['taskcat']] = $ptaskcats[$row['ptaskcat']]." > ".$temp->fields['name'].": " . $events['label'];
}
} }
return $actions; return $actions;
@@ -80,7 +95,7 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
public function addDataForTemplate($event, $options = []) { public function addDataForTemplate($event, $options = []) {
global $PM_DB, $CFG_GLPI; global $PM_DB, $CFG_GLPI;
if (!isset($options['case'])) { if (!isset($options['case']) || $options['case'] == null) {
$mycase = new PluginProcessmakerCase; $mycase = new PluginProcessmakerCase;
$mycase->getFromDB($options['plugin_processmaker_cases_id']); $mycase->getFromDB($options['plugin_processmaker_cases_id']);
$options['case'] = $mycase; $options['case'] = $mycase;
@@ -92,12 +107,12 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
$baseevent = $locevent[0].'_'.$locevent[1]; $baseevent = $locevent[0].'_'.$locevent[1];
$taskcat_id = $locevent[2]; $taskcat_id = $locevent[2];
// task action: add or update // task action: add, update or done
$this->data['##task.action##'] = $events[$baseevent]['label']; $this->data['##task.action##'] = $events[$baseevent]['label'];
// task category information: meta data on task // task category information: meta data on task
$tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'name'); $tmp_taskcatinfo['name'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'name');
$tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue( $taskcat_id, 'TaskCategory', 'comment'); $tmp_taskcatinfo['comment'] = DropdownTranslation::getTranslatedValue($taskcat_id, 'TaskCategory', 'comment');
$this->data['##task.categoryid##'] = $taskcat_id; $this->data['##task.categoryid##'] = $taskcat_id;
$this->data['##task.category##'] = $tmp_taskcatinfo['name']; $this->data['##task.category##'] = $tmp_taskcatinfo['name'];
$this->data['##task.categorycomment##'] = $tmp_taskcatinfo['comment']; $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'])); $this->data['##task.lastupdater##'] = Html::clean($dbu->getUserName($taskobj->fields['users_id_editor']));
// task technician // 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 // 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); $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 // task duration
$this->data['##task.time##'] = Html::timestampToString($taskobj->fields['actiontime'], false); $this->data['##task.time##'] = Html::timestampToString($taskobj->fields['actiontime'], false);
// add labels // add labels to tags that are not set
$this->getTags(); $this->getTags();
foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) { foreach ($this->tag_descriptions[NotificationTarget::TAG_LANGUAGE] as $tag => $values) {
if (!isset($this->data[$tag])) { if (!isset($this->data[$tag])) {
@@ -173,6 +202,9 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
'task.categorycomment' => __('Category comment'), 'task.categorycomment' => __('Category comment'),
'task.time' => __('Total duration'), 'task.time' => __('Total duration'),
'task.user' => __('User assigned to task'), '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.group' => __('Group assigned to task'),
'task.begin' => __('Start date'), 'task.begin' => __('Start date'),
'task.end' => __('End 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_TECH, __('Technician in charge of the task'));
$this->addTarget(Notification::TASK_ASSIGN_GROUP, __('Group 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) { if (strpos($event, 'task_update_') === 0) {
$this->addTarget(Notification::OLD_TECH_IN_CHARGE, $this->addTarget(Notification::OLD_TECH_IN_CHARGE,
__('Former technician in charge of the task')); __('Former technician in charge of the task'));
@@ -216,12 +253,35 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
*/ */
function addSpecificTargets($data, $options) { function addSpecificTargets($data, $options) {
//Look for all targets whose type is Notification::ITEM_USER $obj = $this->obj;
$this->obj = $options['obj'];
switch ($data['type']) { 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 : case Notification::USER_TYPE :
switch ($data['items_id']) { 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 //Send to the ITIL object followup author
case Notification::TASK_ASSIGN_TECH : case Notification::TASK_ASSIGN_TECH :
$this->addTaskAssignUser($options); $this->addTaskAssignUser($options);
@@ -239,72 +299,15 @@ class PluginProcessmakerNotificationTargetTask extends PluginProcessmakerNotific
} }
} }
$this->obj = $obj;
} }
/** /**
* Add user assigned to task * Summary of addOldAssignTechnician
* * @param $options
* @param array $options Options
*
* @return void
*/ */
function addTaskAssignUser($options = []) {
global $DB;
// In case of delete task pass user id
if (isset($options['task_users_id_tech'])) {
$query = $this->getDistinctUserSql()."
FROM `glpi_users` ".
$this->getProfileJoinSql()."
WHERE `glpi_users`.`id` = '".$options['task_users_id_tech']."'";
foreach ($DB->request($query) as $data) {
$this->addToRecipientsList($data);
}
} else if (isset($options['task_id'])) {
$dbu = new DbUtils;
$tasktable = $dbu->getTableForItemType($options['itemtype']); //getTableForItemType($this->obj->getType().'Task');
$query = $this->getDistinctUserSql()."
FROM `$tasktable`
INNER JOIN `glpi_users`
ON (`glpi_users`.`id` = `$tasktable`.`users_id_tech`)".
$this->getProfileJoinSql()."
WHERE `$tasktable`.`id` = '".$options['task_id']."'";
foreach ($DB->request($query) as $data) {
$this->addToRecipientsList($data);
}
}
}
/**
* 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 = []) { function addOldAssignTechnician($options = []) {
global $DB; global $DB;

View File

@@ -84,7 +84,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
private $pmWorkspace = ""; private $pmWorkspace = "";
private $pmAdminSession = false; 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 private $pm_group_guid = ''; // guid for default user group in Process Maker is used for all GLPI user synchronization into ProcessMaker
var $lasterror; var $lasterror;
var $lang; var $lang;
@@ -143,24 +143,24 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
public function addItemFollowup($itemtype, $itemId, $txtForFollowup, $users_id = null) { public function addItemFollowup($itemtype, $itemId, $txtForFollowup, $users_id = null) {
global $DB; global $DB;
$fu = new ITILFollowup();//new TicketFollowup(); $fu = new ITILFollowup();//new TicketFollowup();
$fu->getEmpty(); // to get default values //$fu->getEmpty(); // to get default values
$input = $fu->fields; $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']); $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']); $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']; $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']; $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']; $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['requesttypes_id'] = $txtForFollowup['GLPI_ITEM_FOLLOWUP_REQUESTTYPES_ID'];
} }
$input['items_id'] = $itemId;//$input['tickets_id'] = $itemId; $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). * 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) * 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() * A session must be open before with login()
* @param $case_guid The case ID, which can be obtained with the caseList() function * @param $case_guid string The case GUID, 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. * @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 a routeCaseResponse object, or false exception occured. routing is normalized to be always an array of routeListStruct * @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) { function routeCase($case_guid, $delIndex) {
try { try {
@@ -1330,9 +1330,9 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// insert into DB the link between glpi users and pm user // insert into DB the link between glpi users and pm user
$pmuser = new PluginProcessmakerUser; $pmuser = new PluginProcessmakerUser;
if ($pmuser->getFromDB( $user['id'] )) { 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 { } 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; $actionCode = 1;
@@ -1747,8 +1747,25 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
$res = $PM_DB->request([ $res = $PM_DB->request([
'SELECT' => 'CONTENT.CON_VALUE', 'SELECT' => 'CONTENT.CON_VALUE',
'FROM' => 'TASK_USER', 'FROM' => 'TASK_USER',
'INNER JOIN' => ['CONTENT' => ['AND' => ['FKEY' => ['CONTENT' => 'CON_ID', 'TASK_USER' => 'USR_UID'], ['CONTENT' => 'CON_CATEGORY', 'GRP_TITLE'], ['CONTENT' => 'CON_LANG', 'en']]]], 'INNER JOIN' => [
'WHERE' => ['AND' => ['TASK_USER.TAS_UID' => $pmTaskId, 'TASK_USER.TU_RELATION' => 2, 'TASK_USER.TU_TYPE' => 1]], '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 'LIMIT' => 1
]); ]);
//$query = "SELECT CONTENT.CON_VALUE FROM TASK_USER //$query = "SELECT CONTENT.CON_VALUE FROM TASK_USER
@@ -1758,7 +1775,13 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
$res = $PM_DB->request([ $res = $PM_DB->request([
'SELECT' => 'CON_VALUE', 'SELECT' => 'CON_VALUE',
'FROM' => 'CONTENT', '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 //$query = "SELECT CON_VALUE FROM CONTENT
// WHERE CONTENT.CON_ID='$groupId' AND CONTENT.CON_CATEGORY='GRP_TITLE' AND CONTENT.CON_LANG='en' ;"; // 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['is_private'] = 0;
$input['actiontime'] = 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 $input['users_id_tech'] = 0; // by default as it can't be empty
if ($techId) { if ($techId) {
$input['users_id_tech'] = $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) //$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);"; // VALUES ({$glpi_task->getId()}, '{$glpi_task->getType()}', $cases_id, {$pmtaskcat->fields['id']}, $delIndex, $delThread);";
//$DB->query( $query ); //$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 * Summary of add1stTask
* adds a GLPI task to ticket * adds a GLPI task to ticket
@@ -1958,10 +1999,12 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
* @param mixed $newtitle * @param mixed $newtitle
*/ */
public function setItemTitle($itemtype, $itemId, $newtitle) { public function setItemTitle($itemtype, $itemId, $newtitle) {
global $DB;
$dbu = new DbUtils; $dbu = new DbUtils;
$item = $dbu->getItemForItemtype( $itemtype ); $item = $dbu->getItemForItemtype( $itemtype );
if ($item->getFromDB( $itemId )) { 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 * @param mixed $casevariablevalues
*/ */
public function setItemSolution($itemType, $itemId, $casevariablevalues) { public function setItemSolution($itemType, $itemId, $casevariablevalues) {
global $DB;
$dbu = new DbUtils; $dbu = new DbUtils;
$item = $dbu->getItemForItemtype( $itemType ); $item = $dbu->getItemForItemtype( $itemType );
if ($item->getFromDB( $itemId )) { if ($item->getFromDB( $itemId )) {
@@ -2035,7 +2080,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
if ($solution != '') { if ($solution != '') {
$solution .= "\n"; $solution .= "\n";
} }
$solution .= $casevariablevalues[ 'GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION' ]; $solution .= $DB->escape($casevariablevalues[ 'GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION' ]);
$to_update = true; $to_update = true;
} }
@@ -2078,7 +2123,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
* 'begin' => is the new begin date of the task * 'begin' => is the new begin date of the task
* 'end' => is the new end 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) * '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 = []) { public function solveTask($cases_id, $delIndex, $options = []) {
global $DB; global $DB;
@@ -2098,7 +2143,6 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
$hostItem->getFromDB( $glpi_task->fields[ $itemFKField ] ); $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 // 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"]; $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"); $_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, //'groups_id_tech' => 0,
'content' => $DB->escape($glpi_task->fields[ 'content' ].$options['txtToAppend']) '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); $glpi_task->update($params);
PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif); PluginProcessmakerNotificationTargetProcessmaker::restoreNotificationState($donotif);
// Close the task // Close the task
//$DB->query("UPDATE glpi_plugin_processmaker_tasks SET del_thread_status = '".PluginProcessmakerTask::CLOSED."' WHERE id = {$row['id']}"); //$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']]); $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 // restore current glpi time
$_SESSION["glpi_currenttime"] = $saved_date_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) { 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 // must check if Task is bound to a PM task
$pmTask = new PluginProcessmakerTask($params['item']->getType()); $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 $params['item']->fields['can_edit'] = false; // to prevent task edition
// replace ##ticket.url##_PluginProcessmakerCase$processmakercases by a setActiveTab to the Case panel // replace ##ticket.url##_PluginProcessmakerCase$processmakercases by a setActiveTab to the Case panel
@@ -2301,7 +2390,7 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
} else { } else {
$params['item']->fields['content'] = str_replace( '##processmaker.taskcomment##', $taskComment, $params['item']->fields['content'] ); $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> // special case for <hr> which will provoke the rendering to be split into several <p>
// add <p></p> which othervise will be missing // add <p></p> which othervise will be missing
@@ -2574,7 +2663,10 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// ### 2nd call to save Data POST ### // ### 2nd call to save Data POST ###
curl_setopt($ch, CURLOPT_URL, $this->serverURL."/cases/cases_SaveData?UID=".$request['UID']."&APP_UID=".$request['APP_UID'] ); curl_setopt($ch, CURLOPT_URL, $this->serverURL."/cases/cases_SaveData?UID=".$request['UID']."&APP_UID=".$request['APP_UID'] );
$response = curl_exec ($ch); $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); curl_close ($ch);
if ($loggable) { 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" ); 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) { public function derivateCase($myCase, $request, $users_id = null) {
//$cookies, //$cookies,
global $PM_DB, $CFG_GLPI; global $PM_DB, $CFG_GLPI, $DB;
$itemtype = $myCase->getField('itemtype'); $itemtype = $myCase->getField('itemtype');
$items_id = $myCase->getField('items_id'); $items_id = $myCase->getField('items_id');
$item = new $itemtype; $item = new $itemtype;
$item->getFromDB($items_id); $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 // save the dynaform variables into the current case
if (isset($request['UID']) && isset($request['APP_UID']) && isset($request['__DynaformName__'])) { if (isset($request['UID']) && isset($request['APP_UID']) && isset($request['__DynaformName__'])) {
$resultSave = $this->saveForm( $request ); $resultSave = $this->saveForm( $request );
@@ -2910,6 +3004,16 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// now derivate the case !!! // now derivate the case !!!
$pmRouteCaseResponse = $this->routeCase($myCase->fields['case_guid'], $request['DEL_INDEX']); $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", $casevariables = ["GLPI_ITEM_TASK_CONTENT",
"GLPI_ITEM_APPEND_TO_TASK", "GLPI_ITEM_APPEND_TO_TASK",
@@ -2935,12 +3039,18 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
"GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION", "GLPI_ITEM_APPEND_TO_SOLUTION_DESCRIPTION",
"GLPI_ITEM_INITIAL_DUE_DATE", "GLPI_ITEM_INITIAL_DUE_DATE",
"GLPI_ITEM_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 // now tries to get some variables to setup content for new task and to append text to solved task
$casevariablevalues = $myCase->getVariables($casevariables); $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 = ''; $sendemail = '';
if (array_key_exists( 'GLPI_SEND_EMAIL', $casevariablevalues ) && $casevariablevalues[ 'GLPI_SEND_EMAIL' ] != '') { if (array_key_exists( 'GLPI_SEND_EMAIL', $casevariablevalues ) && $casevariablevalues[ 'GLPI_SEND_EMAIL' ] != '') {
$sendemail = json_decode($casevariablevalues[ 'GLPI_SEND_EMAIL' ], true); $sendemail = json_decode($casevariablevalues[ 'GLPI_SEND_EMAIL' ], true);
@@ -3034,23 +3144,23 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// reset those variables // reset those variables
$resetcasevariables = []; $resetcasevariables = [];
foreach ($casevariables as $val) { foreach ($casevariables as $val) {
$resetcasevariables[$val] = ''; if (!empty($casevariablevalues[$val])) {
$resetcasevariables[$val] = '';
}
} }
$resultSave = $myCase->sendVariables($resetcasevariables); $resultSave = $myCase->sendVariables($resetcasevariables);
// print_r( $pmRouteCaseResponse ) ;
// die() ;
// now manage tasks associated with item // now manage tasks associated with item
// switch own task to 'done' and create a new one // switch own task to 'done' and create a new one
$this->solveTask($myCase->getID(), $glpi_task = $this->solveTask($myCase->getID(),
$request['DEL_INDEX'], $request['DEL_INDEX'],
['txtToAppend' => $txtToAppendToTask, ['txtToAppend' => $txtToAppendToTask,
'users_id_tech' => $users_id, 'users_id_tech' => $users_id,
'begin' => $solvedTaskStartDate, 'begin' => $solvedTaskStartDate,
'end' => $solvedTaskEndDate, 'end' => $solvedTaskEndDate,
'toInformation' => $solvedTaskSetToInformation 'toInformation' => $solvedTaskSetToInformation
] ); ]
);
// create a followup if requested // create a followup if requested
if ($createFollowup) { // && $itemtype == 'Ticket') { if ($createFollowup) { // && $itemtype == 'Ticket') {
@@ -3081,6 +3191,38 @@ class PluginProcessmakerProcessmaker extends CommonDBTM {
// get the new case info // get the new case info
$caseInfo = $myCase->getCaseInfo($request['DEL_INDEX']); // not sure that it should passed this $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 // now create the new tasks if any
if (property_exists( $pmRouteCaseResponse, 'routing' )) { if (property_exists( $pmRouteCaseResponse, 'routing' )) {

View File

@@ -67,6 +67,15 @@ class PluginProcessmakerTask extends CommonITILTask
return false; return false;
} }
/**
* Summary of getPMTaskID
* @return mixed
*/
function getPMTaskID() {
return $this->fields['items_id'];
}
/** /**
* Summary of getToDoTasks * Summary of getToDoTasks
* returns all 'to do' tasks associated with this case * returns all 'to do' tasks associated with this case
@@ -377,31 +386,53 @@ class PluginProcessmakerTask extends CommonITILTask
} }
if (isset($currentUser)) { 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 // 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 "<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() // try to get users whom can't be assigned to this task
."&items_id=" // already assigned user can't be assigned again to this task
.$case->fields['items_id'] $current_assigned_user = PluginProcessmakerUser::getGLPIUserId($currentUser->userId);
."&itemtype=" // and then any forbiden users defined from the case itself
.$case->fields['itemtype'] $casevariablevalues = $case->getVariables(['GLPI_TASK_PREVENT_REASSIGN']);
."&users_id=" $prevent_assign = [];
.PluginProcessmakerUser::getGLPIUserId($currentUser->userId) if (array_key_exists( 'GLPI_TASK_PREVENT_REASSIGN', $casevariablevalues ) && $casevariablevalues[ 'GLPI_TASK_PREVENT_REASSIGN' ] != '') {
."&taskGuid=" $prevent_assign = json_decode($casevariablevalues[ 'GLPI_TASK_PREVENT_REASSIGN' ], true);
.$currentUser->taskId }
."&delIndex={$task[$tabnum]['del_index']}&delThread={$currentUser->delThread}&rand=$rand' ); </script>";
//} else {
// // manages the claim $used_users = [];
// // current task is to be claimed $used_users[] = $current_assigned_user;
// // get the assigned group to the item task if (array_key_exists($currentUser->taskId, $prevent_assign)) {
// $itemtask = $dbu->getItemForItemtype( $task[$tabnum]['itemtype'] ); if (is_array($prevent_assign[$currentUser->taskId])) {
// $itemtask->getFromDB( $task[$tabnum]['items_id'] ); foreach ($prevent_assign[$currentUser->taskId] as $pmuser) {
// // check if this group can be found in the current user's groups $usr_id = PluginProcessmakerUser::getGlpiIdFromAny($pmuser);
// if (!isset($_SESSION['glpigroups']) || !in_array( $itemtask->fields['groups_id_tech'], $_SESSION['glpigroups'] )) { if ($usr_id) {
// $hide_claim_button=true; $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']) { if (!$currentUser->userId || !$task[$tabnum]['del_index']) {
@@ -422,18 +453,6 @@ class PluginProcessmakerTask extends CommonITILTask
$csrf = Session::getNewCSRFToken(); $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 $url = $PM_SOAP->serverURL
."/cases/cases_Open?sid=".$PM_SOAP->getPMSessionID() ."/cases/cases_Open?sid=".$PM_SOAP->getPMSessionID()
."&APP_UID=".$case->fields['case_guid'] ."&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; return 0;
} }
/** /**
* Summary of getPMUserId * Summary of getPMUserId
* returns processmaker user id for given GLPI user id * returns processmaker user id for given GLPI user id
@@ -309,6 +310,31 @@ class PluginProcessmakerUser extends CommonDBTM {
return false; 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 // * Summary of getNewPassword
// * @param mixed $username // * @param mixed $username

View File

@@ -81,7 +81,7 @@ CREATE TABLE IF NOT EXISTS `glpi_plugin_processmaker_configs` (
`domain` varchar(50) DEFAULT '', `domain` varchar(50) DEFAULT '',
`maintenance` tinyint(1) NOT NULL DEFAULT '0', `maintenance` tinyint(1) NOT NULL DEFAULT '0',
`ssl_verify` 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', `max_cases_per_item` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@@ -44,6 +44,10 @@ function processmaker_update() {
// will upgrade 3.3.8 to 3.4.9 // 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"); 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(); $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)) { 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; //debugger;
contentDocument = caseIFrame.contentDocument; contentDocument = caseIFrame.contentDocument;
var txtAreaUserRequestSumUp = contentDocument.getElementById('form[UserRequestSumUp]'); var txtAreaUserRequestSumUp = contentDocument.getElementById('form[UserRequestSumUp]');
if (txtAreaUserRequestSumUp) { if ($("textarea[name='content']").val() == '') {
$("textarea[name='content']").val($(txtAreaUserRequestSumUp).val()); if (txtAreaUserRequestSumUp) {
} else { tinymce.activeEditor.setContent($(txtAreaUserRequestSumUp).val().replace(/(\r\n)|(\r)|(\n)/g, '<br>'));
$("textarea[name='content']").val('_'); } else {
tinymce.activeEditor.setContent('_');
}
} }
// call old handler if any // call old handler if any

Binary file not shown.

View File

@@ -1,22 +1,23 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: processmaker-plugin\n" "Project-Id-Version: processmaker-plugin\n"
"POT-Creation-Date: 2018-08-06 14:32+0200\n" "POT-Creation-Date: 2020-07-13 09:41+0200\n"
"PO-Revision-Date: 2018-08-06 14:44+0200\n" "PO-Revision-Date: 2020-07-13 11:02+0200\n"
"Last-Translator: tomolimo\n" "Last-Translator: tomolimo\n"
"Language-Team: French\n" "Language-Team: French\n"
"Language: fr_FR\n" "Language: fr_FR\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.1.1\n" "X-Generator: Poedit 2.3.1\n"
"X-Poedit-Basepath: ..\n" "X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\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;" "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"
"_ex:1c,2,3t;_sx:1c,2,3t;_nx:1c,2,3,5t\n"
"X-Crowdin-Project: processmaker-plugin\n" "X-Crowdin-Project: processmaker-plugin\n"
"X-Crowdin-Project-ID: 310131\n"
"X-Crowdin-Language: fr\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-0: ajax\n"
"X-Poedit-SearchPath-1: front\n" "X-Poedit-SearchPath-1: front\n"
"X-Poedit-SearchPath-2: inc\n" "X-Poedit-SearchPath-2: inc\n"
@@ -25,239 +26,306 @@ msgstr ""
"X-Poedit-SearchPath-5: hook.php\n" "X-Poedit-SearchPath-5: hook.php\n"
"X-Poedit-SearchPath-6: setup.php\n" "X-Poedit-SearchPath-6: setup.php\n"
#: ajax/task_users.php:25 #: ajax/task_users.php:36
msgid "Re-assign task to" msgid "Re-assign task to"
msgstr "Ré-affecter tâche à" 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" msgid "Re-assign"
msgstr "Ré-affecter" 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!" msgid "Case has been deleted!"
msgstr "Le cas a été effacé !" msgstr "Le cas a été effacé !"
#: front/case.form.php:37 #: front/case.form.php:34
msgid "Unable to delete case!" msgid "Unable to delete case!"
msgstr "Impossible d'effacer le cas !" msgstr "Impossible d'effacer le cas !"
#: front/case.form.php:50 #: front/case.form.php:46
msgid "Case has been cancelled!" msgid "Case has been cancelled!"
msgstr "Le cas a été annulé !" 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!" msgid "Unable to cancel case!"
msgstr "Impossible d'annuler le cas !" 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" msgid "Process cases"
msgstr "Cas des processus" msgstr "Cas des processus"
#: front/case.php:5 front/caselink.form.php:27 front/caselink.php:5 #: front/case.php:5 front/caselink.form.php:29 front/caselink.php:5
#: front/process.form.php:25 front/process.php:5 inc/caselink.class.php:143 #: front/process.form.php:27 front/process.php:5 inc/caselink.class.php:157
#: inc/config.class.php:50 inc/config.class.php:354 inc/process.class.php:393 #: 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 #: inc/profile.class.php:52 inc/profile.class.php:83
msgid "ProcessMaker" msgid "ProcessMaker"
msgstr "ProcessMaker" msgstr "ProcessMaker"
#: front/processmaker.form.php:85 #: front/processmaker.form.php:80
msgid "Task re-assigned!" msgid "Task re-assigned!"
msgstr "Tâche ré-affectée !" msgstr "Tâche ré-affectée !"
#: front/processmaker.form.php:87 #: front/processmaker.form.php:82
msgid "Error re-assigning task: " 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 #: front/processmaker.form.php:93
msgid "Task already assigned to this person!" #| msgid "Task name"
msgstr "Tâche déjà affectée à cette personne !" 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 #: front/processmaker.helpdesk.form.php:21
msgid "Process - Case" msgid "Process - Case"
msgstr "Processus - Cas" 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" msgid "Select the process you want to add"
msgstr "Choisir le processus à démarrer" 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" msgid "Synchronize Task List"
msgstr "Synchroniser la liste des Tâches" 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" msgid "Case"
msgstr "Cas" 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" msgid "Status"
msgstr "Statut" 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 "Process case"
msgid_plural "Process cases" msgid_plural "Process cases"
msgstr[0] "Cas du processus" msgstr[0] "Cas du processus"
msgstr[1] "Cas des processus" msgstr[1] "Cas des processus"
#: inc/case.class.php:80 #: inc/case.class.php:92
msgid "Sub-case" msgid "Sub-case"
msgstr "Sous-cas" 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" msgid "Current task(s) properties"
msgstr "Propriétés des tâches en cours" 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" msgid "Task"
msgstr "Tâche" 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" msgid "Task guid"
msgstr "Guid de la tâche" 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" msgid "Current user"
msgstr "Utilisateur actuel" 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" msgid "Task delegation date"
msgstr "Date de délégation de tâche" 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" msgid "To be claimed"
msgstr "A réclamer" msgstr "A réclamer"
#: inc/case.class.php:377 #: inc/case.class.php:575
msgid "Sub-case properties" msgid "Sub-case properties"
msgstr "Propriétés du sous-cas" msgstr "Propriétés du sous-cas"
#: inc/case.class.php:380 #: inc/case.class.php:578
msgid "Parent case properties" msgid "Parent case properties"
msgstr "Propriétés du cas parent" msgstr "Propriétés du cas parent"
#: inc/case.class.php:382 #: inc/case.class.php:580
msgid "Case properties" msgid "Case properties"
msgstr "Propriétés du cas" msgstr "Propriétés du cas"
#: inc/case.class.php:387 inc/case.class.php:584 inc/case.class.php:1036 #: inc/case.class.php:585 inc/case.class.php:776 inc/case.class.php:1328
#: inc/process.class.php:548 #: inc/process.class.php:576
msgid "Process" msgid "Process"
msgstr "Processus" msgstr "Processus"
#: inc/case.class.php:388 #: inc/case.class.php:586 inc/notificationtargetprocessmaker.class.php:64
msgid "Case title" msgid "Case title"
msgstr "Titre du cas" msgstr "Titre du cas"
#: inc/case.class.php:389 #: inc/case.class.php:587
msgid "Case number" msgid "Case number"
msgstr "Numéro du cas" msgstr "Numéro du cas"
#: inc/case.class.php:390 #: inc/case.class.php:588
msgid "Case status" msgid "Case status"
msgstr "Statut du cas" msgstr "Statut du cas"
#: inc/case.class.php:391 #: inc/case.class.php:589
msgid "Case guid" msgid "Case guid"
msgstr "Guid du cas" msgstr "Guid du cas"
#: inc/case.class.php:392 #: inc/case.class.php:590
msgid "Creator" msgid "Creator"
msgstr "Créateur" msgstr "Créateur"
#: inc/case.class.php:393 #: inc/case.class.php:591 inc/case.class.php:1370
msgid "Creation date" msgid "Creation date"
msgstr "Date de création" msgstr "Date de création"
#: inc/case.class.php:394 #: inc/case.class.php:592
msgid "Last update" msgid "Last update"
msgstr "Dernière mise à jour" msgstr "Dernière mise à jour"
#: inc/case.class.php:479 #: inc/case.class.php:675
#, php-format #, php-format
msgid "Case is linked to a %1s" msgid "Case is linked to a %1s"
msgstr "Le cas est lié à un %1s" msgstr "Le cas est lié à un %1s"
#: inc/case.class.php:481 #: inc/case.class.php:677
#, php-format #, php-format
msgid "Sub-case is linked to a %1s" msgid "Sub-case is linked to a %1s"
msgstr "Le sous-cas est lié à un %1s" msgstr "Le sous-cas est lié à un %1s"
#: inc/case.class.php:506 #: inc/case.class.php:698
msgid "Case cancellation" msgid "Case cancellation"
msgstr "Annulation du cas" msgstr "Annulation du cas"
#: inc/case.class.php:507 #: inc/case.class.php:699
msgid "Cancel case" msgid "Cancel case"
msgstr "Annuler cas" msgstr "Annuler cas"
#: inc/case.class.php:511 #: inc/case.class.php:703
msgid "Confirm cancellation?" msgid "Confirm cancellation?"
msgstr "Confirmer lannulation ?" 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" msgid "Cancel"
msgstr "Annuler" msgstr "Annuler"
#: inc/case.class.php:532 #: inc/case.class.php:717
msgid "Case deletion" msgid "Case deletion"
msgstr "Suppression du cas" msgstr "Suppression du cas"
#: inc/case.class.php:533 #: inc/case.class.php:777 inc/case.class.php:1321
msgid "Delete case"
msgstr "Supprimer le cas"
#: inc/case.class.php:585 inc/case.class.php:1029
msgid "Title" msgid "Title"
msgstr "Titre" 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" msgid "Sub-case of"
msgstr "Sous-cas de" msgstr "Sous-cas de"
#: inc/case.class.php:602 #: inc/case.class.php:796
msgid "Add a new case" msgid "Add a new case"
msgstr "Ajouter un nouveau cas" msgstr "Ajouter un nouveau cas"
#: inc/case.class.php:995 #: inc/case.class.php:1227
msgctxt "case_status" msgctxt "case_status"
msgid "Draft" msgid "Draft"
msgstr "Brouillon" msgstr "Brouillon"
#: inc/case.class.php:996 #: inc/case.class.php:1228
msgctxt "case_status" msgctxt "case_status"
msgid "To do" msgid "To do"
msgstr "A faire" msgstr "A faire"
#: inc/case.class.php:997 #: inc/case.class.php:1229
msgctxt "case_status" msgctxt "case_status"
msgid "Completed" msgid "Completed"
msgstr "Terminé" msgstr "Terminé"
#: inc/case.class.php:998 #: inc/case.class.php:1230
msgctxt "case_status" msgctxt "case_status"
msgid "Cancelled" msgid "Cancelled"
msgstr "Annulé" msgstr "Annulé"
#: inc/case.class.php:1022 #: inc/case.class.php:1314
msgid "ID" msgid "ID"
msgstr "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" msgid "Item"
msgstr "Item" msgstr "Item"
#: inc/case.class.php:1056 #: inc/case.class.php:1349
msgid "Item entity" msgid "Item entity"
msgstr "Entité de l'item" 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" msgid "Change log"
msgstr "Evolution" msgstr "Evolution"
#: inc/casedynaform.class.php:80 #: inc/casedynaform.class.php:83
msgid "Dynaforms" msgid "Dynaforms"
msgstr "DynaForms" msgstr "DynaForms"
#: inc/casehistory.class.php:35 #: inc/casehistory.class.php:36
msgid "History" msgid "History"
msgstr "Historique" msgstr "Historique"
@@ -269,43 +337,51 @@ msgstr "Liens-cas"
msgid "Case-link" msgid "Case-link"
msgstr "Lien-cas" 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" msgid "External data"
msgstr "Données externes" 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" msgid "Self"
msgstr "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" msgid "Source task GUID"
msgstr "GUID de la tâche source" 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" msgid "Target task GUID"
msgstr "GUID de la tâche cible" 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" msgid "Target process GUID"
msgstr "GUID du Processus cible" 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" msgid "Target dynaform GUID"
msgstr "GUID du dynaform cible" 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" msgid "Source condition"
msgstr "Condition d'activation du lien" 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" msgid "Claim target task"
msgstr "Tâche cible 'à réclamer'" 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" msgid "External application JSON config"
msgstr "Configuration JSON de l'application externe" msgstr "Configuration JSON de l'application externe"
#: inc/casemap.class.php:43 #: inc/casemap.class.php:44
msgid "Map" msgid "Map"
msgstr "Carte" msgstr "Carte"
@@ -314,190 +390,294 @@ msgid "ProcessMaker setup"
msgstr "Configuration du serveur ProcessMaker" msgstr "Configuration du serveur ProcessMaker"
#: inc/config.class.php:159 #: inc/config.class.php:159
msgid "Server URL (must be in same domain than GLPI)" #| 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, 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" msgid "Common domain with GLPI"
msgstr "Domaine commun avec GLPI" msgstr "Domaine commun avec GLPI"
#: inc/config.class.php:193 #: inc/config.class.php:192
msgid "None!" msgid "None!"
msgstr "Aucun !" 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" msgid "Workspace Name"
msgstr "Nom du Workspace" msgstr "Nom du Workspace"
#: inc/config.class.php:207 #: inc/config.class.php:211
msgid "Server administrator name" msgid "Server administrator name"
msgstr "Non de l'administreur du server ProcessMaker" msgstr "Non de l'administreur du server ProcessMaker"
#: inc/config.class.php:212 #: inc/config.class.php:216
msgid "Server administrator password" msgid "Server administrator password"
msgstr "Mot de passe de l'administrateur du serveur ProcessMaker" 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" msgid "Connection status"
msgstr "Status de la connexion" msgstr "Status de la connexion"
#: inc/config.class.php:234 #: inc/config.class.php:238
msgid "SQL server setup" msgid "SQL server setup"
msgstr "Configuration du serveur SQL" msgstr "Configuration du serveur SQL"
#: inc/config.class.php:237 #: inc/config.class.php:241
msgid "SQL server (MariaDB or MySQL)" msgid "SQL server (MariaDB or MySQL)"
msgstr "SQL server (MariaDB ou MySQL)" msgstr "SQL server (MariaDB ou MySQL)"
#: inc/config.class.php:242 #: inc/config.class.php:246
msgid "Database name" msgid "Database name"
msgstr "Nom de la base de données" msgstr "Nom de la base de données"
#: inc/config.class.php:247 #: inc/config.class.php:251
msgid "SQL user" msgid "SQL user"
msgstr "Utilisateur SQL" msgstr "Utilisateur SQL"
#: inc/config.class.php:252 #: inc/config.class.php:256
msgid "SQL password" msgid "SQL password"
msgstr "Mot de passe SQL" msgstr "Mot de passe SQL"
#: inc/config.class.php:269 #: inc/config.class.php:273
msgid "Theme Name" msgid "Theme Name"
msgstr "Nom du thème" msgstr "Nom du thème"
#: inc/config.class.php:275 #: inc/config.class.php:279
msgid "Main Task Category (edit to change name)" msgid "Main Task Category (edit to change name)"
msgstr "Catégorie principale des tâches (éditer pour changer le nom)" 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)" msgid "Task Writer (edit to change name)"
msgstr "Auteur des tâches (éditer pour changer le nom)" 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" msgid "Group in ProcessMaker which will contain all GLPI users"
msgstr "Groupe dans ProcessMaker qui contiendra les utilisateurs de GLPI" 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" msgid "Processmaker system information"
msgstr "Informations système du serveur ProcessMaker" 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" msgid "Version"
msgstr "Version" msgstr "Version"
#: inc/config.class.php:335 #: inc/config.class.php:344
msgid "Web server" msgid "Web server"
msgstr "Serveur web" msgstr "Serveur web"
#: inc/config.class.php:336 #: inc/config.class.php:345
msgid "Server name" msgid "Server name"
msgstr "Nom du serveur" msgstr "Nom du serveur"
#: inc/config.class.php:337 #: inc/config.class.php:346
msgid "PHP version" msgid "PHP version"
msgstr "Version de PHP" msgstr "Version de PHP"
#: inc/config.class.php:338 #: inc/config.class.php:347
msgid "DB version" msgid "DB version"
msgstr "Version de la Db" msgstr "Version de la Db"
#: inc/config.class.php:339 #: inc/config.class.php:348
msgid "DB server IP" msgid "DB server IP"
msgstr "IP du serveur DB" msgstr "IP du serveur DB"
#: inc/config.class.php:340 #: inc/config.class.php:349
msgid "DB name" msgid "DB name"
msgstr "Nom de la BD" msgstr "Nom de la BD"
#: inc/config.class.php:341 #: inc/config.class.php:350
msgid "User browser" msgid "User browser"
msgstr "Navigateur de lutilisateur" msgstr "Navigateur de lutilisateur"
#: inc/config.class.php:342 #: inc/config.class.php:351
msgid "User IP" msgid "User IP"
msgstr "IP de l'utilisateur" msgstr "IP de l'utilisateur"
#: inc/config.class.php:344 #: inc/config.class.php:353
msgid "Not yet!" msgid "Not yet!"
msgstr "Pas encore !" 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" msgid "Synchronize Process List"
msgstr "Synchroniser la liste des processus" 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" msgid "Process GUID"
msgstr "GUID du Processus" msgstr "GUID du Processus"
#: inc/process.class.php:433 #: inc/process.class.php:449
msgid "Process type" msgid "Process type"
msgstr "Type de processus" msgstr "Type de processus"
#: inc/process.class.php:439 #: inc/process.class.php:455
msgid "Hide case num. & title" msgid "Hide case num. & title"
msgstr "Cacher num. et titre du cas" msgstr "Cacher num. et titre du cas"
#: inc/process.class.php:445 #: inc/process.class.php:461
msgid "Insert Task Category" msgid "Insert Task Category"
msgstr "Insérer la catégorie des tâches" msgstr "Insérer la catégorie des tâches"
#: inc/process.class.php:457 #: inc/process.class.php:473
msgid "Ticket type (self-service)" msgid "Ticket type (self-service)"
msgstr "Type de ticket (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" msgid "Visible in Incident for Central interface"
msgstr "Visible pour un Incident sur l'interface Centrale" 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" msgid "Visible in Request for Central interface"
msgstr "Visible pour une demande sur l'interface Centrale" 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" msgid "Visible in Change"
msgstr "Visible dans un Changement" 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" msgid "Visible in Problem"
msgstr "Visible dans un Problème" 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" msgctxt "process_type"
msgid "Classic" msgid "Classic"
msgstr "Classique" msgstr "Classique"
#: inc/process.class.php:520 #: inc/process.class.php:548
msgctxt "process_type" msgctxt "process_type"
msgid "BPMN" msgid "BPMN"
msgstr "BPMN" msgstr "BPMN"
#: inc/process.class.php:546 #: inc/process.class.php:574
msgid "Processes" msgid "Processes"
msgstr "Processus" msgstr "Processus"
#: inc/process.class.php:599 #: inc/process.class.php:627
msgid "Hide case number and title in task descriptions" msgid "Hide case number and title in task descriptions"
msgstr "Masquer numéro et titre des cas dans les descriptions des tâches" 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" msgid "Insert Task Category comments in Task Description"
msgstr "" msgstr "Insérer les commentaires des Catégories de Tâches dans les descriptions des Tâches"
"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)" msgid "ITIL Category for Self-service interface (left empty to disable)"
msgstr "" msgstr "Catégorie ITIL pour l'interface libre-service (laissez vide pour désactiver)"
"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" msgid "Type for Self-service interface"
msgstr "Type de ticket pour l'interface libre-service" 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)" msgid "Process type (to be changed only if not up-to-date)"
msgstr "Type de processus (à modifier uniquement si pas à jour)" 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 #: inc/process_profile.class.php:26 inc/process_profile.class.php:45
msgid "Authorizations" msgid "Authorizations"
msgstr "Autorisations" msgstr "Autorisations"
@@ -516,40 +696,42 @@ msgctxt "errors"
msgid "Can't create case: no rights for it!" msgid "Can't create case: no rights for it!"
msgstr "Impossible de créer le cas : pas de droits pour cela !" 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." msgid "Syncs GLPI users and groups into ProcessMaker."
msgstr "Synchronisation des utilisateurs GLPI et des groups avec 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." msgid "Cleaning of orphan cases."
msgstr "Nettoyage des cas orphelins." msgstr "Nettoyage des cas orphelins."
#: inc/processmaker.class.php:986 #: inc/processmaker.class.php:1014
msgid "Number of days to keep orphan cases" msgid "Number of days to keep orphan cases"
msgstr "Nombre de jours avant nettoyage des cas orphelins" 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." msgid "To apply task actions between cases."
msgstr "Pour appliquer des actions de tâches entre cas." msgstr "Pour appliquer des actions de tâches entre cas."
#: inc/processmaker.class.php:1696 #: inc/processmaker.class.php:1720
msgid "Case title: " msgid "Case title: "
msgstr "Titre du cas : " msgstr "Titre du cas : "
#: inc/processmaker.class.php:2178 #: inc/processmaker.class.php:2275
msgid "A 'Case' is running!" msgid "A 'Case' is running!"
msgstr "Un 'Cas' est en cours !" 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)!" msgid "You must manage it first (see 'Process - Case' tab)!"
msgstr "Vous devez d'abord le terminer (voir onglet 'Processus - Cas') !" msgstr "Vous devez d'abord le terminer (voir onglet 'Processus - Cas') !"
#: inc/processmaker.class.php:3038 #: inc/processmaker.class.php:2774
msgid "" #, php-format
"ProcessMaker plugin is under maintenance, please retry later, thank you." msgid "Unable to derivate case! Retry in a moment, or ask your administrator.<hr>Error code: %u<br/>Error message: %s<br/>"
msgstr "" 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/>"
"Le plugin ProcessMaker est en maintenance, veuillez ré-essayer plus tard, "
"merci." #: 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 #: inc/profile.class.php:17
msgid "Process configuration" msgid "Process configuration"
@@ -559,36 +741,62 @@ msgstr "Configuration des Processus"
msgid "Cases" msgid "Cases"
msgstr "Cas" 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 #: inc/task.class.php:29
msgid "Process case task" msgid "Process case task"
msgid_plural "Process case tasks" msgid_plural "Process case tasks"
msgstr[0] "Tâche d'un cas" msgstr[0] "Tâche d'un cas"
msgstr[1] "Tâches 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)" msgid "Sub-case task(s)"
msgstr "Tache(s) du sous-cas" 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" msgid "Task List"
msgstr "Liste des tâches" msgstr "Liste des tâches"
#: inc/taskcategory.class.php:32 #: inc/taskcategory.class.php:40 inc/taskcategory.class.php:118
msgid "Task name" msgid "Task name"
msgstr "Nom de la Tâche" 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" msgid "Start"
msgstr "Démarrer" msgstr "Démarrer"
#: inc/taskcategory.class.php:35 #: inc/taskcategory.class.php:43 inc/taskcategory.class.php:122
msgid "Task GUID" msgid "Task GUID"
msgstr "GUID de la Tâche" 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" msgid "Sub-process"
msgstr "Sous-processus" 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" #~ msgid "Case item"
#~ msgstr "Case item" #~ msgstr "Case item"

View File

@@ -1,15 +1,15 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Processmaker plugin 3.3.0\n" "Project-Id-Version: Processmaker plugin 3.3.0\n"
"POT-Creation-Date: 2018-08-06 14:32+0200\n" "POT-Creation-Date: 2020-07-13 09:41+0200\n"
"PO-Revision-Date: 2018-08-06 14:33+0200\n" "PO-Revision-Date: 2020-07-13 11:03+0200\n"
"Last-Translator: tomolimo\n" "Last-Translator: tomolimo\n"
"Language-Team: en_GB\n" "Language-Team: en_GB\n"
"Language: en_GB\n" "Language: en_GB\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.1.1\n" "X-Generator: Poedit 2.3.1\n"
"X-Poedit-Basepath: ..\n" "X-Poedit-Basepath: ..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\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;" "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-5: hook.php\n"
"X-Poedit-SearchPath-6: setup.php\n" "X-Poedit-SearchPath-6: setup.php\n"
#: ajax/task_users.php:25 #: ajax/task_users.php:36
msgid "Re-assign task to" msgid "Re-assign task to"
msgstr "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" msgid "Re-assign"
msgstr "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!" msgid "Case has been deleted!"
msgstr "Case has been deleted!" msgstr "Case has been deleted!"
#: front/case.form.php:37 #: front/case.form.php:34
msgid "Unable to delete case!" msgid "Unable to delete case!"
msgstr "Unable to delete case!" msgstr "Unable to delete case!"
#: front/case.form.php:50 #: front/case.form.php:46
msgid "Case has been cancelled!" msgid "Case has been cancelled!"
msgstr "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!" msgid "Unable to cancel case!"
msgstr "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" msgid "Process cases"
msgstr "Process cases" msgstr "Process cases"
#: front/case.php:5 front/caselink.form.php:27 front/caselink.php:5 #: front/case.php:5 front/caselink.form.php:29 front/caselink.php:5
#: front/process.form.php:25 front/process.php:5 inc/caselink.class.php:143 #: front/process.form.php:27 front/process.php:5 inc/caselink.class.php:157
#: inc/config.class.php:50 inc/config.class.php:354 inc/process.class.php:393 #: 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 #: inc/profile.class.php:52 inc/profile.class.php:83
msgid "ProcessMaker" msgid "ProcessMaker"
msgstr "ProcessMaker" msgstr "ProcessMaker"
#: front/processmaker.form.php:85 #: front/processmaker.form.php:80
msgid "Task re-assigned!" msgid "Task re-assigned!"
msgstr "Task re-assigned!" msgstr "Task re-assigned!"
#: front/processmaker.form.php:87 #: front/processmaker.form.php:82
msgid "Error re-assigning task: " msgid "Error re-assigning task: "
msgstr "Error re-assigning task: " msgstr "Error re-assigning task: "
#: front/processmaker.form.php:90 #: front/processmaker.form.php:93
msgid "Task already assigned to this person!" #| msgid "Task name"
msgstr "Task already assigned to this person!" 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 #: front/processmaker.helpdesk.form.php:21
msgid "Process - Case" msgid "Process - Case"
msgstr "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" msgid "Select the process you want to add"
msgstr "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" msgid "Synchronize Task List"
msgstr "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" msgid "Case"
msgstr "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" msgid "Status"
msgstr "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 "Process case"
msgid_plural "Process cases" msgid_plural "Process cases"
msgstr[0] "Process case" msgstr[0] "Process case"
msgstr[1] "Process cases" msgstr[1] "Process cases"
#: inc/case.class.php:80 #: inc/case.class.php:92
msgid "Sub-case" msgid "Sub-case"
msgstr "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" msgid "Current task(s) properties"
msgstr "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" msgid "Task"
msgstr "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" msgid "Task guid"
msgstr "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" msgid "Current user"
msgstr "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" msgid "Task delegation date"
msgstr "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" msgid "To be claimed"
msgstr "To be claimed" msgstr "To be claimed"
#: inc/case.class.php:377 #: inc/case.class.php:575
msgid "Sub-case properties" msgid "Sub-case properties"
msgstr "Sub-case properties" msgstr "Sub-case properties"
#: inc/case.class.php:380 #: inc/case.class.php:578
msgid "Parent case properties" msgid "Parent case properties"
msgstr "Parent case properties" msgstr "Parent case properties"
#: inc/case.class.php:382 #: inc/case.class.php:580
msgid "Case properties" msgid "Case properties"
msgstr "Case properties" msgstr "Case properties"
#: inc/case.class.php:387 inc/case.class.php:584 inc/case.class.php:1036 #: inc/case.class.php:585 inc/case.class.php:776 inc/case.class.php:1328
#: inc/process.class.php:548 #: inc/process.class.php:576
msgid "Process" msgid "Process"
msgstr "Process" msgstr "Process"
#: inc/case.class.php:388 #: inc/case.class.php:586 inc/notificationtargetprocessmaker.class.php:64
msgid "Case title" msgid "Case title"
msgstr "Case title" msgstr "Case title"
#: inc/case.class.php:389 #: inc/case.class.php:587
msgid "Case number" msgid "Case number"
msgstr "Case number" msgstr "Case number"
#: inc/case.class.php:390 #: inc/case.class.php:588
msgid "Case status" msgid "Case status"
msgstr "Case status" msgstr "Case status"
#: inc/case.class.php:391 #: inc/case.class.php:589
msgid "Case guid" msgid "Case guid"
msgstr "Case guid" msgstr "Case guid"
#: inc/case.class.php:392 #: inc/case.class.php:590
msgid "Creator" msgid "Creator"
msgstr "Creator" msgstr "Creator"
#: inc/case.class.php:393 #: inc/case.class.php:591 inc/case.class.php:1370
msgid "Creation date" msgid "Creation date"
msgstr "Creation date" msgstr "Creation date"
#: inc/case.class.php:394 #: inc/case.class.php:592
msgid "Last update" msgid "Last update"
msgstr "Last update" msgstr "Last update"
#: inc/case.class.php:479 #: inc/case.class.php:675
#, php-format #, php-format
msgid "Case is linked to a %1s" msgid "Case is linked to a %1s"
msgstr "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 #, php-format
msgid "Sub-case is linked to a %1s" msgid "Sub-case is linked to a %1s"
msgstr "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" msgid "Case cancellation"
msgstr "Case cancellation" msgstr "Case cancellation"
#: inc/case.class.php:507 #: inc/case.class.php:699
msgid "Cancel case" msgid "Cancel case"
msgstr "Cancel case" msgstr "Cancel case"
#: inc/case.class.php:511 #: inc/case.class.php:703
msgid "Confirm cancellation?" msgid "Confirm cancellation?"
msgstr "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" msgid "Cancel"
msgstr "Cancel" msgstr "Cancel"
#: inc/case.class.php:532 #: inc/case.class.php:717
msgid "Case deletion" msgid "Case deletion"
msgstr "Case deletion" msgstr "Case deletion"
#: inc/case.class.php:533 #: inc/case.class.php:777 inc/case.class.php:1321
msgid "Delete case"
msgstr "Delete case"
#: inc/case.class.php:585 inc/case.class.php:1029
msgid "Title" msgid "Title"
msgstr "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" msgid "Sub-case of"
msgstr "Sub-case of" msgstr "Sub-case of"
#: inc/case.class.php:602 #: inc/case.class.php:796
msgid "Add a new case" msgid "Add a new case"
msgstr "Add a new case" msgstr "Add a new case"
#: inc/case.class.php:995 #: inc/case.class.php:1227
msgctxt "case_status" msgctxt "case_status"
msgid "Draft" msgid "Draft"
msgstr "Draft" msgstr "Draft"
#: inc/case.class.php:996 #: inc/case.class.php:1228
msgctxt "case_status" msgctxt "case_status"
msgid "To do" msgid "To do"
msgstr "To do" msgstr "To do"
#: inc/case.class.php:997 #: inc/case.class.php:1229
msgctxt "case_status" msgctxt "case_status"
msgid "Completed" msgid "Completed"
msgstr "Completed" msgstr "Completed"
#: inc/case.class.php:998 #: inc/case.class.php:1230
msgctxt "case_status" msgctxt "case_status"
msgid "Cancelled" msgid "Cancelled"
msgstr "Cancelled" msgstr "Cancelled"
#: inc/case.class.php:1022 #: inc/case.class.php:1314
msgid "ID" msgid "ID"
msgstr "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" msgid "Item"
msgstr "Item" msgstr "Item"
#: inc/case.class.php:1056 #: inc/case.class.php:1349
msgid "Item entity" msgid "Item entity"
msgstr "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" msgid "Change log"
msgstr "Change log" msgstr "Change log"
#: inc/casedynaform.class.php:80 #: inc/casedynaform.class.php:83
msgid "Dynaforms" msgid "Dynaforms"
msgstr "Dynaforms" msgstr "Dynaforms"
#: inc/casehistory.class.php:35 #: inc/casehistory.class.php:36
msgid "History" msgid "History"
msgstr "History" msgstr "History"
@@ -266,43 +351,51 @@ msgstr "Case-links"
msgid "Case-link" msgid "Case-link"
msgstr "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" msgid "External data"
msgstr "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" msgid "Self"
msgstr "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" msgid "Source task GUID"
msgstr "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" msgid "Target task GUID"
msgstr "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" msgid "Target process GUID"
msgstr "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" msgid "Target dynaform GUID"
msgstr "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" msgid "Source condition"
msgstr "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" msgid "Claim target task"
msgstr "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" msgid "External application JSON config"
msgstr "External application JSON config" msgstr "External application JSON config"
#: inc/casemap.class.php:43 #: inc/casemap.class.php:44
msgid "Map" msgid "Map"
msgstr "Map" msgstr "Map"
@@ -311,187 +404,303 @@ msgid "ProcessMaker setup"
msgstr "ProcessMaker setup" msgstr "ProcessMaker setup"
#: inc/config.class.php:159 #: inc/config.class.php:159
msgid "Server URL (must be in same domain than GLPI)" #| 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, 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" msgid "Common domain with GLPI"
msgstr "Common domain with GLPI" msgstr "Common domain with GLPI"
#: inc/config.class.php:193 #: inc/config.class.php:192
msgid "None!" msgid "None!"
msgstr "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" msgid "Workspace Name"
msgstr "Workspace Name" msgstr "Workspace Name"
#: inc/config.class.php:207 #: inc/config.class.php:211
msgid "Server administrator name" msgid "Server administrator name"
msgstr "Server administrator name" msgstr "Server administrator name"
#: inc/config.class.php:212 #: inc/config.class.php:216
msgid "Server administrator password" msgid "Server administrator password"
msgstr "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" msgid "Connection status"
msgstr "Connection status" msgstr "Connection status"
#: inc/config.class.php:234 #: inc/config.class.php:238
msgid "SQL server setup" msgid "SQL server setup"
msgstr "SQL server setup" msgstr "SQL server setup"
#: inc/config.class.php:237 #: inc/config.class.php:241
msgid "SQL server (MariaDB or MySQL)" msgid "SQL server (MariaDB or MySQL)"
msgstr "SQL server (MariaDB or MySQL)" msgstr "SQL server (MariaDB or MySQL)"
#: inc/config.class.php:242 #: inc/config.class.php:246
msgid "Database name" msgid "Database name"
msgstr "Database name" msgstr "Database name"
#: inc/config.class.php:247 #: inc/config.class.php:251
msgid "SQL user" msgid "SQL user"
msgstr "SQL user" msgstr "SQL user"
#: inc/config.class.php:252 #: inc/config.class.php:256
msgid "SQL password" msgid "SQL password"
msgstr "SQL password" msgstr "SQL password"
#: inc/config.class.php:269 #: inc/config.class.php:273
msgid "Theme Name" msgid "Theme Name"
msgstr "Theme Name" msgstr "Theme Name"
#: inc/config.class.php:275 #: inc/config.class.php:279
msgid "Main Task Category (edit to change name)" msgid "Main Task Category (edit to change name)"
msgstr "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)" msgid "Task Writer (edit to change name)"
msgstr "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" msgid "Group in ProcessMaker which will contain all GLPI users"
msgstr "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" msgid "Processmaker system information"
msgstr "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" msgid "Version"
msgstr "Version" msgstr "Version"
#: inc/config.class.php:335 #: inc/config.class.php:344
msgid "Web server" msgid "Web server"
msgstr "Web server" msgstr "Web server"
#: inc/config.class.php:336 #: inc/config.class.php:345
msgid "Server name" msgid "Server name"
msgstr "Server name" msgstr "Server name"
#: inc/config.class.php:337 #: inc/config.class.php:346
msgid "PHP version" msgid "PHP version"
msgstr "PHP version" msgstr "PHP version"
#: inc/config.class.php:338 #: inc/config.class.php:347
msgid "DB version" msgid "DB version"
msgstr "DB version" msgstr "DB version"
#: inc/config.class.php:339 #: inc/config.class.php:348
msgid "DB server IP" msgid "DB server IP"
msgstr "DB server IP" msgstr "DB server IP"
#: inc/config.class.php:340 #: inc/config.class.php:349
msgid "DB name" msgid "DB name"
msgstr "DB name" msgstr "DB name"
#: inc/config.class.php:341 #: inc/config.class.php:350
msgid "User browser" msgid "User browser"
msgstr "User browser" msgstr "User browser"
#: inc/config.class.php:342 #: inc/config.class.php:351
msgid "User IP" msgid "User IP"
msgstr "User IP" msgstr "User IP"
#: inc/config.class.php:344 #: inc/config.class.php:353
msgid "Not yet!" msgid "Not yet!"
msgstr "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" msgid "Synchronize Process List"
msgstr "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" msgid "Process GUID"
msgstr "Process GUID" msgstr "Process GUID"
#: inc/process.class.php:433 #: inc/process.class.php:449
msgid "Process type" msgid "Process type"
msgstr "Process type" msgstr "Process type"
#: inc/process.class.php:439 #: inc/process.class.php:455
msgid "Hide case num. & title" msgid "Hide case num. & title"
msgstr "Hide case num. & title" msgstr "Hide case num. & title"
#: inc/process.class.php:445 #: inc/process.class.php:461
msgid "Insert Task Category" msgid "Insert Task Category"
msgstr "Insert Task Category" msgstr "Insert Task Category"
#: inc/process.class.php:457 #: inc/process.class.php:473
msgid "Ticket type (self-service)" msgid "Ticket type (self-service)"
msgstr "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" msgid "Visible in Incident for Central interface"
msgstr "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" msgid "Visible in Request for Central interface"
msgstr "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" msgid "Visible in Change"
msgstr "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" msgid "Visible in Problem"
msgstr "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" msgctxt "process_type"
msgid "Classic" msgid "Classic"
msgstr "Classic" msgstr "Classic"
#: inc/process.class.php:520 #: inc/process.class.php:548
msgctxt "process_type" msgctxt "process_type"
msgid "BPMN" msgid "BPMN"
msgstr "BPMN" msgstr "BPMN"
#: inc/process.class.php:546 #: inc/process.class.php:574
msgid "Processes" msgid "Processes"
msgstr "Processes" msgstr "Processes"
#: inc/process.class.php:599 #: inc/process.class.php:627
msgid "Hide case number and title in task descriptions" msgid "Hide case number and title in task descriptions"
msgstr "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" msgid "Insert Task Category comments in Task Description"
msgstr "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)" msgid "ITIL Category for Self-service interface (left empty to disable)"
msgstr "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" msgid "Type for Self-service interface"
msgstr "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)" msgid "Process type (to be changed only if not up-to-date)"
msgstr "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 #: inc/process_profile.class.php:26 inc/process_profile.class.php:45
msgid "Authorizations" msgid "Authorizations"
msgstr "Authorizations" msgstr "Authorizations"
@@ -510,35 +719,44 @@ msgctxt "errors"
msgid "Can't create case: no rights for it!" msgid "Can't create case: no rights for it!"
msgstr "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." msgid "Syncs GLPI users and groups into ProcessMaker."
msgstr "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." msgid "Cleaning of orphan cases."
msgstr "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" msgid "Number of days to keep orphan cases"
msgstr "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." msgid "To apply task actions between cases."
msgstr "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: " msgid "Case title: "
msgstr "Case title: " msgstr "Case title: "
#: inc/processmaker.class.php:2178 #: inc/processmaker.class.php:2275
msgid "A 'Case' is running!" msgid "A 'Case' is running!"
msgstr "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)!" msgid "You must manage it first (see 'Process - Case' tab)!"
msgstr "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 "" msgid ""
"ProcessMaker plugin is under maintenance, please retry later, thank you." "ProcessMaker plugin is under maintenance, please retry later, thank you."
msgstr "" msgstr ""
@@ -552,36 +770,62 @@ msgstr "Process configuration"
msgid "Cases" msgid "Cases"
msgstr "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 #: inc/task.class.php:29
msgid "Process case task" msgid "Process case task"
msgid_plural "Process case tasks" msgid_plural "Process case tasks"
msgstr[0] "Process case task" msgstr[0] "Process case task"
msgstr[1] "Process case tasks" msgstr[1] "Process case tasks"
#: inc/task.class.php:258 #: inc/task.class.php:278
msgid "Sub-case task(s)" msgid "Sub-case task(s)"
msgstr "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" msgid "Task List"
msgstr "Task List" msgstr "Task List"
#: inc/taskcategory.class.php:32 #: inc/taskcategory.class.php:40 inc/taskcategory.class.php:118
msgid "Task name" msgid "Task name"
msgstr "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" msgid "Start"
msgstr "Start" msgstr "Start"
#: inc/taskcategory.class.php:35 #: inc/taskcategory.class.php:43 inc/taskcategory.class.php:122
msgid "Task GUID" msgid "Task GUID"
msgstr "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" msgid "Sub-process"
msgstr "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" #~ msgid "Case item"
#~ msgstr "Case item" #~ msgstr "Case item"

View File

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

View File

@@ -1,6 +1,6 @@
<?php <?php
define('PROCESSMAKER_VERSION', '3.6.5'); define('PROCESSMAKER_VERSION', '3.6.16');
// used for case cancellation // used for case cancellation
define("CANCEL", 256); define("CANCEL", 256);
@@ -67,7 +67,8 @@ function plugin_init_processmaker() {
} }
$PLUGIN_HOOKS['pre_item_update']['processmaker'] = $hooks; $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) { foreach ($objects as $obj) {
$hooks[$obj.'Task'] = 'plugin_item_update_processmaker_tasks'; $hooks[$obj.'Task'] = 'plugin_item_update_processmaker_tasks';
} }
@@ -91,6 +92,7 @@ function plugin_init_processmaker() {
} }
$PLUGIN_HOOKS['item_get_pdfdatas']['processmaker'] = $hooks; $PLUGIN_HOOKS['item_get_pdfdatas']['processmaker'] = $hooks;
// Javascript
$plugin = new Plugin(); $plugin = new Plugin();
if ($plugin->isActivated('processmaker') if ($plugin->isActivated('processmaker')
&& Session::getLoginUserID() ) { && Session::getLoginUserID() ) {