Files
tomolino-processmaker/inc/case.class.php

1519 lines
67 KiB
PHP
Raw Normal View History

<?php
/**
* PluginProcessmakerCase short summary.
*
* PluginProcessmakerCase description.
*
* @version 1.0
* @author MoronO
*/
class PluginProcessmakerCase extends CommonDBTM {
//static public $itemtype = 'itemtype'; // Class name or field name (start with itemtype) for link to Parent
//static public $items_id = 'items_id'; // Field name
static $rightname = 'plugin_processmaker_case';
const DRAFT = 'DRAFT';
const TO_DO = 'TO_DO';
const COMPLETED = 'COMPLETED';
const CANCELLED = 'CANCELLED';
static function getTypeName($nb=0) {
return _n('Process case', 'Process cases', $nb);
}
//static function canCreate() {
// return Session::haveRight('plugin_processmaker_config', UPDATE);
//}
//static function canView() {
// return Session::haveRightsOr('plugin_processmaker_case', [READ, UPDATE]);
//}
//static function canUpdate( ) {
// return Session::haveRight('plugin_processmaker_config', UPDATE);
//}
//function canUpdateItem() {
// return Session::haveRight('plugin_processmaker_config', UPDATE);
//}
function maybeDeleted() {
return false;
}
static function canDelete() {
return parent::canDelete();
}
function canDeleteItem() {
return parent::canDeleteItem();
}
static function canPurge() {
return self::canDelete();
}
function canPurgeItem() {
return $this->canDeleteItem();
}
static function canCancel() {
return plugin_processmaker_haveRight('case', CANCEL);
}
/**
* Summary of getTabNameForItem
* @param CommonGLPI $item is the item
* @param mixed $withtemplate has template
* @return array os strings
*/
function getTabNameForItem(CommonGLPI $item, $withtemplate=0) {
global $LANG;
if ($item->getType() == __CLASS__) {
// get tab name for a case itself
return [ __CLASS__ => __('Case')."<sup class='tab_nb'> ".$LANG['processmaker']['case']['statuses'][$item->fields['case_status']]."</sup>"];
} else {
$items_id = $item->getID();
$itemtype = $item->getType();
// count how many cases are on this item
$cnt = count(self::getIDsFromItem($itemtype, $items_id));
if ($cnt == 0) {
return ['processmakercases' => __('Process case', 'processmaker')];
}
return ['processmakercases' => _n('Process case', 'Process cases', $cnt, 'processmaker')."<sup class='tab_nb'>$cnt</sup>"];
}
}
/**
* Summary of getName
* @param mixed $options
* @return mixed
*/
function getName($options = array()){
return $this->fields['name'];
}
/**
* Summary of getIDFromItem
* @param string $itemtype is the item type
* @param integer $items_id is the item id
* @return integer cases_id
*/
static function getIDFromItem($itemtype, $items_id) {
$tmp = New self;
if ($tmp->getFromDBByQuery(" WHERE items_id=$items_id and itemtype='$itemtype'")) {
return $tmp->getID();
}
return false;
}
/**
* Summary of getIDsFromItem
* returns an array of the case ids linked to the item
* @param string $itemtype is the item type of the item (Ticket, Problem, Change)
* @param mixed $items_id is the GLPI id of the item in the type
* @return array
*/
static function getIDsFromItem($itemtype, $items_id) {
$ret = [];
foreach(getAllDatasFromTable( self::getTable(), "items_id=$items_id AND itemtype='$itemtype'") as $case) {
$ret[] = $case['id'];
}
return $ret;
}
/**
* Summary of getFromItem
* @param mixed $itemtype is the item type
* @param mixed $items_id is the item id
* @return mixed: returns false when there is no case associated with the item, else fills in the item fields from DB, and returns true
*/
function getFromItem($itemtype, $items_id) {
return $this->getFromDBByQuery(" WHERE items_id=$items_id and itemtype='$itemtype'");
}
/**
* Summary of getFromGUID
* @param mixed $case_guid
* @return boolean
*/
function getFromGUID($case_guid) {
return $this->getFromDBByQuery(" WHERE case_guid='$case_guid'");
}
/**
* Summary of getVariables
* @param mixed $vars
* @return mixed
*/
function getVariables($vars=array()) {
global $PM_SOAP;
return $PM_SOAP->getVariables($this->fields['case_guid'], $vars);
}
/**
* Summary of sendVariables
* @param mixed $vars
* @return A
*/
function sendVariables($vars = array()) {
global $PM_SOAP;
return $PM_SOAP->sendVariables($this->fields['case_guid'], $vars);
}
/**
* Summary of getCaseInfo
* @param mixed $delIndex
* @return stdClass, a getCaseInfoResponse object, or false exception occured
*/
function getCaseInfo($delIndex='') {
global $PM_SOAP;
return $PM_SOAP->getCaseInfo($this->fields['case_guid'], $delIndex);
}
/**
* Summary of unpauseCase
* @param mixed $delIndex
* @param mixed $userGuid
* @return an
*/
function unpauseCase($delIndex, $userGuid) {
global $PM_SOAP;
return $PM_SOAP->unpauseCase($this->fields['case_guid'], $delIndex, $userGuid);
}
/**
* Summary of reassignCase
* @param mixed $delIndex
* @param mixed $taskGuid
* @param mixed $delThread
* @param mixed $users_id_source
* @param mixed $users_id_target
* @return mixed
*/
function reassignCase($delIndex, $taskGuid, $delThread, $users_id_source, $users_id_target) {
global $PM_SOAP;
$users_guid_source = PluginProcessmakerUser::getPMUserId($users_id_source);
$users_guid_target = PluginProcessmakerUser::getPMUserId($users_id_target);
$pmResponse = $PM_SOAP->reassignCase($this->fields['case_guid'], $delIndex, $users_guid_source, $users_guid_target);
// now should managed GLPI Tasks previously assigned to the $users_guid_source
if ($pmResponse->status_code == 0) {
// we need to change the delindex of the glpi task and the assigned tech to prevent creation of new tasks
// we need the delindex of the current glpi task, and the delindex of the new one
// search for new delIndex and new delThread
$newCaseInfo = $this->getCaseInfo( );
$newDelIndex = 0;
$newDelThread = 0;
foreach ($newCaseInfo->currentUsers as $newCaseUser) {
if ($newCaseUser->taskId == $taskGuid && $newCaseUser->delThread == $delThread) {
$newDelIndex = $newCaseUser->delIndex;
$newDelThread = $newCaseUser->delThread;
break;
}
}
$this->reassignTask($delIndex, $newDelIndex, $delThread, $newDelThread, $users_id_target );
return true;
}
return false;
}
/**
* Summary of reassignTask
* @param mixed $delIndex
* @param mixed $newDelIndex
* @param mixed $newTech
*/
public function reassignTask ($delIndex, $newDelIndex, $delThread, $newDelThread, $newTech) {
global $DB;
$query = "SELECT * FROM glpi_plugin_processmaker_tasks WHERE plugin_processmaker_cases_id={$this->getID()} AND del_index=$delIndex AND del_thread=$delThread; ";
$res = $DB->query($query);
if ($DB->numrows($res) > 0) {
$row = $DB->fetch_array( $res );
$glpi_task = new $row['itemtype'];
$glpi_task->getFromDB( $row['items_id'] );
$itilobject_itemtype = $this->fields['itemtype']; //str_replace( 'Task', '', $row['itemtype'] );
$foreignkey = getForeignKeyFieldForItemType( $itilobject_itemtype );
PluginProcessmakerProcessmaker::addWatcher( $itilobject_itemtype, $glpi_task->fields[ $foreignkey ], $newTech );
$glpi_task->update( array( 'id' => $row['items_id'], $foreignkey => $glpi_task->fields[ $foreignkey ], 'users_id_tech' => $newTech ));
// 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);
}
}
/**
* Summary of showCaseProperties
*/
function showCaseProperties() {
global $PM_DB;
$caseInfo = $this->getCaseInfo();
if (property_exists($caseInfo, 'currentUsers')) {
$caseInfo->currentUsers = $this->sortTasks($caseInfo->currentUsers, PluginProcessmakerUser::getPMUserId(Session::getLoginUserID()));
}
$query = "SELECT `DEL_INDEX`, `DEL_DELEGATE_DATE` FROM `APP_DELEGATION` WHERE `APP_UID`='{$caseInfo->caseId}'";
$tasks = [];
foreach($PM_DB->request($query) as $row){
$tasks[$row['DEL_INDEX']] = $row['DEL_DELEGATE_DATE'];
}
echo "<p></p>";
echo "<div class='center'>";
echo "<table style='margin-bottom: 0px' class='tab_cadre_fixe'>";
echo "<tr><th colspan=4>".__('Case properties', 'processmaker')."</th></tr>";
echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".__('Process', 'processmaker')."</td>";
echo "<td class='tab_bg_2' colspan=3>".$caseInfo->processName."</td></tr>";
echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".__('Case title', 'processmaker')."</td>";
echo "<td class='tab_bg_2' colspan=3>".$caseInfo->caseName."</td></tr>";
echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".__('Case number', 'processmaker')."</td>";
echo "<td class='tab_bg_2' colspan=3>".$caseInfo->caseNumber."</td></tr>";
echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".__('Case status', 'processmaker')."</td>";
echo "<td class='tab_bg_2' colspan=3>".self::getStatus($caseInfo->caseStatus)."</td></tr>";
echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".__('Case guid', 'processmaker')."</td>";
echo "<td class='tab_bg_2' colspan=3>".$caseInfo->caseId."</td></tr>";
echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".__('Creator', 'processmaker')."</td>";
echo "<td class='tab_bg_2' colspan=3>".$caseInfo->caseCreatorUserName."</td></tr>";
echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".__('Creation date', 'processmaker')."</td>";
echo "<td class='tab_bg_2' colspan=3>".$caseInfo->createDate."</td></tr>";
echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".__('Last update', 'processmaker')."</td>";
echo "<td class='tab_bg_2' colspan=3>".$caseInfo->updateDate."</td></tr>";
//echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".__('Case description', 'processmaker')."</td>";
//echo "<td class='tab_bg_2' colspan=3>".$caseInfo->????."</td></tr>";
echo "</table>";
echo "</div>";
echo "<p></p>";
echo "<div class='center'>";
echo "<table style='margin-bottom: 0px' class='tab_cadre_fixe'>";
echo "<tr><th colspan=4>".__('Current task(s) properties', 'processmaker')."</th></tr>";
if (count($caseInfo->currentUsers) > 0) {
echo "<tr style='font-weight: bold;'>
<td>".__('Task', 'processmaker')."</td>
<td>".__('Task guid', 'processmaker')."</td>
<td>".__('Current user', 'processmaker')."</td>
<td>".__('Task delegation date', 'processmaker')."</td>
</tr>";
foreach($caseInfo->currentUsers as $currentTask) {
echo "<tr>";
echo "<td class='tab_bg_2'>".$currentTask->taskName."</td>";
echo "<td class='tab_bg_2'>".$currentTask->taskId."</td>";
if ($currentTask->userName == '') {
echo "<td class='tab_bg_2'>".__('To be claimed', 'processmaker')."</td>";
} else {
echo "<td class='tab_bg_2'>".$currentTask->userName."</td>";
}
echo "<td class='tab_bg_2'>".$tasks[$currentTask->delIndex]."</td>";
echo "</tr>";
}
} else {
echo "<td colspan=4>".__('None')."</td>";
}
echo "</table>";
echo "</div>";
}
/**
* Summary of sortTasks
* @param mixed $tasks is the array of tasks from a getCaseInfo->currentUsers
* @param mixed $GLPICurrentPMUserId
* @return array sorted $tasks
*/
public function sortTasks($tasks, $GLPICurrentPMUserId) {
function localSortTasks ($a, $b) {
return $a->delIndex - $b->delIndex;
};
$tbctasks = [];
$utasks = [];
$infotasks = [];
foreach ($tasks as $caseUser) {
if ($caseUser->userId == $GLPICurrentPMUserId) {
$utasks[] = $caseUser;
} else {
if ($caseUser->userId == '') { // task to be claimed
$tbctasks[] = $caseUser;
} else
$infotasks[] = $caseUser;
}
}
// order task by "current user", then by "to be claimed", and then push to end "tasks assigned to another user"
// then by delindex ASC in these three parts
usort($utasks, 'localSortTasks');
usort($tbctasks, 'localSortTasks');
usort($infotasks, 'localSortTasks');
return array_merge($utasks, $tbctasks, $infotasks);
}
/**
* Summary of showCaseInfoTab
* Will show information about the current case
* @param CommonGLPI $case is a PluginProcessmakerCase object
* @param mixed $tabnum
* @param mixed $withtemplate
*/
static function showCaseInfoTab(CommonGLPI $case, $tabnum=1, $withtemplate=0) {
// echo 'The idea is to show here the GLPI ITIL item to which it is linked, and to give a resume of the current case status, and to give possibility to delete or cancel the case.';
echo "<table style='margin-bottom: 0px' class='tab_cadre_fixe'>";
echo "<tr><th colspan=2>".__('Case item', 'processmaker')."</th></tr>";
$itemtype = $case->fields['itemtype'];
$item = new $itemtype;
$item->getFromDB($case->fields['items_id']);
echo "<tr><td class='tab_bg_2' style='font-weight: bold;'>".$itemtype::getTypeName(1)."</td>";
// echo "<td class='tab_bg_2' >".$item->getID()."</td>";
echo "<td class='tab_bg_2'>".$item->getLink(['forceid' => 1])."</td></tr>";
echo "</table>";
//echo "</div>";
// show case properties
$case->showCaseProperties();
if ($case->fields['plugin_processmaker_cases_id'] == 0 && self::canCancel() && $case->fields['case_status'] == self::TO_DO) {
// it's a main case, not a sub-case
// and we have the rightr to cancel cases
// show a form to be able to cancel the case
$rand = rand();
echo "<p></p>";
echo "<form style='margin-bottom: 0px' name='processmaker_case_cancelform$rand' id='processmaker_case_cancelform$rand' method='post' action='".Toolbox::getItemTypeFormURL("PluginProcessmakerCase")."'>";
echo "<div class='center'>";
echo "<table style='margin-bottom: 0px' class='tab_cadre_fixe'>";
echo "<tr><th colspan='2'>".__('Case cancellation', 'processmaker')."</th></tr>";
echo "<tr><td class='tab_bg_2' style='width: 10%'>".__('Cancel case', 'processmaker')."</td>";
echo "<td class='tab_bg_2' >";
echo "<input type='hidden' name='action' value='cancel'>";
echo "<input type='hidden' name='cases_id' value='".$case->getID()."'>";
echo "<input onclick='return confirm(\"".__('Confirm cancellation?')."\");' type='submit' name='cancel' value='".__('Cancel')."' class='submit' >";
echo "</td></tr></table>";
Html::closeForm();
}
// will not show delete button if case is a sub-process
// and will show it only if it is a draft or if current glpi user has the right to delete cases and session is central
if ($case->fields['plugin_processmaker_cases_id'] == 0
&& ($case->fields['case_status'] == self::DRAFT
|| (plugin_processmaker_haveRight("case", DELETE)
&& $_SESSION['glpiactiveprofile']['interface'] == 'central'))) {
// then propose a button to delete case
$rand = rand();
echo "<p></p>";
echo "<form style='margin-bottom: 0px' name='processmaker_case_deleteform$rand' id='processmaker_case_deleteform$rand' method='post' action='".Toolbox::getItemTypeFormURL("PluginProcessmakerCase")."'>";
echo "<div class='center'>";
echo "<table style='margin-bottom: 0px' class='tab_cadre_fixe'>";
echo "<th colspan='2'>".__('Case deletion', 'processmaker')."</th>";
echo "<tr><td class='tab_bg_2' style='width: 10%'>".__('Delete case', 'processmaker')."</td>";
echo "<td class='tab_bg_2' >";
echo "<input type='hidden' name='action' value='delete'>";
echo "<input type='hidden' name='cases_id' value='".$case->getID()."'>";
echo "<input onclick='return confirm(\"".__('Confirm expunge?')."\");' type='submit' name='delete' value='".__('Delete permanently')."' class='submit' >";
echo "</td></tr></table>";
Html::closeForm();
}
return;
}
/**
* Summary of showForItem
* Shows list of cases attached to an item
* @param CommonITILObject $item
*/
static function showForItem(CommonITILObject $item) {
global $DB, $CFG_GLPI, $LANG;
$items_id = $item->getField('id');
$itemtype = $item->getType();
//if (!Session::haveRight("problem", Problem::READALL)
// || !$item->can($ID, READ)) {
// return false;
//}
$canupdate = $item->can($items_id, UPDATE);
$rand = mt_rand();
$query = "SELECT gppc.`id` AS assocID, gppc.`id` as id, gppp.name as pname, gppc.`case_status`, gppc.`plugin_processmaker_cases_id`
FROM `glpi_plugin_processmaker_cases` as gppc
LEFT JOIN `glpi_plugin_processmaker_processes` AS gppp ON gppp.`id`=gppc.`plugin_processmaker_processes_id`
WHERE gppc.`itemtype` = '$itemtype'
AND gppc.`items_id` = $items_id
";
$result = $DB->query($query);
$cases = array();
$used = array();
if ($numrows = $DB->numrows($result)) {
while ($data = $DB->fetch_assoc($result)) {
$cases[$data['id']] = $data;
$used[$data['id']] = $data['id'];
}
}
$columns = array('pname' => 'Process',
'name' => 'Name',
'status' => 'Status',
'sub' => 'Subcase of'
);
// check if item is not solved nor closed
if ($canupdate
&& $item->fields['status'] != CommonITILObject::SOLVED
&& $item->fields['status'] != CommonITILObject::CLOSED
&& $_SESSION['glpiactiveprofile']['interface'] != 'helpdesk') {
echo "<div class='firstbloc'>";
echo "<form style='margin-bottom: 0px' name='processmaker_form$rand' id='processmaker_form$rand' method='post' action='".Toolbox::getItemTypeFormURL("PluginProcessmakerProcessmaker")."'>";
echo "<input type='hidden' name='action' value='newcase'>";
echo "<input type='hidden' name='items_id' value='$items_id'>";
echo "<input type='hidden' name='itemtype' value='$itemtype'>";
echo "<table class='tab_cadre_fixe'>";
echo "<tr class='tab_bg_2'><th colspan='3'>".__('Add a new case')."</th></tr>";
echo "<tr class='tab_bg_2'><td class='tab_bg_2'>";
echo $LANG['processmaker']['item']['selectprocess']."&nbsp;";
echo "</td><td class='tab_bg_2'>";
PluginProcessmakerProcess::dropdown(array( 'value' => 0, 'entity' => $item->fields['entities_id'], 'name' => 'plugin_processmaker_processes_id', 'condition' => "is_active=1"));
echo "</td><td class='tab_bg_2'>";
echo "<input type='submit' name='additem' value='"._sx('button','Add')."' class='submit'>";
echo "</td></tr></table>";
Html::closeForm();
echo "</div>";
}
echo "<div class='spaced'>";
if ($canupdate && $numrows) {
Html::openMassiveActionsForm('mass'.__CLASS__.$rand);
$massiveactionparams = array('num_displayed' => $numrows,
'container' => 'mass'.__CLASS__.$rand);
Html::showMassiveActions($massiveactionparams);
}
echo "<table class='tab_cadre_fixehov'>";
echo "<tr class='noHover'><th colspan='12'>".PluginProcessmakerCase::getTypeName($numrows)."</th>";
echo "</tr>";
if ($numrows) {
$header_begin = "<tr>";
$header_top = '';
$header_bottom = '';
$header_end = '';
if ($canupdate
&& $numrows) {
$header_top .= "<th width='11'>".Html::getCheckAllAsCheckbox('mass'.__CLASS__.$rand);
$header_top .= "</th>";
$header_bottom .= "<th width='11'>".Html::getCheckAllAsCheckbox('mass'.__CLASS__.$rand);
$header_bottom .= "</th>";
}
foreach ($columns as $key => $val) {
$header_end .= "<th>$val</th>";
}
$header_end .= "</tr>";
echo $header_begin.$header_top.$header_end;
//Session::initNavigateListItems('PluginProcessmakerCase',
// //TRANS : %1$s is the itemtype name,
// // %2$s is the name of the item (used for headings of a list)
// sprintf(__('%1$s = %2$s'),
// $itemtype::getTypeName(1), $item->fields["name"]));
$i = 0;
foreach ($cases as $data) {
Session::addToNavigateListItems('PluginProcessmakerCase', $data["id"]);
$link = NOT_AVAILABLE;
$case = new self;
if ($case->getFromDB($data["id"])) {
$link = $case->getLink();
}
echo "<tr class='tab_bg_1'>";
if ($canupdate) {
echo "<td width='10'>";
// prevent massiveaction on subprocess
if ($data['plugin_processmaker_cases_id'] == 0) {
Html::showMassiveActionCheckBox(__CLASS__, $data["assocID"]);
}
echo "</td>";
}
echo "<td class='center'>".$data['pname']."</td>";
echo "<td class='center'>".$link."</td>";
echo "<td class='center'>".self::getStatus($data['case_status'])."</td>";
echo "<td class='center'>";
if ($data['plugin_processmaker_cases_id'] > 0) {
// then this is a subprocess of
$maincase = new self;
if ($maincase->getFromDB($data['plugin_processmaker_cases_id'])) {
echo $maincase->getLink();
}
} else {
echo '-';
}
echo "</td>";
//echo "<td class='center'>".Html::convDateTime($data["date_creation"])."</td>";
echo "</tr>";
$i++;
}
echo $header_begin.$header_top.$header_end;
}
echo "</table>";
if ($canupdate && $numrows) {
$massiveactionparams['ontop'] = false;
Html::showMassiveActions($massiveactionparams);
Html::closeForm();
}
echo "</div>";
}
/**
* Summary of displayTabContentForItem
* @param CommonGLPI $item
* @param mixed $tabnum
* @param mixed $withtemplate
*/
static function displayTabContentForItem(CommonGLPI $item, $tabnum=1, $withtemplate=0) {
global $LANG, $DB, $CFG_GLPI, $PM_SOAP;
if ($item->getType() == __CLASS__) {
// we are in a case viewing the main tab
// the 'Case infos' tab
self::showCaseInfoTab($item, $tabnum, $withtemplate);
} else {
// the idea is to show a list of cases attached to the $item ITIL object
// TODO give possibility to start a new case if needed
self::showForItem($item);
}
}
/**
* Summary of displayTabContentForItem
* @param CommonGLPI $item is the item
* @param mixed $tabnum is the tab num
* @param mixed $withtemplate has template
* @return mixed
*/
static function displayTabContentForItem_old(CommonGLPI $item, $tabnum=1, $withtemplate=0) {
global $LANG, $DB, $CFG_GLPI, $PM_SOAP;
$config = $PM_SOAP->config; //PluginProcessmakerConfig::getInstance();
if ($config->fields['maintenance'] == 0) {
$items_id = $item->getID();
$itemtype = $item->getType();
$rand = rand();
echo "<form style='margin-bottom: 0px' name='processmaker_form$rand' id='processmaker_form$rand' method='post' action='".Toolbox::getItemTypeFormURL("PluginProcessmakerProcessmaker")."'>";
echo "<div class='center'> <table id='processmakercasemenu' style='margin-bottom: 0px' class='tab_cadre_fixe'>";
echo Html::scriptBlock("$('#processmakercasemenu').css('max-width', 'none');");
echo "<tr><th colspan='4'>".$LANG['processmaker']['item']['tab']."</th></tr>";
$pmCaseUser = false; // initial value: no user
// first search for the case
$locCase = new self;
if ($locCase->getFromItem($itemtype, $items_id)) {
$GLPICurrentPMUserId=0;
$paramsURL='';
$caseInfo = $locCase->getCaseInfo();
if ($caseInfo->caseStatus != 'CANCELLED' && $caseInfo->caseStatus != 'COMPLETED') {
// need to get info on the thread of the GLPI current user
// we must retreive currentGLPI user from this array
$GLPICurrentPMUserId = PluginProcessmakerUser::getPMUserId(Session::getLoginUserID());
$pmCaseUser = $caseInfo->currentUsers[0]; // by default currently manage only one task at a time, must define tab management for several tasks
foreach ($caseInfo->currentUsers as $caseUser) {
if ($caseUser->userId == $GLPICurrentPMUserId) {
$pmCaseUser = $caseUser;
break;
}
}
}
$locDelIndex = 1; // by default
switch ($caseInfo->caseStatus) {
case "CANCELLED" :
echo "<tr><th colspan='4'>".$LANG['processmaker']['item']['cancelledcase']."</th></tr>";
$paramsURL = "DEL_INDEX=1";
// echo "<tr class='tab_bg_1' ><td id='GLPI-PM-DEL_INDEX' ><script>var GLPI_DEL_INDEX = 1; </script></td></tr>" ;
break;
case "DRAFT" :
case "TO_DO" :
$paramsURL = "DEL_INDEX=".$pmCaseUser->delIndex."&action=".$caseInfo->caseStatus;
$locDelIndex = $pmCaseUser->delIndex;
if ($pmCaseUser->userId != '') {
echo "<tr class='tab_bg_1'>";
if ($GLPICurrentPMUserId == $pmCaseUser->userId) {
// then propose a button to cancel case only when assigned user is == to glpi current user
echo "<td class='tab_bg_2' >";
echo $LANG['processmaker']['item']['cancelcase'];
echo "</td><td class='tab_bg_2'>";
echo "<input type='hidden' name='action' value='unpausecase_or_reassign_or_delete'>";
echo "<input type='hidden' name='cases_id' value='".$locCase->getID()."'>";
//echo "<input type='hidden' name='plugin_processmaker_cases_guid' value='".$caseInfo->caseId."'>";
//echo "<input type='hidden' name='plugin_processmaker_del_index' value='".$pmCaseUser->delIndex."'>";
//echo "<input type='hidden' name='plugin_processmaker_users_id' value='".$pmCaseUser->userId."'>";
echo "<input onclick='ret = confirm(\"".$LANG['processmaker']['item']['buttoncancelcaseconfirmation']."\") ; cancelMyMask = !ret ; return ret;' type='submit' name='cancel' value='".$LANG['processmaker']['item']['buttoncancelcase']."' class='submit'>";
echo "</td>";
}
if ($caseInfo->caseStatus == "DRAFT" || (plugin_processmaker_haveRight("case", DELETE) && $_SESSION['glpiactiveprofile']['interface'] == 'central')) {
// then propose a button to delete case
echo "<td class='tab_bg_2'>";
echo $LANG['processmaker']['item']['deletecase'];
echo "</td><td class='tab_bg_2'>";
echo "<input type='hidden' name='action' value='unpausecase_or_reassign_or_delete'>";
//echo "<input type='hidden' name='plugin_processmaker_cases_guid' value='".$caseInfo->caseId."'>";
echo "<input type='hidden' name='cases_id' value='".$locCase->getID()."'>";
echo "<input onclick='ret = confirm(\"".$LANG['processmaker']['item']['buttondeletecaseconfirmation']."\"); cancelMyMask = !ret ; return ret;' type='submit' name='delete' value='".$LANG['processmaker']['item']['buttondeletecase']."' class='submit' >";
echo "</td>";
}
echo "</form>";
echo "</td></tr>";
}
break;
case "COMPLETED" :
echo "<tr><th colspan='4'>".$LANG['processmaker']['item']['completedcase']."</th></tr>";
$paramsURL = "DEL_INDEX="; // DEL_INDEX is not set to tell PM to show the current task i.e.: the last one
break;
}
$proj = new PluginProcessmakerProcess;
$proj->getFromGUID( $caseInfo->processId );
$project_type = $proj->fields['project_type'];
echo "</table>";
echo "<script type='text/javascript' src='".$CFG_GLPI["root_doc"]."/plugins/processmaker/js/cases.js'></script>"; //?rand=$rand'
// processmakertabpaneltable is used to align the tabs
echo "<table id=processmakertabpaneltable style='margin-bottom: 0px; width:100%;' class='tab_cadre_fixe'>";
echo Html::scriptBlock("$('#processmakertabpaneltable').css('max-width', 'none');");
echo "<tr><td>";
//////////////////////////
// Processmaker tab panels
// need to have a global variable which contains tab id
// used only one time for activated panel
//////////////////////////
$arrayProcessmakerTabPanel = array();
echo "<div id=processmakertabpanel >";
//////////////
// Define tabs
//////////////
echo " <ul>";
//echo " <li><a href='#tabs-1'>Nunc tincidunt</a></li>";
//$arrayProcessmakerTabPanel[] = "tabs-1";
$arrayProcessmakerTabPanel = [];
if ($pmCaseUser) {
foreach ($caseInfo->currentUsers as $caseUser) {
$title = $LANG['processmaker']['item']['task']['task'].$caseUser->taskName;
echo "<li><a href='#task-".$caseUser->delIndex."' title='$title'>". ($caseUser->userId != $GLPICurrentPMUserId ? "<i><sub>$title</sub></i>" : $title) ."</a></li>";
$arrayProcessmakerTabPanel[] = "task-".$caseUser->delIndex;
}
} else {
// no user means CANCELLED or COMPLETED
// then create artificial panel to host case infos
echo "<li><a href='#caseInfo' title='".$LANG['processmaker']['item']['case']['caseinfo']."'>".$LANG['processmaker']['item']['case']['caseinfo']."</a></li>";
$arrayProcessmakerTabPanel[] = "caseInfo";
}
// add default panels: map, history, log and dynaforms
$defaultTabs = ['caseMap' => 'viewcasemap', 'caseHistory' => 'viewcasehistory', 'caseChangeLogHistory' => 'viewcasechangeloghistory', 'historyDynaformPage' => 'viewdynaforms' ];
foreach ($defaultTabs as $tab => $tabText) {
echo "<li><a href='#$tab' onclick=\"javascript:Actions.tabFrame('$tab');return false;\" title='".$LANG['processmaker']['item']['case'][$tabText]."'>".$LANG['processmaker']['item']['case'][$tabText]."</a></li>";
}
echo "</ul>";
////////////////
// Define panels
////////////////
if ($pmCaseUser) {
$csrf = Session::getNewCSRFToken();
foreach ($caseInfo->currentUsers as $caseUser) {
// for each task, if task is to be claimed, we need to verify that current user can claim it by checking if he/she is in the group assigned to the task
$hide_claim_button=false; // by default
if (!$caseUser->userId) {
// current task is to claimed
// get task user list
$query = "SELECT items_id, itemtype FROM glpi_plugin_processmaker_tasks WHERE plugin_processmaker_cases_id = '".$locCase->getID()."' AND del_index =".$caseUser->delIndex;
foreach ($DB->request($query) as $row) {
// normally there is only one task
$task = getItemForItemtype( $row['itemtype'] );
$task->getFromDB( $row['items_id'] );
// check if this group can be found in the current user's groups
if (!isset($_SESSION['glpigroups']) || !in_array( $task->fields['groups_id_tech'], $_SESSION['glpigroups'] )) {
$hide_claim_button=true;
}
}
}
echo "<div id='task-".$caseUser->delIndex."'>";
// to load users for task re-assign only when task is not to be 'claimed'
if ($caseUser->userId) {
echo "<div class='tab_bg_2' id='divUsers-".$caseUser->delIndex."' >Loading...</div>";
echo "<script>$('#divUsers-".$caseUser->delIndex."').load( '".$CFG_GLPI["root_doc"]."/plugins/processmaker/ajax/task_users.php?cases_id=".$locCase->getID()."&items_id=".$items_id."&itemtype=".$itemtype."&users_id=".PluginProcessmakerUser::getGLPIUserId($caseUser->userId)."&taskGuid=".$caseUser->taskId."&delIndex=".$caseUser->delIndex."&delThread=".$caseUser->delThread."&rand=$rand' ); </script>";
}
echo "<iframe id='caseiframe-task-".$caseUser->delIndex."' onload='onTaskFrameLoad( event, ".$caseUser->delIndex.", ".($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=".$caseInfo->caseId."&DEL_INDEX=".$caseUser->delIndex."&action=TO_DO";
echo "&rand=$rand&glpi_domain={$config->fields['domain']}'></iframe></div>";
}
} else {
// no user means CANCELLED or COMPLETED
// then create artificial panel to host case infos
echo "<div id='caseInfo'>";
$url = $PM_SOAP->serverURL."/cases/cases_Open?sid=".$PM_SOAP->getPMSessionID()."&APP_UID=".$caseInfo->caseId."&".$paramsURL."&action=TO_DO";
echo "<iframe id=\"caseiframe-caseInfo\" onload=\"onOtherFrameLoad( 'caseInfo', 'caseiframe-caseInfo', 'body' );\" style=\"border:none;\" class=\"tab_bg_2\" width=\"100%\" src=\"$url&rand=$rand&glpi_domain={$config->fields['domain']}\"></iframe></div>";
}
// default panels
// map, history, log and dynaforms
// will be added dynamically by the addTabPanel function
echo "</div>";
// end of tabs/panels
echo "</td></tr>";
echo "<tr class='tab_bg_1' ><td colspan=4 >";
if ($pmCaseUser) {
$activePanel = 'task-'.$pmCaseUser->delIndex;
} else {
$activePanel = 'caseInfo';
}
$caseMapUrl = $PM_SOAP->serverURL.($project_type=='bpmn' ? "/designer?prj_uid=".$caseInfo->processId."&prj_readonly=true&app_uid=".$caseInfo->caseId : "/cases/ajaxListener?action=processMap&rand=$rand")."&glpi_domain={$config->fields['domain']}";
echo "<script>
function addTabPanel( name, title, html ){
//debugger ;
if( !$('#processmakertabpanel')[0].children[name] ) { // panel is not yet existing, create one
//var num_tabs = $('#processmakertabpanel ul li').length ;
if( $('#processmakertabpanel a[href=\"#'+name+'\"]').length == 0 ) {
$('#processmakertabpanel ul').append( '<li><a href=\'#' + name + '\'>' + title + '</a></li>' );
}
//debugger ;
$('#processmakertabpanel').append( '<div id=\'' + name + '\'>' + html + '</div>');
$('#processmakertabpanel').tabs('refresh'); // to show the panel
}
var tabIndex = $('#processmakertabpanel a[href=\"#'+name+'\"]').parent().index();
$('#processmakertabpanel').tabs( 'option', 'active', tabIndex) ; // to activate it
//$('#processmakertabpanel').tabs( 'option', 'collapsible', true );
}
var historyGridListChangeLogGlobal = { viewIdHistory: '', viewIdDin: '', viewDynaformName: '', idHistory: '' } ;
var ActionTabFrameGlobal = { tabData: '', tabName: '', tabTitle: '' } ;
var Actions = { tabFrame: function( actionToDo ) {
// debugger ;
if( actionToDo == 'caseMap' ) {
addTabPanel( actionToDo,
'".$LANG['processmaker']['item']['case']['casemap']."',
'<iframe id=\'caseiframe-' + actionToDo + '\' style=\'border: none;\' onload=\'onOtherFrameLoad( \"'+actionToDo+'\", \"caseiframe-' + actionToDo + '\", \"body\", ".($project_type=='bpmn' ? "true" : "false" )." );\' width=\'100%\' src=\'$caseMapUrl\' ></iframe>'
);
} else
if( actionToDo == 'caseHistory' ) {
addTabPanel( actionToDo,
'".$LANG['processmaker']['item']['case']['casehistory']."',
'<iframe id=\'caseiframe-' + actionToDo + '\' style=\'border: none;\' onload=\'onOtherFrameLoad( \"'+actionToDo+'\", \"caseiframe-' + actionToDo + '\", \"body\", 0 );\' height=\'600px\' width=\'100%\' src=\'".$PM_SOAP->serverURL."/cases/ajaxListener?action=caseHistory&rand=$rand&glpi_domain={$config->fields['domain']}\' ></iframe>'
);
} else
if( actionToDo == 'caseChangeLogHistory' ) {
addTabPanel( actionToDo,
'".$LANG['processmaker']['item']['case']['casechangeloghistory']."',
'<iframe id=\'caseiframe-' + actionToDo + '\' style=\'border: none;\' onload=\'onOtherFrameLoad( \"'+actionToDo+'\", \"caseiframe-' + actionToDo + '\", \"body\", 0 );\' height=\'600px\' width=\'100%\' src=\'".$PM_SOAP->serverURL."/cases/ajaxListener?action=changeLogHistory&rand=$rand&glpi_domain={$config->fields['domain']}\' ></iframe>'
);
} else
if( actionToDo == 'dynaformViewFromHistory' ) {
actionToDo = 'dynaformChangeLogViewHistory_' + historyGridListChangeLogGlobal.viewIdDin + historyGridListChangeLogGlobal.dynDate.replace(/ /g, '_').replace(/:/g, '-') ;
ajaxResponse = $.parseJSON(historyGridListChangeLogGlobal.viewDynaformName);
addTabPanel( actionToDo,
ajaxResponse.dynTitle + ' <sup>(' + historyGridListChangeLogGlobal.dynDate + ')</sup>',
'<iframe id=\'caseiframe-' + actionToDo + '\' style=\'border: none;\' onload=\'onOtherFrameLoad( \"'+actionToDo+'\", \"caseiframe-' + actionToDo + '\", \"body\", 0 );\' width=\'100%\' src=\'".$PM_SOAP->serverURL."/cases/ajaxListener?action=dynaformViewFromHistory&DYN_UID=' + historyGridListChangeLogGlobal.viewIdDin + \"&HISTORY_ID=\" + historyGridListChangeLogGlobal.viewIdHistory + '&rand=$rand&glpi_domain={$config->fields['domain']}\' ></iframe>'
);
} else
if( actionToDo == 'historyDynaformPage' ) {
addTabPanel( actionToDo,
'".$LANG['processmaker']['item']['case']['dynaforms']."',
'<iframe id=\'caseiframe-' + actionToDo + '\' style=\'border: none;\' onload=\'onOtherFrameLoad( \"'+actionToDo+'\", \"caseiframe-' + actionToDo + '\", \"body\", 0 );\' width=\'100%\' src=\'".$PM_SOAP->serverURL."/cases/casesHistoryDynaformPage_Ajax?actionAjax=historyDynaformPage&rand=$rand&glpi_domain={$config->fields['domain']}\' ></iframe>'
);
} else
if( actionToDo.search( '^changeLog' ) == 0 ) {
actionToDo = 'changeLog' ;
addTabPanel( actionToDo,
'".$LANG['processmaker']['item']['case']['changelog']."',
'<iframe id=\'caseiframe-' + actionToDo + '\' style=\'border: none;\' onload=\'onOtherFrameLoad( \"'+actionToDo+'\", \"caseiframe-' + actionToDo + '\", \"body\", 0 );\' height=\'600px\' width=\'100%\' src=\'".$PM_SOAP->serverURL."/cases/ajaxListener?action=changeLogTab&idHistory=' + historyGridListChangeLogGlobal.idHistory + '&rand=$rand&glpi_domain={$config->fields['domain']}\' ></iframe>'
);
} else
if( actionToDo.search( '^historyDynaformGridPreview' ) == 0 ) {
actionToDo = actionToDo.replace('_', '$') ;
var act = actionToDo.replace( '$', '&DYN_UID=') ;
addTabPanel( actionToDo,
ActionTabFrameGlobal.tabTitle,
'<iframe id=\'caseiframe-' + actionToDo + '\' style=\'border: none;\' onload=\'onOtherFrameLoad( \"'+actionToDo+'\", \"caseiframe-' + actionToDo + '\", \"form\", 0 );\' width=\'100%\' src=\'".$PM_SOAP->serverURL."/cases/casesHistoryDynaformPage_Ajax?actionAjax=' + act + '&rand=$rand&glpi_domain={$config->fields['domain']}\' ></iframe>'
);
} else
if( actionToDo.search( '^historyDynaformGridHistory' ) == 0) {
var ajaxResponse = $.parseJSON(ActionTabFrameGlobal.tabData);
var act = 'showDynaformListHistory&PRO_UID=' + ajaxResponse.PRO_UID + '&APP_UID=' + ajaxResponse.APP_UID + '&TAS_UID=-1&DYN_UID=' + ajaxResponse.DYN_UID;
addTabPanel( actionToDo,
ActionTabFrameGlobal.tabTitle,
'<iframe id=\'caseiframe-' + actionToDo + '\' style=\'border: none;\' onload=\'onOtherFrameLoad( \"'+actionToDo+'\", \"caseiframe-' + actionToDo + '\", \"body\", 0 );\' height=\'600px\' width=\'100%\' src=\'".$PM_SOAP->serverURL."/cases/casesHistoryDynaformPage_Ajax?actionAjax=' + act + '&rand=$rand&glpi_domain={$config->fields['domain']}\' ></iframe>'
);
} else
if( actionToDo.search( '^dynaformChangeLogViewHistory' ) == 0) {
var ajaxResponse = $.parseJSON(ActionTabFrameGlobal.tabData);
actionToDo='dynaformChangeLogViewHistory' + ajaxResponse.dynUID + ajaxResponse.dynDate ;
//actionToDo = actionToDo.replace(' ', '_').replace(':', '-');
var act = 'dynaformChangeLogViewHistory&DYN_UID=' + ajaxResponse.dynUID + '&HISTORY_ID=' + ajaxResponse.tablename;
addTabPanel( actionToDo,
ActionTabFrameGlobal.tabTitle,
'<iframe id=\'caseiframe-' + actionToDo + '\' style=\'border: none;\' onload=\'onOtherFrameLoad( \"'+actionToDo+'\", \"caseiframe-' + actionToDo + '\", \"form\", 0 );\' width=\'100%\' src=\'".$PM_SOAP->serverURL."/cases/casesHistoryDynaformPage_Ajax?actionAjax=' + act + '&rand=$rand&glpi_domain={$config->fields['domain']}\' ></iframe>'
);
}
}
} ;
$(function() {
//debugger;
$('#processmakertabpanel').tabs( {active: ".array_search( $activePanel, $arrayProcessmakerTabPanel )."});
//$('#processmakertabpanel').scrollabletabs();
//$('#processmakertabpanel').position({
// my: 'left top',
// at: 'left top',
// of: '#processmakertabpaneltable'
//});
$('#processmakertabpanel').removeClass( 'ui-tabs' ) ;
//debugger ;
$('#processmakertabpanel').tabs({activate: function (event, ui) {
try {
//debugger;
if( typeof onOtherFrameLoad == 'function' )
var newPanel = ui.newPanel.selector.replace('#', '') ;
var panelType = newPanel.split( '-' )[ 0 ].split( '$' )[ 0 ].split( '_' ) ;
var searchTag = '' ;
switch( panelType[0] ) {
case 'task' :
searchTag = 'table' ;
break ;
case 'historyDynaformGridPreview' :
case 'dynaformChangeLogViewHistory' :
searchTag = 'form' ;
break ;
case 'caseInfo' :
case 'caseMap' :
case 'caseHistory' :
case 'changeLog' :
case 'historyDynaformPage' :
case 'dynaformChangeLogViewHistory' :
case 'historyDynaformGridHistory' :
default :
searchTag = 'body' ;
break ;
}
onOtherFrameLoad( newPanel, 'caseiframe-' + newPanel, searchTag, ".($project_type=='bpmn' ? "true" : "false" )." ) ;
} catch( evt ) {
//debugger;
}
}
});
";
echo "});
";
echo "</script>";
echo "</td></tr>";
} else {
//********************************
// no running case for this ticket
// propose to start one
//********************************
echo "<tr><th colspan='4'>".$LANG['processmaker']['item']['nocase'];
// check if item is not solved nor closed
if ($item->fields['status'] != 'solved' && $item->fields['status'] != 'closed' && $_SESSION['glpiactiveprofile']['interface'] != 'helpdesk') {
// propose case start
echo "&nbsp;-&nbsp;".$LANG['processmaker']['item']['startone'];
echo "</th></tr>";
echo "<tr class='tab_bg_2'><td class='tab_bg_2' colspan='1'>";
echo $LANG['processmaker']['item']['selectprocess']."&nbsp;";
echo "<input type='hidden' name='action' value='newcase'>";
echo "<input type='hidden' name='items_id' value='$items_id'>";
echo "<input type='hidden' name='itemtype' value='$itemtype'>";
PluginProcessmakerProcess::dropdown(array( 'value' => 0, 'entity' => $item->fields['entities_id'], 'name' => 'plugin_processmaker_processes_id', 'condition' => "is_active=1"));
echo "</td><td class='tab_bg_2'>";
echo "<input type='submit' name='additem' value='".$LANG['processmaker']['item']['start']."' class='submit'>";
echo "</td></tr>";
} else {
echo "</th></tr>";
}
}
echo "</table>";
Html::closeForm(true );
//echo "</form>";
} else {
// under maintenance
echo $LANG['processmaker']['config']['undermaintenance'];
}
return true;
}
/**
* Summary of deleteTasks
* will delete all tasks associated with this case from the item
* @return true if tasks have been deleted from associated item and from case table
*/
private function deleteTasks( ) {
global $DB;
$ret = false;
$query = "DELETE FROM glpi_".strtolower($this->fields['itemtype'])."tasks WHERE id IN (SELECT items_id FROM glpi_plugin_processmaker_tasks WHERE plugin_processmaker_cases_id='".$this->fields['id']."')";
if ($DB->query( $query )) {
$query = "DELETE FROM glpi_plugin_processmaker_tasks WHERE plugin_processmaker_cases_id='".$this->fields['id']."'";
if ($DB->query( $query )) {
$ret = true;
}
}
return $ret;
}
/**
* Summary of deleteCase
* will delete case and all tasks associated with this case from the item
* @return true if case and tasks have been deleted from associated item and from case table
*/
function deleteCase( ) {
return $this->delete(['id' => $this->getID()]);
}
/**
* Summary of cancelTasks
* will mark as information all to_do tasks
* BEWARE that this will only be done when case is in TO_DO status
* @return true if tasks have been deleted from associated item and from case table
*/
private function cancelTasks( ) {
global $DB;
$ret = false;
if (isset($this->fields['case_status']) && $this->fields['case_status'] == "TO_DO") {
$query = "UPDATE glpi_".$this->fields['itemtype']."tasks SET state=0,users_id_tech=0,begin=NULL,end=NULL WHERE state=1 AND id in (select items_id from glpi_plugin_processmaker_tasks where plugin_processmaker_cases_id='".$this->fields['id']."')";
if ($DB->query( $query )) {
$ret = true;
}
}
return $ret;
}
/**
* Summary of cancelCase
* will cancel case and mark 'to_do' tasks associated with this case from the item as information
* BEWARE that this will only be done when case is in TO_DO status
* @return true if case and tasks have been cancelled or marked from associated item and from case table
*/
function cancelCase( ) {
global $DB;
$ret = false;
if (isset($this->fields['case_status']) && $this->fields['case_status'] == "TO_DO") {
if ($this->cancelTasks()) {
if ($this->update( array( 'id' => $this->getID(), 'case_status' => 'CANCELLED' ) )) {
$ret=true;
}
}
}
return $ret;
}
/**
* Summary of canSolve
* To know if a Ticket (Problem or Change) can be solved
* i.e. the case permits solving of item
* @param mixed $item is the item
* @return bool true to permit solve, false otherwise
*/
public static function canSolve ($item) {
$myCase = new self;
if ($myCase->getFromItem( $item['item']->getType(), $item['item']->getID() )) {
$pmVar = $myCase->getVariables(['GLPI_ITEM_CAN_BE_SOLVED']);
2018-07-13 15:58:47 +02:00
// TODO also manage sub-cases
if ($myCase->fields['case_status'] != 'COMPLETED' && $myCase->fields['case_status'] != 'CANCELLED' && (!isset($pmVar['GLPI_ITEM_CAN_BE_SOLVED']) || $pmVar['GLPI_ITEM_CAN_BE_SOLVED'] != 1)) {
// then item can't be solved
return false;
}
}
return true;
}
/**
* Summary of getToDoTasks
* @param mixed $parm is a Ticket, a Problem or a Change
* @return array list of tasks with status 'to do' for case associated with item
*/
public static function getToDoTasks($parm) {
$myCase = new self;
if ($myCase->getFromItem( $parm->getType(), $parm->getID() )) {
return PluginProcessmakerTask::getToDoTasks( $myCase->getID(), $parm->getType()."Task" );
}
return array();
}
/**
* Summary of getMenuContent
* @return array
*/
static function getMenuContent() {
//if (!Session::haveRightsOr('plugin_processmaker_config', [READ, UPDATE])) {
// return;
//}
$front_page = "/plugins/processmaker/front";
$menu = array();
$menu['title'] = self::getTypeName(Session::getPluralNumber());
$menu['page'] = "$front_page/case.php";
$menu['links']['search'] = PluginProcessmakerCase::getSearchURL(false);
//if (Session::haveRightsOr("config", [READ, UPDATE])) {
// $menu['links']['config'] = PluginProcessmakerConfig::getFormURL(false);
//}
$itemtypes = [
'PluginProcessmakerCase' => 'cases'
];
foreach ($itemtypes as $itemtype => $option) {
//$menu['options'][$option]['title'] = $itemtype::getTypeName(Session::getPluralNumber());
$menu['options'][$option]['page'] = $itemtype::getSearchURL(false);
$menu['options'][$option]['links']['search'] = $itemtype::getSearchURL(false);
//if (Session::haveRightsOr("config", [READ, UPDATE])) {
// $menu['options'][$option]['links']['config'] = PluginProcessmakerConfig::getFormURL(false);
//}
switch( $itemtype ) {
case 'PluginProcessmakerCase':
//if ($itemtype::canCreate()) {
//$menu['options'][$option]['links']['add'] = $itemtype::getFormURL(false);
//}
break ;
default :
$menu['options'][$option]['page'] = PluginProcessmakerProcess::getSearchURL(false);
break ;
}
}
return $menu;
}
static function getSpecificValueToDisplay($field, $values, array $options=array()) {
global $LANG;
if (!is_array($values)) {
$values = array($field => $values);
}
switch ($field) {
case 'id':
$locCase = new self;
//$ret = $locCase->add(['id' => 300, 'itemtype' => 'Ticket', 'items_id' => 252108, 'case_guid' => 'azertyuiop', 'case_num' => -12] );
$locCase->getFromDB($values['id']);
return $locCase->getLink();
case 'items_id':
switch ($field) {
case 8:
default:
// show an item link
$item = new $values['itemtype'];
$item->getFromDB($values['items_id']);
return $item->getLink(['forceid' => 1]);
case 9:
// show item entity
$item = new $values['itemtype'];
$item->getFromDB($values['items_id']);
$entity = new Entity;
$entity->getFromDB($item->fields['entities_id']);
return $entity->getLink(['complete' => 1]);
}
case 'case_status':
return $LANG['processmaker']['case']['statuses'][$values['case_status']];
default:
return parent::getSpecificValueToDisplay($field, $values, $options);
}
}
static function getSpecificValueToSelect($field, $name='', $values='', array $options=array()) {
if (!is_array($values)) {
$values = array($field => $values);
}
$options['display'] = false;
switch ($field) {
case 'case_status':
$options['name'] = $name;
$options['value'] = $values[$field];
return self::dropdownStatus($options);
default:
return parent::getSpecificValueToSelect($field, $name, $values, $options);
}
}
static function dropdownStatus(array $options=array()) {
$p['name'] = 'case_status';
$p['value'] = self::TO_DO;
$p['showtype'] = 'normal';
$p['display'] = true;
if (is_array($options) && count($options)) {
foreach ($options as $key => $val) {
$p[$key] = $val;
}
}
switch ($p['showtype']) {
//case 'allowed' :
// $tab = static::getAllowedStatusArray($p['value']);
// break;
case 'search' :
$tab = static::getAllStatusArray(true);
break;
default :
$tab = static::getAllStatusArray(false);
break;
}
return Dropdown::showFromArray($p['name'], $tab, $p);
}
static function getAllStatusArray($withmetaforsearch=false) {
$tab = array(self::DRAFT => _x('case_status', 'Draft'),
self::TO_DO => _x('case_status', 'To do'),
self::COMPLETED => _x('case_status', 'Completed'),
self::CANCELLED => _x('case_status', 'Cancelled'));
//if ($withmetaforsearch) {
// $tab['notold'] = _x('status', 'Not solved');
// $tab['notclosed'] = _x('status', 'Not closed');
// $tab['process'] = __('Processing');
// $tab['old'] = _x('status', 'Solved + Closed');
// $tab['all'] = __('All');
//}
return $tab;
}
static function getStatus($value) {
$tab = static::getAllStatusArray(true);
// Return $value if not defined
return (isset($tab[$value]) ? $tab[$value] : $value);
}
/**
* Summary of getSearchOptions
* @return mixed
*/
function getSearchOptions() {
global $LANG;
$tab = array();
$tab['common'] = __('Process cases', 'processmaker'); //$LANG['processmaker']['title'][1];
$tab[1]['table'] = self::getTable();
$tab[1]['field'] = 'id';
$tab[1]['name'] = __('ID', 'processmaker');
$tab[1]['datatype'] = 'number';
$tab[1]['searchtype'] = 'contains';
$tab[1]['massiveaction'] = false;
$tab[2]['table'] = self::getTable();
$tab[2]['field'] = 'name';
$tab[2]['name'] = __('Title', 'processmaker');
$tab[2]['datatype'] = 'itemlink';
$tab[2]['searchtype'] = 'contains';
$tab[2]['massiveaction'] = false;
$tab[3]['table'] = PluginProcessmakerProcess::getTable();
$tab[3]['field'] = 'name';
$tab[3]['name'] = __('Process', 'processmaker');
$tab[3]['datatype'] = 'itemlink';
$tab[3]['massiveaction'] = false;
//$tab[7]['table'] = self::getTable();
//$tab[7]['field'] = 'itemtype';
//$tab[7]['name'] = __('Item type', 'processmaker');
//$tab[7]['massiveaction'] = false;
//$tab[7]['datatype'] = 'text';
$tab[8]['table'] = self::getTable();
$tab[8]['field'] = 'items_id';
$tab[8]['name'] = __('Item', 'processmaker');
$tab[8]['massiveaction'] = false;
$tab[8]['datatype'] = 'specific';
$tab[8]['additionalfields'] = ['itemtype'];
$tab[9]['table'] = Entity::getTable();
$tab[9]['field'] = 'name';
$tab[9]['name'] = __('Item entity', 'processmaker');
$tab[9]['massiveaction'] = false;
$tab[9]['datatype'] = 'itemlink';
$tab[10]['table'] = self::getTable();
$tab[10]['field'] = 'case_status';
$tab[10]['name'] = __('Status', 'processmaker');
$tab[10]['datatype'] = 'specific';
$tab[10]['searchtype'] = ['contains', 'equals', 'notequals'];
$tab[10]['massiveaction'] = false;
$tab[14]['table'] = self::getTable();
$tab[14]['field'] = 'plugin_processmaker_cases_id';
$tab[14]['name'] = __('Subcase of', 'processmaker');
$tab[14]['datatype'] = 'itemlink';
$tab[14]['massiveaction'] = false;
return $tab;
}
function showForm ($ID, $options=array('candel'=>false)) {
global $DB, $CFG_GLPI, $LANG;
$options['candel'] = true;
$this->initForm($ID, $options);
$this->showFormHeader($options);
//echo "<tr class='tab_bg_1'>";
//echo "<td>".__("Name")."</td><td>";
//echo "<input size='100' type='text' name='name' value='".Html::cleanInputText($this->fields["name"])."'>";
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td >".__("Active")."</td><td>";
//Dropdown::showYesNo("is_active", $this->fields["is_active"]);
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td >".__("External data")."</td><td>";
//Dropdown::showYesNo("is_externaldata", $this->fields["is_externaldata"]);
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td >".__("Self")."</td><td>";
//Dropdown::showYesNo("is_self", $this->fields["is_self"]);
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td >".__("Source task GUID")."</td><td>";
////PluginProcessmakerTaskCategory::dropdown(array('name' => 'plugin_processmaker_taskcategories_id_source',
//// 'display_emptychoice' => false,
//// 'value' => $this->fields['plugin_processmaker_taskcategories_id_source']));
//echo "<input size='100' type='text' name='sourcetask_guid' value='".$this->fields["sourcetask_guid"]."'>";
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td >".__("Target task GUID")."</td><td>";
////PluginProcessmakerTaskCategory::dropdown(array('name' => 'plugin_processmaker_taskcategories_id_target',
//// 'display_emptychoice' => false,
//// 'value' => $this->fields['plugin_processmaker_taskcategories_id_target']));
//echo "<input size='100' type='text' name='targettask_guid' value='".$this->fields["targettask_guid"]."'>";
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td >".__("Target process GUID")."</td><td>";
////Dropdown::show( 'PluginProcessmakerProcess', array('name' => 'plugin_processmaker_processes_id',
//// 'display_emptychoice' => true,
//// 'value' => $this->fields['plugin_processmaker_processes_id'],
//// 'condition' => 'is_active = 1'));
//echo "<input size='100' type='text' name='targetprocess_guid' value='".$this->fields["targetprocess_guid"]."'>";
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td>".__("Target dynaform GUID")."</td><td>";
//echo "<input size='100' type='text' name='targetdynaform_guid' value='".$this->fields["targetdynaform_guid"]."'>";
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td>".__("Source condition")."</td><td>";
////echo "<input size='100' type='text' name='sourcecondition' value='".$this->fields["sourcecondition"]."'>";
//echo "<textarea cols='100' rows='3' name='sourcecondition' >".$this->fields["sourcecondition"]."</textarea>";
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td >".__("Claim target task")."</td><td>";
//Dropdown::showYesNo("is_targettoclaim", $this->fields["is_targettoclaim"]);
//echo "</td></tr>";
//echo "<tr class='tab_bg_1'>";
//echo "<td>".__("External application JSON config")."</td><td>";
//echo "<textarea cols='100' rows='6' name='externalapplication' >".$this->fields["externalapplication"]."</textarea>";
//echo "</td></tr>";
$this->showFormButtons($options );
}
function defineTabs($options=array()) {
// $ong = array('empty' => $this->getTypeName(1));
$ong = array();
//$this->addDefaultFormTab($ong);
$this->addStandardTab('PluginProcessmakerTask', $ong, $options);
2018-07-13 15:58:47 +02:00
$this->addStandardTab(__CLASS__, $ong, $options);
$this->addStandardTab('PluginProcessmakerCasemap', $ong, $options);
$this->addStandardTab('PluginProcessmakerCasehistory', $ong, $options);
$this->addStandardTab('PluginProcessmakerCasechangelog', $ong, $options);
2018-07-13 15:58:47 +02:00
$this->addStandardTab('PluginProcessmakerCasedynaform', $ong, $options);
//$this->addStandardTab('Ticket', $ong, $options);
//$this->addStandardTab('Log', $ong, $options);
//TODO we are going to add tabs like tasks, map, history, dynaform...
return $ong;
}
/**
* Actions done after the PURGE of the item in the database
*
* @return nothing
**/
/**
* Summary of post_purgeItem
* Actions done after the PURGE of the item in the database
* Will purge the tasks and the PM case and recursively the sub-cases if any
* @return boolean|integer
*/
function post_purgeItem() {
global $PM_SOAP;
$ret = false;
$PM_SOAP->login(true);
if ($this->deleteTasks() && $this->deleteCronTaskActions() && $PM_SOAP->deleteCase($this->fields['case_guid'])->status_code == 0) {
$ret = true;
// then must delete any sub-processes (sub-cases)
foreach(getAllDatasFromTable(self::getTable(), "`plugin_processmaker_cases_id` = ".$this->getID()) as $row){
$tmp = new self;
$tmp->fields = $row;
$ret &= $tmp->delete(['id' => $row['id']]);
}
}
return $ret;
}
/**
* Summary of deleteCronTaskActions
* Will delete any cron task actions taht are linked to current case
*/
function deleteCronTaskActions( ) {
global $DB;
$query = "DELETE FROM `glpi_plugin_processmaker_crontaskactions` WHERE `plugin_processmaker_cases_id` = ".$this->getID();
return $DB->query($query);
}
}