From 2d29fa5aa1e1ad2ab26fe06bbdfb3d6afdab5308 Mon Sep 17 00:00:00 2001 From: Tomolimo Date: Wed, 23 Jun 2021 12:20:12 +0200 Subject: [PATCH] Fixed issue with criteria in getProcessesWithCategoryAndProfile that prevents correct list of processes Fixed issue with too much processes in getProcessesWithCategoryAndProfile Fixed deprecated use of fetch_assoc Replaced $_POST and $_GET by $_REQUEST --- ajax/task_users.php | 2 +- front/processmaker.form.php | 252 +++++++++++++-------------- front/processmaker.helpdesk.form.php | 24 +-- front/tracking.injector.php | 136 +++++++-------- inc/processmaker.class.php | 31 ++-- processmaker.xml | 2 +- setup.php | 2 +- 7 files changed, 226 insertions(+), 223 deletions(-) diff --git a/ajax/task_users.php b/ajax/task_users.php index 8768b9b..f9879a3 100644 --- a/ajax/task_users.php +++ b/ajax/task_users.php @@ -42,7 +42,7 @@ $grp = false; $query = "SELECT TAS_GROUP_VARIABLE FROM TASK WHERE TAS_UID='".$_REQUEST['taskGuid']."' AND TAS_ASSIGN_TYPE='SELF_SERVICE';"; $res = $PM_DB->query($query); -if ($PM_DB->numrows($res) > 0 && $row = $PM_DB->fetch_assoc($res)) { +if ($PM_DB->numrows($res) > 0 && $row = $PM_DB->fetchAssoc($res)) { $can_unclaim = true; if ($row['TAS_GROUP_VARIABLE'] != '') { //self-service value based assignment diff --git a/front/processmaker.form.php b/front/processmaker.form.php index a10c79a..f0462c9 100644 --- a/front/processmaker.form.php +++ b/front/processmaker.form.php @@ -1,126 +1,126 @@ - 0) { - - // then this case will be bound to an item - if ($_POST['plugin_processmaker_processes_id'] > 0) { - - $resultCase = $PM_SOAP->startNewCase($_POST['plugin_processmaker_processes_id'], $_POST['itemtype'], $_POST['items_id'], Session::getLoginUserID()); - - if ($resultCase->status_code == 0) { - $case = new PluginProcessmakerCase; - if ($case->getFromGUID($resultCase->caseId)) { - $link = $case->getLinkURL(); - $task = new PluginProcessmakerTask($_POST['itemtype'].'Task'); - - $task->getFromDBByRequest([ - 'WHERE' => [ - 'plugin_processmaker_cases_id' => $case->getID() - ], - ]); - - - //$task->getFromDBByQuery(" WHERE `plugin_processmaker_cases_id`=".$case->getID()); // normally there is only one and only one first task - //$link .= '&forcetab=PluginProcessmakerTask$'.$task->getID(); - - Session::setActiveTab('PluginProcessmakerCase', 'PluginProcessmakerTask$'.$task->fields['id']); - $item = new $_POST['itemtype']; - $item->getFromDB($_POST['items_id']); - unset($_SERVER['REQUEST_URI']); // to prevent use of processmaker.form.php in NavigateList - 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', - $_POST['itemtype']::getTypeName(1), $item->fields["name"])); - Html::redirect($link); - } - Html::back(); - } else { - Session::addMessageAfterRedirect( PluginProcessmakerProcessmaker::getPMErrorMessage($resultCase->status_code)."
".$resultCase->message." (".$resultCase->status_code.")", true, ERROR); - } - } else { - Html::back(); - } - } else { // the case is created before the ticket (used for post-only case creation before ticket creation) - $pm_user_guid = PluginProcessmakerUser::getPMUserId( Session::getLoginUserID() ); - $resultCase = $PM_SOAP->newCase( $_POST['plugin_processmaker_processes_id'], - ['GLPI_ITEM_CAN_BE_SOLVED' => 0, - 'GLPI_SELFSERVICE_CREATED' => '1', - 'GLPI_ITEM_TYPE' => 'Ticket', - 'GLPI_URL' => $CFG_GLPI['url_base'], - // Specific to Tickets - // GLPI_TICKET_TYPE will contains 1 (= incident) or 2 (= request) - 'GLPI_TICKET_TYPE' => $_POST['type'], - 'GLPI_ITEM_REQUESTER_GLPI_ID' => Session::getLoginUserID(), - 'GLPI_ITEM_REQUESTER_PM_ID' => $pm_user_guid - ] ); - if ($resultCase->status_code == 0) { - // case is created - // Must show it... - // - $rand = rand( ); - Html::redirect($CFG_GLPI['root_doc']."/plugins/processmaker/front/processmaker.helpdesk.form.php?processes_id=".$_POST['plugin_processmaker_processes_id']."&case_guid=".$resultCase->caseId."&rand=$rand&itilcategories_id=".$_POST["itilcategories_id"]."&type=".$_POST["type"]."&entities_id=".$_POST['entities_id']); - - } else { - Session::addMessageAfterRedirect( PluginProcessmakerProcessmaker::getPMErrorMessage($resultCase->status_code)."
$resultCase->message ($resultCase->status_code)", true, ERROR); - Html::redirect($CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1"); - } - - } - break; - - case 'reassign_reminder' : - if (isset($_POST['reassign'])) { - // here we should re-assign the current task to $_POST['users_id_recipient'] - $locCase = new PluginProcessmakerCase; - $locCase->getFromDB($_POST['cases_id']); - if ($_POST['users_id_recipient'] != 0) { - // we are assigning a new tech to a task - $pmResponse = $locCase->reassignCase($_POST['delIndex'], - $_POST['taskGuid'], - $_POST['delThread'], - $_POST['users_id'], - $_POST['users_id_recipient'], - ['comment' => $_POST['comment']]); - if ($pmResponse) { - Session::addMessageAfterRedirect(__('Task re-assigned!', 'processmaker'), true, INFO); - } else { - Session::addMessageAfterRedirect(__('Error re-assigning task: ', 'processmaker').$pmResponse->message, true, ERROR); - } - } elseif ($_POST['users_id_recipient'] == 0) { - // we are unassigning a task, i.e.: task un-claim - $pmResponse = $locCase->unassignCase($_POST['delIndex'], - $_POST['taskGuid'], - $_POST['tasktype'], - $_POST['tasks_id'], - $_POST['itemtype'], - ['comment' => $_POST['comment']]); - if ($pmResponse) { - Session::addMessageAfterRedirect(__('Task un-claimed!', 'processmaker'), true, INFO); - } else { - Session::addMessageAfterRedirect(__("Can't un-claim task! Verify 'Assignement Rules' in the process definition.", 'processmaker'), true, ERROR); - } - } - } elseif (isset($_POST['reminder'])) { - // send notification remider as requested for this task - - $locCase = new PluginProcessmakerCase; - $locCase->getFromDB($_POST['cases_id']); - $glpi_item = new $_POST['itemtype']; - $glpi_item->getFromDB($_POST['items_id']); - $pm_task = new PluginProcessmakerTask($_POST['tasktype']); - $pm_task->getFromDB($_POST['tasks_id']); - $glpi_task = new $_POST['tasktype']; - $glpi_task->getFromDB($_POST['tasks_id']); - - // send notification now! - $pm_task->sendNotification('task_reminder', $glpi_task, $glpi_item, $locCase); - } -} - -// to return to item -Html::back(); - + 0) { + + // then this case will be bound to an item + if ($_REQUEST['plugin_processmaker_processes_id'] > 0) { + + $resultCase = $PM_SOAP->startNewCase($_REQUEST['plugin_processmaker_processes_id'], $_REQUEST['itemtype'], $_REQUEST['items_id'], Session::getLoginUserID()); + + if ($resultCase->status_code == 0) { + $case = new PluginProcessmakerCase; + if ($case->getFromGUID($resultCase->caseId)) { + $link = $case->getLinkURL(); + $task = new PluginProcessmakerTask($_REQUEST['itemtype'].'Task'); + + $task->getFromDBByRequest([ + 'WHERE' => [ + 'plugin_processmaker_cases_id' => $case->getID() + ], + ]); + + + //$task->getFromDBByQuery(" WHERE `plugin_processmaker_cases_id`=".$case->getID()); // normally there is only one and only one first task + //$link .= '&forcetab=PluginProcessmakerTask$'.$task->getID(); + + Session::setActiveTab('PluginProcessmakerCase', 'PluginProcessmakerTask$'.$task->fields['id']); + $item = new $_REQUEST['itemtype']; + $item->getFromDB($_REQUEST['items_id']); + unset($_SERVER['REQUEST_URI']); // to prevent use of processmaker.form.php in NavigateList + 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', + $_REQUEST['itemtype']::getTypeName(1), $item->fields["name"])); + Html::redirect($link); + } + Html::back(); + } else { + Session::addMessageAfterRedirect( PluginProcessmakerProcessmaker::getPMErrorMessage($resultCase->status_code)."
".$resultCase->message." (".$resultCase->status_code.")", true, ERROR); + } + } else { + Html::back(); + } + } else { // the case is created before the ticket (used for post-only case creation before ticket creation) + $pm_user_guid = PluginProcessmakerUser::getPMUserId( Session::getLoginUserID() ); + $resultCase = $PM_SOAP->newCase( $_REQUEST['plugin_processmaker_processes_id'], + ['GLPI_ITEM_CAN_BE_SOLVED' => 0, + 'GLPI_SELFSERVICE_CREATED' => '1', + 'GLPI_ITEM_TYPE' => 'Ticket', + 'GLPI_URL' => $CFG_GLPI['url_base'], + // Specific to Tickets + // GLPI_TICKET_TYPE will contains 1 (= incident) or 2 (= request) + 'GLPI_TICKET_TYPE' => $_REQUEST['type'], + 'GLPI_ITEM_REQUESTER_GLPI_ID' => Session::getLoginUserID(), + 'GLPI_ITEM_REQUESTER_PM_ID' => $pm_user_guid + ] ); + if ($resultCase->status_code == 0) { + // case is created + // Must show it... + // + $rand = rand( ); + Html::redirect($CFG_GLPI['root_doc']."/plugins/processmaker/front/processmaker.helpdesk.form.php?processes_id=".$_REQUEST['plugin_processmaker_processes_id']."&case_guid=".$resultCase->caseId."&rand=$rand&itilcategories_id=".$_REQUEST["itilcategories_id"]."&type=".$_REQUEST["type"]."&entities_id=".$_REQUEST['entities_id']); + + } else { + Session::addMessageAfterRedirect( PluginProcessmakerProcessmaker::getPMErrorMessage($resultCase->status_code)."
$resultCase->message ($resultCase->status_code)", true, ERROR); + Html::redirect($CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1"); + } + + } + break; + + case 'reassign_reminder' : + if (isset($_REQUEST['reassign'])) { + // here we should re-assign the current task to $_REQUEST['users_id_recipient'] + $locCase = new PluginProcessmakerCase; + $locCase->getFromDB($_REQUEST['cases_id']); + if ($_REQUEST['users_id_recipient'] != 0) { + // we are assigning a new tech to a task + $pmResponse = $locCase->reassignCase($_REQUEST['delIndex'], + $_REQUEST['taskGuid'], + $_REQUEST['delThread'], + $_REQUEST['users_id'], + $_REQUEST['users_id_recipient'], + ['comment' => $_REQUEST['comment']]); + if ($pmResponse) { + Session::addMessageAfterRedirect(__('Task re-assigned!', 'processmaker'), true, INFO); + } else { + Session::addMessageAfterRedirect(__('Error re-assigning task: ', 'processmaker').$pmResponse->message, true, ERROR); + } + } elseif ($_REQUEST['users_id_recipient'] == 0) { + // we are unassigning a task, i.e.: task un-claim + $pmResponse = $locCase->unassignCase($_REQUEST['delIndex'], + $_REQUEST['taskGuid'], + $_REQUEST['tasktype'], + $_REQUEST['tasks_id'], + $_REQUEST['itemtype'], + ['comment' => $_REQUEST['comment']]); + if ($pmResponse) { + Session::addMessageAfterRedirect(__('Task un-claimed!', 'processmaker'), true, INFO); + } else { + Session::addMessageAfterRedirect(__("Can't un-claim task! Verify 'Assignement Rules' in the process definition.", 'processmaker'), true, ERROR); + } + } + } elseif (isset($_REQUEST['reminder'])) { + // send notification remider as requested for this task + + $locCase = new PluginProcessmakerCase; + $locCase->getFromDB($_REQUEST['cases_id']); + $glpi_item = new $_REQUEST['itemtype']; + $glpi_item->getFromDB($_REQUEST['items_id']); + $pm_task = new PluginProcessmakerTask($_REQUEST['tasktype']); + $pm_task->getFromDB($_REQUEST['tasks_id']); + $glpi_task = new $_REQUEST['tasktype']; + $glpi_task->getFromDB($_REQUEST['tasks_id']); + + // send notification now! + $pm_task->sendNotification('task_reminder', $glpi_task, $glpi_item, $locCase); + } +} + +// to return to item +Html::back(); + diff --git a/front/processmaker.helpdesk.form.php b/front/processmaker.helpdesk.form.php index 28c4ea8..9a8890c 100644 --- a/front/processmaker.helpdesk.form.php +++ b/front/processmaker.helpdesk.form.php @@ -59,8 +59,8 @@ function processMakerShowCase($users_id, $from_helpdesk) { $tkt = new Ticket; - // as showFormHelpdesk uses $_POST, we must set it - $_POST = $_REQUEST; + // as showFormHelpdesk uses $_REQUEST, we must set it + $_REQUEST = $_REQUEST; //// must be using bare text //$save_rich_text = $CFG_GLPI["use_rich_text"]; @@ -189,9 +189,9 @@ function in_array_recursive($needle, $haystack) { // Change profile system -if (isset($_POST['newprofile'])) { - if (isset($_SESSION["glpiprofiles"][$_POST['newprofile']])) { - Session::changeProfile($_POST['newprofile']); +if (isset($_REQUEST['newprofile'])) { + if (isset($_SESSION["glpiprofiles"][$_REQUEST['newprofile']])) { + Session::changeProfile($_REQUEST['newprofile']); if ($_SESSION["glpiactiveprofile"]["interface"] == "central") { Html::redirect($CFG_GLPI['root_doc']."/front/central.php"); @@ -205,20 +205,20 @@ function in_array_recursive($needle, $haystack) { } // Manage entity change -if (isset($_GET["active_entity"])) { - if (!isset($_GET["is_recursive"])) { - $_GET["is_recursive"] = 0; +if (isset($_REQUEST["active_entity"])) { + if (!isset($_REQUEST["is_recursive"])) { + $_REQUEST["is_recursive"] = 0; } - if (Session::changeActiveEntities($_GET["active_entity"], $_GET["is_recursive"])) { - if ($_GET["active_entity"] == $_SESSION["glpiactive_entity"]) { + if (Session::changeActiveEntities($_REQUEST["active_entity"], $_REQUEST["is_recursive"])) { + if ($_REQUEST["active_entity"] == $_SESSION["glpiactive_entity"]) { Html::redirect(preg_replace("/entities_id.*/", "", $_SERVER['HTTP_REFERER'])); } } } // Redirect management -if (isset($_GET["redirect"])) { - Toolbox::manageRedirect($_GET["redirect"]); +if (isset($_REQUEST["redirect"])) { + Toolbox::manageRedirect($_REQUEST["redirect"]); } // redirect if no create ticket right diff --git a/front/tracking.injector.php b/front/tracking.injector.php index a036474..943de0d 100644 --- a/front/tracking.injector.php +++ b/front/tracking.injector.php @@ -1,68 +1,68 @@ - 1) { - // in this case we should show the process dropdown selection - include (GLPI_ROOT . "/plugins/processmaker/front/processmaker.helpdesk.form.php"); - die(); - } else { - // in this case should start RUMT - // if and only if itilcategories_id matches one of the 'User Management' categories - // could be done via ARBehviours or RUMT itself - $userManagementCat = [ 100556, 100557, 100558 ]; - $plug = new Plugin; - if ($processQt == 0 && in_array( $_POST["itilcategories_id"], $userManagementCat) && $plug->isActivated('rayusermanagementticket' )) { - Html::redirect($CFG_GLPI['root_doc']."/plugins/rayusermanagementticket/front/rayusermanagementticket.helpdesk.public.php"); - } - } -} - -// prepare environment for std tracking.injector.php -// switch to front dir -chdir(GLPI_ROOT."/front"); -// revert back $_POST, $_GET and $_REQUEST -$_GET = $PM_GET; -$_POST = $PM_POST; -$_REQUEST = $PM_REQUEST; -include (GLPI_ROOT . "/front/tracking.injector.php"); + 1) { + // in this case we should show the process dropdown selection + include (GLPI_ROOT . "/plugins/processmaker/front/processmaker.helpdesk.form.php"); + die(); + } else { + // in this case should start RUMT + // if and only if itilcategories_id matches one of the 'User Management' categories + // could be done via ARBehviours or RUMT itself + $userManagementCat = [ 100556, 100557, 100558 ]; + $plug = new Plugin; + if ($processQt == 0 && in_array( $_REQUEST["itilcategories_id"], $userManagementCat) && $plug->isActivated('rayusermanagementticket' )) { + Html::redirect($CFG_GLPI['root_doc']."/plugins/rayusermanagementticket/front/rayusermanagementticket.helpdesk.public.php"); + } + } +} + +// prepare environment for std tracking.injector.php +// switch to front dir +chdir(GLPI_ROOT."/front"); +// revert back $_POST, $_GET and $_REQUEST +$_GET = $PM_GET; +$_POST = $PM_POST; +$_REQUEST = $PM_REQUEST; +include (GLPI_ROOT . "/front/tracking.injector.php"); diff --git a/inc/processmaker.class.php b/inc/processmaker.class.php index 9dd59d4..aa50ac4 100644 --- a/inc/processmaker.class.php +++ b/inc/processmaker.class.php @@ -2674,9 +2674,21 @@ public static function getProcessesWithCategoryAndProfile($category, $type, $pro global $DB; $dbu = new DbUtils; $processList = [ ]; - //$entityAncestors = implode( ", ", $dbu->getAncestorsOf( $dbu->getTableForItemType( 'Entity' ), $entity ) ); $entityAncestors = $dbu->getAncestorsOf( $dbu->getTableForItemType( 'Entity' ), $entity ); - //if (strlen( $entityAncestors ) > 0) { + + $entities = ['entities_id' => $entity]; + if (count( $entityAncestors ) > 0) { + $entities = [ + 'OR' => [ + 'entities_id' => $entity, + 'AND' => [ + 'entities_id' => $entityAncestors, + 'is_recursive' => 1 + ] + ] + ]; + } + if ($category > 0) { $query = [ 'FIELDS' => ['glpi_plugin_processmaker_processes.id', 'glpi_plugin_processmaker_processes.name'], @@ -2696,30 +2708,21 @@ public static function getProcessesWithCategoryAndProfile($category, $type, $pro ], 'WHERE' => [ 'AND' => [ + 'is_active' => 1, 'itilcategories_id' => $category, 'type' => $type, 'profiles_id' => $profile, - 'entities_id' => $entity + $entities ] ] ]; - if (count( $entityAncestors ) > 0) { - //$entityAncestors = " OR (entities_id IN ($entityAncestors) AND is_recursive = 1) "; - $entityAncestors[] = $entity; - $query['WHERE']['AND']['entities_id'] = $entityAncestors; - $query['WHERE']['AND']['is_recursive'] = 1; - } + $res = $DB->request($query); foreach ($res as $row) { $processList[] = $row; } $processList = array_map("unserialize", array_unique(array_map("serialize", $processList))); } - //$query ="SELECT DISTINCT glpi_plugin_processmaker_processes.id, glpi_plugin_processmaker_processes.name FROM glpi_plugin_processmaker_processes - // INNER JOIN glpi_plugin_processmaker_processes_profiles ON glpi_plugin_processmaker_processes_profiles.plugin_processmaker_processes_id=glpi_plugin_processmaker_processes.id - // WHERE is_active = 1 AND itilcategories_id = $category AND `type` = $type AND profiles_id = $profile AND (entities_id = $entity $entityAncestors)"; - - //foreach ($DB->request( $query ) as $row) { return $processList; diff --git a/processmaker.xml b/processmaker.xml index fd72d7b..8ed5d68 100644 --- a/processmaker.xml +++ b/processmaker.xml @@ -41,7 +41,7 @@ 9.4 - 4.0.4 + 4.0.5 9.5 diff --git a/setup.php b/setup.php index a4a02e2..b902a8d 100644 --- a/setup.php +++ b/setup.php @@ -1,6 +1,6 @@