load('cases'); $types = ['to_do', 'draft', 'cancelled', 'sent', 'paused', 'completed']; $typesId = ['CASES_INBOX' => 'to_do', 'CASES_DRAFT' => 'draft', 'CASES_CANCELLED' => 'cancelled', 'CASES_SENT' => 'sent', 'CASES_PAUSED' => 'paused', 'CASES_COMPLETED' => 'completed']; // If the feature for highlight the home folders is disabled, add unassigned list to tree options with counters if (!HIGHLIGHT_HOME_FOLDER_ENABLE) { $types[] = 'selfservice'; $typesId['CASES_SELFSERVICE'] = 'selfservice'; } /*----------------------------------********---------------------------------*/ $licensedFeatures = PMLicensedFeatures::getSingleton(); if ($licensedFeatures->verifyfeature('7TTeDBQeWRoZTZKYjh4eFpYUlRDUUEyVERPU3FxellWank=')) { $typesId['CONSOLIDATED_CASES'] = 'batch_routing'; $types[] = 'batch_routing'; } /*----------------------------------********---------------------------------*/ $list = []; $list['count'] = ' '; $empty = []; foreach ($types as $key => $val) { $empty[$val] = $list; } $count = $empty; // Now drawing the tree view using the menu options from menu/cases.php $menuCases = []; for ($i = 0; $i < count($menuInstance->Options); $i++) { if ($menuInstance->Types[$i] == 'blockHeader') { $currentBlockID = $menuInstance->Id[$i]; $menuCases[$currentBlockID]['blockTitle'] = $menuInstance->Labels[$i]; if ($menuInstance->Options[$i] != "") { $menuCases[$currentBlockID]['link'] = $menuInstance->Options[$i]; } } elseif ($menuInstance->Types[$i] == 'blockNestedTree') { $currentBlockID = $menuInstance->Id[$i]; $menuCases[$currentBlockID]['blockTitle'] = $menuInstance->Labels[$i]; $menuCases[$currentBlockID]['blockType'] = $menuInstance->Types[$i]; $menuCases[$currentBlockID]['loaderurl'] = $menuInstance->Options[$i]; } elseif ($menuInstance->Types[$i] == 'blockHeaderNoChild') { $currentBlockID = $menuInstance->Id[$i]; $menuCases[$currentBlockID]['blockTitle'] = $menuInstance->Labels[$i]; $menuCases[$currentBlockID]['blockType'] = $menuInstance->Types[$i]; $menuCases[$currentBlockID]['link'] = $menuInstance->Options[$i]; } elseif ($menuInstance->Types[$i] == 'rootNode') { $menuCases[$currentBlockID]['blockItems'][$menuInstance->Id[$i]] = [ 'label' => $menuInstance->Labels[$i], 'link' => $menuInstance->Options[$i], 'icon' => (isset($menuInstance->Icons[$i]) && $menuInstance->Icons[$i] != '') ? $menuInstance->Icons[$i] : 'kcmdf.png' ]; $index = $i; list($childs, $index) = getChilds($menuInstance, ++$index); $menuCases[$currentBlockID]['blockItems'][$menuInstance->Id[$i]]['childs'] = $childs; $i = $index; } else { $menuCases[$currentBlockID]['blockItems'][$menuInstance->Id[$i]] = [ 'label' => $menuInstance->Labels[$i], 'link' => $menuInstance->Options[$i], 'icon' => (isset($menuInstance->Icons[$i]) && $menuInstance->Icons[$i] != '') ? $menuInstance->Icons[$i] : 'kcmdf.png' ]; if (isset($typesId[$menuInstance->Id[$i]])) { $menuCases[$currentBlockID]['blockItems'][$menuInstance->Id[$i]]['cases_count'] = $count[$typesId[$menuInstance->Id[$i]]]['count']; } } } // Build xml nodes for a specific child node by its "id" on var "$_POST['node']" passed in a POST request if (isset($_POST['node']) && in_array($_POST['node'], array_keys($menuCases))) { $xml = new SimpleXMLElement(''); if (array_key_exists('blockItems', $menuCases[$_POST['node']]) && is_array($menuCases[$_POST['node']]['blockItems'])) { foreach ($menuCases[$_POST['node']]['blockItems'] as $key => $item) { $option = $xml->addChild('option'); $option->addAttribute('id', $key); $option->addAttribute('title', $item['label']); $option->addAttribute('url', $item['link']); if (! empty($item['cases_count'])) { $option->addAttribute('cases_count', $item['cases_count']); } } } // This function generates an xml, so it prevents the output of a badly formed xml // by cleaning any content prior to this function with ob_clean ob_clean(); echo $xml->asXML(); die; } // Build xml document for all tree nodes $xml = new SimpleXMLElement(''); foreach ($menuCases as $menuId => $menuBlock) { if (isset($menuBlock['blockItems']) && count($menuBlock['blockItems']) > 0) { // adding "menu_block" node $menuBlockNode = $xml->addChild('menu_block'); $menuBlockNode->addAttribute('id', $menuId); $menuBlockNode->addAttribute('blockTitle', $menuBlock['blockTitle']); if (! empty($menuBlock['link'])) { $menuBlockNode->addAttribute('url', $menuBlock['link']); } // Adding "menu_block" child nodes foreach ($menuBlock['blockItems'] as $id => $menu) { if (! empty($menu['childs'])) { $rootNode = $menuBlockNode->addChild('menu_block'); $rootNode->addAttribute('id', $id); $rootNode->addAttribute('title', $menu['label']); $rootNode->addAttribute('url', $menu['link']); $rootNode->addAttribute('expanded', true); foreach ($menu['childs'] as $id => $child) { $childNode = $rootNode->addChild('option'); $childNode->addAttribute('id', $id); $childNode->addAttribute('title', $child['label']); $childNode->addAttribute('url', $child['link']); } continue; } $option = $menuBlockNode->addChild('option'); $option->addAttribute('id', $id); $option->addAttribute('title', $menu['label']); $option->addAttribute('url', $menu['link']); if (! empty($menu['cases_count'])) { $option->addAttribute('cases_count', $menu['cases_count']); } } } elseif (isset($menuBlock['blockType']) && $menuBlock['blockType'] == "blockNestedTree") { $menuBlockNode = $xml->addChild('menu_block'); $menuBlockNode->addAttribute('id', $menuId); $menuBlockNode->addAttribute('folderId', "0"); $menuBlockNode->addAttribute('blockTitle', $menuBlock['blockTitle']); $menuBlockNode->addAttribute('blockNestedTree', $menuBlock['loaderurl']); } elseif (isset($menuBlock['blockType']) && $menuBlock['blockType'] == "blockHeaderNoChild") { $menuBlockNode = $xml->addChild('menu_block'); $menuBlockNode->addAttribute('id', $menuId); $menuBlockNode->addAttribute('blockTitle', $menuBlock['blockTitle']); $menuBlockNode->addAttribute('blockHeaderNoChild', "blockHeaderNoChild"); $menuBlockNode->addAttribute('url', $menuBlock['link']); } } // This function generates an xml, so it prevents the output of a badly formed xml // by cleaning any content prior to this function with ob_clean ob_clean(); echo $xml->asXML(); die; } /*----------------------------------********---------------------------------*/ function getAllCountersEnterprise() { try { $userUid = (isset($_SESSION['USER_LOGGED']) && $_SESSION['USER_LOGGED'] != '') ? $_SESSION['USER_LOGGED'] : null; $lists = new \ProcessMaker\BusinessModel\Lists(); $response = $lists->getCounters($userUid); echo G::json_encode($response); } catch (\Exception $e) { throw (new Exception($e->getMessage())); } } /*----------------------------------********---------------------------------*/ function getAllCounters() { $userUid = (isset($_SESSION['USER_LOGGED']) && $_SESSION['USER_LOGGED'] != '') ? $_SESSION['USER_LOGGED'] : null; $aTypes = array(); $aTypes['to_do'] = 'CASES_INBOX'; $aTypes['draft'] = 'CASES_DRAFT'; $aTypes['cancelled'] = 'CASES_CANCELLED'; $aTypes['sent'] = 'CASES_SENT'; $aTypes['paused'] = 'CASES_PAUSED'; $aTypes['completed'] = 'CASES_COMPLETED'; $aTypes['selfservice'] = 'CASES_SELFSERVICE'; //$aTypes['to_revise'] = 'CASES_TO_REVISE'; //$aTypes['to_reassign'] = 'CASES_TO_REASSIGN'; $case = new \ProcessMaker\BusinessModel\Cases(); $aCount = $case->getListCounters($userUid, array_keys($aTypes)); $response = array(); $i = 0; foreach ($aCount as $type => $count) { $response[$i] = new stdclass(); $response[$i]->item = $aTypes[$type]; $response[$i]->count = $count; $i ++; } echo G::json_encode($response); } function getChilds($menu, $index) { $childs = array(); for ($i = $index; $i < count($menu->Options); $i++) { if ($menu->Types[$i] == 'childNode') { $childs[$menu->Id[$i]] = array( 'label' => $menu->Labels[$i], 'link' => $menu->Options[$i], 'icon' => '' ); } else { //TODO we can add more recursive logic here to enable more childs levels break; } } return array($childs, --$i); }