Pārlūkot izejas kodu

added default_objects:UserProcess, updated order by SystemObject and Process, added UserTest route

Piotr Labudda 9 gadi atpakaļ
vecāks
revīzija
380f4c71bc

+ 1 - 1
SE/se-lib/Core/AclHelper.php

@@ -196,7 +196,7 @@ class Core_AclHelper {// Helper class for Acl
     $aclList[] = 'default_objects:SystemObject';// tabele i obiekty możliwe do podłączenia do procesu (default_db/*, default_objects/*)
     // $aclList[] = 'default_objects:UserObject';// TODO: tabele i obiekty widoczne dla aktualnego usera
     $aclList[] = 'default_objects:SystemProcess';// TODO: wszystkie proces init
-    // $aclList[] = 'default_objects:UserProcess';// TODO: proces init przypisane do aktualnego usera
+    $aclList[] = 'default_objects:UserProcess';// TODO: proces init przypisane do aktualnego usera
     $aclList[] = 'default_objects:File';
     $aclList[] = 'default_objects:Korespondencja';
     $aclList[] = 'default_objects:TestPerms';

+ 0 - 41
SE/se-lib/ProcesMenu.php

@@ -22,8 +22,6 @@ class ProcesMenu {
 	var $_acl;
 
 	function __construct() {
-		$this->MENU_SELECT_PROCES_DATA = V::get('MENU_SELECT_PROCES_DATA', null, $_SESSION);// URL
-
 		$this->_user_id = User::getID();
 		if (User::isAdmin()) {
 			$this->_user_id = V::get('_user_id', 0, $_POST, 'int');
@@ -156,22 +154,6 @@ class ProcesMenu {
 		}
 	}
 
-	function set_current_menu($new_menu) {
-		$this->MENU_SELECT_PROCES = $new_menu;
-	}
-
-	/**
-	 * Set $_SESSION['MENU_SELECT_PROCES_DATA'] from $this->MENU_SELECT_PROCES_DATA
-	 */
-	function set_current_menu_data() {
-		$_SESSION['MENU_SELECT_PROCES_DATA'] = array();
-		foreach ($this->MENU_SELECT_PROCES_DATA as $k_ind => $v_arr) {
-			if (!empty($v_arr)) {
-				$_SESSION['MENU_SELECT_PROCES_DATA'][$k_ind] = $v_arr;
-			}
-		}
-	}
-
 	function showMyTestsAction() {
 		$this->menuAction();
 		$userAcl = User::getAcl();
@@ -1249,29 +1231,6 @@ jQuery(document).ready(function() {
 		$this->menuAction();
 	}
 
-	function show_url_menu() {// TODO: raneme; show all tables and actions by selected proces if in proces perm
-		if (isset($_SESSION['MENU_SELECT_PROCES_DATA']['MENU_COLUMN'])) {
-?>
-<div class="btn-group">
-	<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
-		Narzędzia <span class="caret"></span>
-	</a>
-	<ul class="dropdown-menu">
-		<?php foreach ($_SESSION['MENU_SELECT_PROCES_DATA']['MENU_COLUMN'] as $id_zasob => $value_zasob) : ?>
-			<?php if ($value_zasob['TYPE'] == 'URL') : ?>
-				<li>
-					<a href="<?php echo $value_zasob['DESC']; ?>" target="_blank">
-						<?php echo '' . $value_zasob['OPIS'] . ' <em>(' . $value_zasob['DESC'] . ')</em>'; ?>
-					</a>
-				</li>
-			<?php endif; ?>
-		<?php endforeach; ?>
-	</ul>
-</div>
-<?php
-		}
-	}
-
 	function move_test_from_kandydat_to_pracownik($id_kanydata, $id_pracownika) {
 		//4673->4680
 		//$sql='update CRM_TESTY set A_RECORD_CREATE_AUTHOR='smagielm' where A_RECORD_CREATE_AUTHOR='Kandydat.4673';

+ 96 - 0
SE/se-lib/Route/UserTest.php

@@ -0,0 +1,96 @@
+<?php
+
+Lib::loadClass('RouteBase');
+
+class Route_UserTest extends RouteBase {
+
+  public function handleAuth() {
+		if (!User::logged()) {
+			User::authByRequest();
+		}
+	}
+
+  public function defaultAction() {
+    UI::gora();
+    UI::menu();
+    try {
+      $procesMenu = ProcesMenu::getInstance();
+      // $procesMenu->menuAction();// like UI::menu() ?
+      $userAcl = User::getAcl();
+      $procesyInitGroup = $this->getUsedProcesInitGroupedList($userAcl);
+      DBG::nicePrint($procesyInitGroup);
+  		if (empty($procesyInitGroup)) {
+  			echo '<p>' . "Brak przypisanych procesów." . '</p>';
+  			return;
+  		}
+
+    } catch (Exception $e) {
+      UI::alert('danger', $e->getMessage());
+    }
+    UI::dol();
+  }
+
+  public function getUsedProcesInitGroupedList($userAcl) {
+		$procesyInitGroup = array();
+		$procesyInitList = $this->getUserProcesInitList($userAcl);
+		if (empty($procesyInitList)) {
+			return;
+		}
+		$sqlProcesyInitIds = implode(",", array_keys($procesyInitList));
+		$sql = "select p.`ID`, p.`PARENT_ID`, pp.`DESC` as pp__DESC
+			from `CRM_PROCES` as p
+				join `CRM_PROCES` as pp on(pp.`ID`=p.`PARENT_ID`)
+			where p.`ID` in({$sqlProcesyInitIds})
+		";
+		$groupedProcesyInit = array();
+		$db = DB::getDB();
+		$res = $db->query($sql);
+		while ($r = $db->fetch($res)) {
+			if (!array_key_exists($r->PARENT_ID, $procesyInitGroup)) {
+				$procesyInitGroup[$r->PARENT_ID] = (object)array('nr'=>$r->PARENT_ID, 'label'=>$r->pp__DESC, 'sub'=>array());
+			}
+			$procesyInitGroup[$r->PARENT_ID]->sub[$r->ID] = $procesyInitList[$r->ID];
+			$groupedProcesyInit[] = $r->ID;
+		}
+		$ungroupedProcesyInit = array_diff(array_keys($procesyInitList), $groupedProcesyInit);
+		if (!empty($ungroupedProcesyInit)) {
+			$procesyInitGroup[$r->PARENT_ID] = (object)array('nr'=>null, 'label'=>"Pozostałe", 'sub'=>array());
+			foreach ($ungroupedProcesyInit as $nr) {
+				$procesyInitGroup[$r->PARENT_ID]->sub[$nr] = $procesyInitList[$nr];
+			}
+		}
+		return $procesyInitGroup;
+	}
+
+  /**
+	 * List of Proces Init for user (skip filters)
+   * TODO: read from CRM_PROCES_idx_GROUP_to_INIT_VIEW ?
+   * TODO: read from CRM_PROCES_idx_USER_to_INIT_VIEW ? - slow
+   * TODO: read from Schema_UserProcessStorageAcl ? - only for current logged in user
+	 */
+	public function getUserProcesInitList($userAcl) {
+		$userProcesInitList = array();
+		$idUserGroupList = $userAcl->fetchGroups();
+		$sqlIdUserGroupList = implode(",", array_keys($idUserGroupList));
+		$sqlIdProcesListSql = <<<SQL
+			select gi.`ID_PROCES`
+				from `CRM_PROCES_idx_GROUP_to_PROCES` gi
+				where gi.`ID_GROUP` in({$sqlIdUserGroupList})
+SQL;
+		$fetchUserProcesInitListSql = <<<SQL
+			select p.`ID`, p.`DESC`
+				from `CRM_PROCES_idx` i
+					join `CRM_PROCES` p on(p.`ID`=i.`idx_PROCES_INIT_ID`)
+				where i.`ID_PROCES` in({$sqlIdProcesListSql})
+				group by p.`ID`
+				order by p.`SORT_PRIO`
+SQL;
+		$db = DB::getDB();
+		$res = $db->query($fetchUserProcesInitListSql);
+		while ($r = $db->fetch($res)) {
+			$userProcesInitList[$r->ID] = $r->DESC;
+		}
+		return $userProcesInitList;
+	}
+
+}

+ 9 - 0
SE/se-lib/Schema/SystemObjectStorageAcl.php

@@ -33,6 +33,15 @@ class Schema_SystemObjectStorageAcl extends Core_AclSimpleSchemaBase {
     $currSortFlip = strtolower(V::get('order_dir', 'desc', $params));
     // TODO: validate $currSortCol is in field list
     // TODO: validate $currSortFlip ('asc' or 'desc')
+
+    $aliasMap = array();
+    foreach ($this->_simpleSchema['root'] as $key => $field) {
+      if ('@' === substr($key, 0, 1)) continue;
+      $aliasMap[ $key ] = $key;// (!empty($field['@alias'])) ? $field['@alias'] : $key;
+    }
+    // TODO: if (!array_key_exists($currSortCol, $aliasMap)) throw new Exception("field name not allowed to sort");
+    $currSortCol = (array_key_exists($currSortCol, $aliasMap)) ? $aliasMap[$currSortCol] : null;
+
     if (!empty($currSortCol) && ('asc' == $currSortFlip || 'desc' == $currSortFlip)) {
       usort($items, function ($itemA, $itemB) use ($currSortCol, $currSortFlip) {
         $a = strtolower(V::get($currSortCol, '', $itemA));

+ 0 - 1
SE/se-lib/Schema/SystemProcessStorageAcl.php

@@ -46,7 +46,6 @@ class Schema_SystemProcessStorageAcl extends Core_AclSimpleSchemaBase {
     // TODO: validate $currSortCol is in field list
     // TODO: validate $currSortFlip ('asc' or 'desc')
 
-    if ('nazwa' == $currSortCol) $currSortCol = 'DESC';// TODO: @see attribute '@alias' for field 'nazwa'
     $aliasMap = array();
     foreach ($this->_simpleSchema['root'] as $key => $field) {
       if ('@' === substr($key, 0, 1)) continue;

+ 124 - 0
SE/se-lib/Schema/UserProcessStorageAcl.php

@@ -0,0 +1,124 @@
+<?php
+
+Lib::loadClass('Core_AclSimpleSchemaBase');
+Lib::loadClass('ParseOgcFilter');
+
+class Schema_UserProcessStorageAcl extends Core_AclSimpleSchemaBase {
+
+  public $_simpleSchema = [
+    'root' => [
+      '@namespace' => 'default_objects/UserProcess',
+      'ID' => [ '@type' => 'xsd:integer' ],
+      'nazwa' => [ '@type' => 'xsd:string', '@alias' => 'DESC' ],
+      'opis' => [ '@type' => 'xsd:string', '@alias' => 'OPIS' ],
+      'autor' => [ '@type' => 'xsd:string' , '@alias' => 'A_RECORD_CREATE_AUTHOR' ],
+      'utworzono' => [ '@type' => 'xsd:date' , '@alias' => 'A_RECORD_CREATE_DATE' ],
+      'zaktualizował' => [ '@type' => 'xsd:string' , '@alias' => 'A_RECORD_UPDATE_AUTHOR' ],
+      'zaktualizowano' => [ '@type' => 'xsd:date', '@alias' => 'A_RECORD_UPDATE_DATE' ]
+    ]
+  ];
+  public $_rootTableName = 'CRM_PROCES';
+
+  public function getTotal($params = []) {
+    $sqlWhereAnd = $this->_parseSqlWhere($params);
+
+    $idGroupList = $this->_getUserIdGroupList();
+    if (empty($idGroupList)) throw new Exception("Brak przyipsanych grup do użytwkonika");
+    $sqlIdGroupCsv = implode(",", $idGroupList);
+
+    return DB::getPDO()->fetchValue("
+      select count(1) as total
+      from `CRM_PROCES` p
+      where p.`TYPE` = 'PROCES_INIT'
+        and p.`A_STATUS` not in('DELETED', 'OFF_HARD', 'OFF_SOFT')
+        and p.ID in (
+          select gi.ID_PROCES_INIT
+          from `CRM_PROCES_idx_GROUP_to_INIT_VIEW` as gi
+          where gi.ID_GROUP in({$sqlIdGroupCsv})
+        )
+        {$sqlWhereAnd}
+    ");
+  }
+
+  public function _parseSqlWhere($params = []) {
+    $sqlWhereAnd = "";
+    // TODO: parse where/ogc, etc.
+    return $sqlWhereAnd;
+  }
+
+  public function getItems($params = []) {
+    $sqlOrderBy = "";
+    $sqlLimitOffset = "";
+    $sqlWhereAnd = $this->_parseSqlWhere($params);
+
+    $currSortCol = V::get('order_by', 'ID', $params);
+    $currSortFlip = strtolower(V::get('order_dir', 'desc', $params));
+    // TODO: validate $currSortCol is in field list
+    // TODO: validate $currSortFlip ('asc' or 'desc')
+
+    $aliasMap = array();
+    foreach ($this->_simpleSchema['root'] as $key => $field) {
+      if ('@' === substr($key, 0, 1)) continue;
+      $aliasMap[ $key ] = (!empty($field['@alias'])) ? $field['@alias'] : $key;
+    }
+    // TODO: if (!array_key_exists($currSortCol, $aliasMap)) throw new Exception("field name not allowed to sort");
+    $currSortCol = (array_key_exists($currSortCol, $aliasMap)) ? $aliasMap[$currSortCol] : null;
+
+    if (!empty($currSortCol) && ('asc' == $currSortFlip || 'desc' == $currSortFlip)) {
+      $sqlOrderBy = "order by p.`{$currSortCol}` {$currSortFlip}";
+    }
+
+    $limit = V::get('limit', 0, $params);
+    $limit = ($limit < 0) ? 0 : $limit;
+    $offset = V::get('limitstart', 0, $params);
+    $offset = ($offset < 0) ? 0 : $offset;
+    if ($limit > 0) $sqlLimitOffset = "limit {$limit} offset {$offset}";
+
+    $idGroupList = $this->_getUserIdGroupList();
+    if (empty($idGroupList)) throw new Exception("Brak przyipsanych grup do użytwkonika");
+    $sqlIdGroupCsv = implode(",", $idGroupList);
+
+    return DB::getPDO()->fetchAllByKey("
+      select p.ID
+        , p.`DESC` as nazwa
+        , p.`OPIS` as opis
+        , p.A_RECORD_CREATE_AUTHOR as `autor`
+        , p.A_RECORD_CREATE_DATE as `utworzono`
+        , p.A_RECORD_UPDATE_AUTHOR as `zaktualizował`
+        , p.A_RECORD_UPDATE_DATE as `zaktualizowano`
+      from `CRM_PROCES` p
+      where p.`TYPE` = 'PROCES_INIT'
+        and p.`A_STATUS` not in('DELETED', 'OFF_HARD', 'OFF_SOFT')
+        and p.ID in (
+          select gi.ID_PROCES_INIT
+          from `CRM_PROCES_idx_GROUP_to_INIT_VIEW` as gi
+          where gi.ID_GROUP in({$sqlIdGroupCsv})
+        )
+        {$sqlWhereAnd}
+      group by p.ID
+      {$sqlOrderBy}
+      {$sqlLimitOffset}
+    ", 'ID');
+  }
+
+  public function _getUserIdGroupList() {
+    $idUser = User::getID();
+    return array_map(
+      function ($row) {
+        return $row['ID'];
+      }
+      , DB::getPDO()->fetchAll("
+        select z.ID
+        from `CRM_AUTH_PROFILE` as up
+          left join `CRM_LISTA_ZASOBOW` as z on(z.`ID`=up.`ID_ZASOB`)
+        where
+          up.`REMOTE_ID`='{$idUser}'
+          and up.`A_STATUS` in('WAITING', 'NORMAL')
+          and up.`REMOTE_TABLE`='ADMIN_USERS'
+          and z.`ID` is not null
+          and z.`TYPE` in('STANOWISKO','PODMIOT','DZIAL')
+      ")
+    );
+  }
+
+}

+ 4 - 6
SE/se-lib/UI.php

@@ -53,15 +53,13 @@ class UI {
 
 		if (User::hasAccess('menu')) {
 			Lib::loadClass('ProcesMenu');
-
 			$procesMenu = ProcesMenu::getInstance();
 			$procesMenu->show();
 
-			if (!V::get('MENU_INIT', '', $_GET)) {
-				Lib::loadClass('UserActivity');
-				//echo UserActivity::showListInContainer();
-			}
-
+			// if (!V::get('MENU_INIT', '', $_GET)) {
+			// 	Lib::loadClass('UserActivity');
+			// 	//echo UserActivity::showListInContainer();
+			// }
 		}
 		else {
 			UI::loadTemplate('menuLevel6');

+ 1 - 1
SE/se-lib/UserAcl.php

@@ -455,7 +455,7 @@ SQL;
 	/**
 	 * List of Proces Init for user (skip filters)
 	 */
-	public function getUserProcesInitList() {
+	public function getUserProcesInitList() {// TODO: read from CRM_PROCES_idx_GROUP_to_INIT_VIEW?
 		$userProcesInitList = array();
 		$idUserGroupList = $this->fetchGroups();
 		$sqlIdUserGroupList = implode(",", array_keys($idUserGroupList));