Просмотр исходного кода

Acl, Testy: fix missing procedures on test list

Piotr Labudda 10 лет назад
Родитель
Сommit
a920ca42f5
3 измененных файлов с 221 добавлено и 211 удалено
  1. 188 210
      SE/procesy/testy.php
  2. 19 0
      SE/se-lib/ACL.php
  3. 14 1
      SE/se-lib/Route/FixCrmProcesInitIdx.php

+ 188 - 210
SE/procesy/testy.php

@@ -7,22 +7,31 @@ if (!class_exists('Lib')) die('404');
 function fun_CRM_TESTY_ADD() {
 function fun_CRM_TESTY_ADD() {
 	$redirect = "?task=".App::get_task();
 	$redirect = "?task=".App::get_task();
 	$msg = '';
 	$msg = '';
+	App::get_msgs();
 	$sql_obj = new stdClass();
 	$sql_obj = new stdClass();
 
 
-	$sql_obj->ID_PROCES_INIT = V::get('proces_id', '', $_GET, 'int');
-	$sql_obj->ID_STANOWISKO = V::get('stanowisko_id', '', $_GET, 'int');
+	$sql_obj->ID_PROCES_INIT = V::get('proces_id', 0, $_GET, 'int');
+	$sql_obj->ID_STANOWISKO = V::get('stanowisko_id', 0, $_GET, 'int');
 	$sql_obj->TEST_TYPE = V::get('test_type', '', $_GET);
 	$sql_obj->TEST_TYPE = V::get('test_type', '', $_GET);
 	$sql_obj->ID_TESTER = User::getID();
 	$sql_obj->ID_TESTER = User::getID();
 
 
 	// validate
 	// validate
 	$has_errors = false;
 	$has_errors = false;
+	if ($sql_obj->ID_STANOWISKO <= 0) {
+		App::add_error("Bledny numer stanowiska!");
+		$has_errors = true;
+	} else {
+		$redirect .= "&stanowisko_id={$sql_obj->ID_STANOWISKO}";
+	}
 	if ($sql_obj->ID_PROCES_INIT <= 0) {
 	if ($sql_obj->ID_PROCES_INIT <= 0) {
 		App::add_error("Bledny numer procesu!");
 		App::add_error("Bledny numer procesu!");
 		$has_errors = true;
 		$has_errors = true;
 	}
 	}
-	if ($sql_obj->ID_STANOWISKO <= 0) {
-		App::add_error("Bledny numer stanowiska!");
-		$has_errors = true;
+	if ($sql_obj->ID_STANOWISKO > 0 && $sql_obj->ID_PROCES_INIT > 0) {
+		if (!ACL::canGroupViewProces($sql_obj->ID_STANOWISKO, $sql_obj->ID_PROCES_INIT)) {
+			App::add_error("Grupa nie ma dostępu do procesu!");
+			$has_errors = true;
+		}
 	}
 	}
 	if (!in_array($sql_obj->TEST_TYPE, array('TEORETYCZNY', 'PRAKTYCZNY'))) {
 	if (!in_array($sql_obj->TEST_TYPE, array('TEORETYCZNY', 'PRAKTYCZNY'))) {
 		App::add_error("Bledny typ testu!");
 		App::add_error("Bledny typ testu!");
@@ -30,7 +39,8 @@ function fun_CRM_TESTY_ADD() {
 	}
 	}
 
 
 	if (!$has_errors) {
 	if (!$has_errors) {
-		$new_id = DB::ADD_NEW_OBJ( 'CRM_TESTY', $sql_obj );
+		$db = DB::getDB();
+		$new_id = $db->ADD_NEW_OBJ('CRM_TESTY', $sql_obj);
 
 
 		if ($new_id > 0) {
 		if ($new_id > 0) {
 			$redirect = "?task="."CRM_TEST"."&test_id=".$new_id;// TODO: hide_menu - hide user panel
 			$redirect = "?task="."CRM_TEST"."&test_id=".$new_id;// TODO: hide_menu - hide user panel
@@ -574,7 +584,7 @@ function task_CRM_TEST() {
  * OFF_HARD - test oceniony
  * OFF_HARD - test oceniony
  */
  */
 	if ($test_obj->A_STATUS == 'WAITING') {// nowy test - oczekiwanie na rozpoczecie testu
 	if ($test_obj->A_STATUS == 'WAITING') {// nowy test - oczekiwanie na rozpoczecie testu
-		echo App::link("Rozpocznij", array('task'=>App::get_task(), 'function_init'=>'fun_CRM_TEST_EDIT', 'subtask'=>'INIT', 'test_id'=>$test_obj->ID), array('class'=>'btn-p5'));
+		echo App::link("Rozpocznij", array('task'=>App::get_task(), 'function_init'=>'fun_CRM_TEST_EDIT', 'subtask'=>'INIT', 'test_id'=>$test_obj->ID), array('class'=>'btn btn-primary'));
 	}
 	}
 	else if ($test_obj->A_STATUS == 'MONITOR' && $test_obj->TEST_START == '0000-00-00 00:00:00') {// czytanie - test rozpoczety z data TEST_INIT
 	else if ($test_obj->A_STATUS == 'MONITOR' && $test_obj->TEST_START == '0000-00-00 00:00:00') {// czytanie - test rozpoczety z data TEST_INIT
 		$id_proces = $test_obj->ID_PROCES_INIT;
 		$id_proces = $test_obj->ID_PROCES_INIT;
@@ -821,7 +831,7 @@ function task_CRM_TEST() {
 		echo '<p>' . "Test rozpoczeto: " . $test_obj->TEST_START . '</p>';
 		echo '<p>' . "Test rozpoczeto: " . $test_obj->TEST_START . '</p>';
 		echo '<p>' . "Test zakonczono: " . $test_obj->TEST_END . '</p>';
 		echo '<p>' . "Test zakonczono: " . $test_obj->TEST_END . '</p>';
 		echo '<br />';
 		echo '<br />';
-		echo '<p>' . "Rozpocznij nowy " . App::link("TEST", array('task'=>'CRM_TESTY__ADD_TEST')) . '</p>';
+		echo '<p>' . App::link("Rozpocznij nowy test", array('task'=>'CRM_TESTY__ADD_TEST'), array('class'=>'btn btn-primary')) . '</p>';
 	}
 	}
 	else if ($test_obj->A_STATUS == 'OFF_HARD') {// test oceniony
 	else if ($test_obj->A_STATUS == 'OFF_HARD') {// test oceniony
 		echo '<p>' . "Test oceniony na " . $test_obj->OCENA . '</p>';
 		echo '<p>' . "Test oceniony na " . $test_obj->OCENA . '</p>';
@@ -839,11 +849,12 @@ function task_CRM_TESTY__LIST() {
 	}
 	}
 	Lib::loadClass('ProcesTestyHelper');
 	Lib::loadClass('ProcesTestyHelper');
 
 
-	echo '<h1 class="pathway">';
-		echo App::link("Testy", array('task'=>"CRM_TESTY"));
-		echo " &raquo; ";
-		echo App::link("Twoje testy", array('task'=>"CRM_TESTY__LIST"));
-	echo '</h1>';
+		?>
+<ol class="breadcrumb">
+  <li><?php echo App::link("Testy", array('task'=>'CRM_TESTY')); ?></li>
+  <li><?php echo App::link("Twoje testy", array('task'=>'CRM_TESTY__LIST')); ?></li>
+</ol>
+<?php
 
 
 	// aktualne testy pracownika/kandydata
 	// aktualne testy pracownika/kandydata
 	$params = array();
 	$params = array();
@@ -857,35 +868,40 @@ function task_CRM_TESTY__LIST() {
 	if ($params['offset'] < 0) $params['offset'] = 0;
 	if ($params['offset'] < 0) $params['offset'] = 0;
 
 
 	$lista_cnt = ProcesTestyHelper::get_testy_total($params);
 	$lista_cnt = ProcesTestyHelper::get_testy_total($params);
-	if ($lista_cnt > 0) {
-		if ($params['offset'] > $lista_cnt) $params['offset'] = $lista_cnt - ($lista_cnt % $params['limit']);
+	if ($lista_cnt <= 0) {
+		echo '<div class="alert alert-info">' . "Brak testów." . '</div>';
+		return;
+	}
+	if ($params['offset'] > $lista_cnt) $params['offset'] = $lista_cnt - ($lista_cnt % $params['limit']);
 
 
-		echo '<style type="text/css">' . "
+	echo '<style type="text/css">' . "
 .cell-test_type-teoretyczny {background-color:#FFCA9B;}
 .cell-test_type-teoretyczny {background-color:#FFCA9B;}
 .cell-test_type-praktyczny {background-color:#B3EBFB;}
 .cell-test_type-praktyczny {background-color:#B3EBFB;}
-		" . '</style>';
+	" . '</style>';
 
 
-		$testy_arr = ProcesTestyHelper::get_testy($params);
-		$cols = array();
-		$cols['ID'] = "Nr";
-		$cols['ID_TEST_TO_FIX'] = "Nr poprawianego testu";
-		$cols['ID_PROCES_INIT'] = "Proces ID";
-		$cols['Stanowisko'] = "Stanowisko";
-		$cols['TEST_TYPE'] = "Rodzaj testu";
-		$cols['TEST_INIT'] = "Rozpoczeto czytanie";
-		$cols['TEST_START'] = "Rozpoczeto odpowiadanie";
-		$cols['TEST_END'] = "Zakonczono";
-		echo '<table cellspacing="0" cellpadding="0" class="tbl-view" border="1">';
-		echo '<thead>';
-			echo '<tr>';
-			foreach ($cols as $k => $v) {
-				echo '<th>' . $v . '</th>';
-			}
-			echo '<th>' . "&nbsp;" . '</th>';
-			echo '</tr>';
-		echo '</thead>';
-		echo '<tfoot>';
-			echo '<td colspan="' . (count($cols) + 1) . '">';
+	$testy_arr = ProcesTestyHelper::get_testy($params);
+	$cols = array();
+	$cols['ID'] = "Nr";
+	$cols['ID_TEST_TO_FIX'] = "Nr poprawianego testu";
+	$cols['ID_PROCES_INIT'] = "Proces ID";
+	$cols['Stanowisko'] = "Stanowisko";
+	$cols['TEST_TYPE'] = "Rodzaj testu";
+	$cols['TEST_INIT'] = "Rozpoczeto czytanie";
+	$cols['TEST_START'] = "Rozpoczeto odpowiadanie";
+	$cols['TEST_END'] = "Zakonczono";
+?>
+	<table class="table table-bordered table-hover">
+		<thead>
+			<tr>
+				<?php foreach ($cols as $kFieldName => $vLabel) : ?>
+					<th><?php echo $vLabel; ?></th>
+				<?php endforeach; ?>
+				<th></th>
+			</tr>
+		</thead>
+		<tfoot>
+			<td colspan="<?php echo count($cols) + 1; ?>">
+			<?php
 				$page_nav = new stdClass();
 				$page_nav = new stdClass();
 				$page_nav->total = $lista_cnt;
 				$page_nav->total = $lista_cnt;
 				$page_nav->limit = $params['limit'];
 				$page_nav->limit = $params['limit'];
@@ -896,69 +912,64 @@ function task_CRM_TESTY__LIST() {
 				$page_nav->offset_end = floor($lista_cnt / $page_nav->limit) * $page_nav->limit;
 				$page_nav->offset_end = floor($lista_cnt / $page_nav->limit) * $page_nav->limit;
 				$link_params = array('task'=>App::get_task(), '_offset'=>$page_nav->offset_start);
 				$link_params = array('task'=>App::get_task(), '_offset'=>$page_nav->offset_start);
 				if ($kandydat_id > 0) $link_params['kandydat_id'] = $kandydat_id;
 				if ($kandydat_id > 0) $link_params['kandydat_id'] = $kandydat_id;
-				echo App::link("&lt;&lt;", $link_params, array('class'=>'btn-p5'));
+				echo App::link("&lt;&lt;", $link_params, array('class'=>'btn btn-xs btn-default'));
 				$link_params = array('task'=>App::get_task(), '_offset'=>$page_nav->offset_prev);
 				$link_params = array('task'=>App::get_task(), '_offset'=>$page_nav->offset_prev);
 				if ($kandydat_id > 0) $link_params['kandydat_id'] = $kandydat_id;
 				if ($kandydat_id > 0) $link_params['kandydat_id'] = $kandydat_id;
-				echo ' ' . App::link("&lt; -".$page_nav->limit, $link_params, array('class'=>'btn-p5'));
-				echo ' ' . $page_nav->current.' ('.$page_nav->total.') ';
+				echo ' ' . App::link("&lt; -".$page_nav->limit, $link_params, array('class'=>'btn btn-xs btn-default'));
+				echo ' <span class="btn">' . $page_nav->current.' ('.$page_nav->total.')</span> ';
 				$link_params = array('task'=>App::get_task(), '_offset'=>$page_nav->offset_next);
 				$link_params = array('task'=>App::get_task(), '_offset'=>$page_nav->offset_next);
 				if ($kandydat_id > 0) $link_params['kandydat_id'] = $kandydat_id;
 				if ($kandydat_id > 0) $link_params['kandydat_id'] = $kandydat_id;
-				echo ' ' . App::link("+".$page_nav->limit." &gt;", $link_params, array('class'=>'btn-p5'));
+				echo ' ' . App::link("+".$page_nav->limit." &gt;", $link_params, array('class'=>'btn btn-xs btn-default'));
 				$link_params = array('task'=>App::get_task(), '_offset'=>$page_nav->offset_end);
 				$link_params = array('task'=>App::get_task(), '_offset'=>$page_nav->offset_end);
 				if ($kandydat_id > 0) $link_params['kandydat_id'] = $kandydat_id;
 				if ($kandydat_id > 0) $link_params['kandydat_id'] = $kandydat_id;
-				echo ' ' . App::link("&gt;&gt;", $link_params, array('class'=>'btn-p5'));
-			echo '</td>';
-		echo '</tfoot>';
-		$t = 0;
-		echo '<tbody>';
-		if (!empty($testy_arr)) {
-			foreach ($testy_arr as $r) {
-				echo '<tr class="row-' . ($t = 1 - $t) . '">';
-					foreach ($cols as $k => $v) {
-						$cls = '';
-						if ($k == 'TEST_TYPE') {
-							$cls = 'cell-' . strtolower($k) . '-' . strtolower($r->$k);
-						}
-						if ($cls) $cls = ' class="' . $cls . '"';
-						echo '<td' . $cls . '>' . $r->$k . '</td>';
-					}
-					echo '<td>';
-					if ($r->A_STATUS == 'WAITING') {
-						echo App::link("rozpocznij", array('task'=>'CRM_TEST', 'function_init'=>'fun_CRM_TEST_EDIT', 'subtask'=>'INIT', 'test_id'=>$r->ID), array('class'=>'btn-p5'));
-					} else if ($r->A_STATUS == 'MONITOR') {
-						if ($r->TEST_INIT == '0000-00-00 00:00:00') {
-							echo App::link("rozpocznij", array('task'=>'CRM_TEST', 'function_init'=>'fun_CRM_TEST_EDIT', 'subtask'=>'INIT', 'test_id'=>$r->ID), array('class'=>'btn-p5'));
+				echo ' ' . App::link("&gt;&gt;", $link_params, array('class'=>'btn btn-xs btn-default'));
+			?>
+			</td>
+		</tfoot>
+		<tbody>
+			<?php foreach ($testy_arr as $r) : ?>
+			<tr>
+				<?php foreach ($cols as $kFieldName => $vLabel) : ?>
+					<td class="<?php echo ($kFieldName == 'TEST_TYPE')? 'cell-' . strtolower($kFieldName) . '-' . strtolower($r->{$kFieldName}) : ''; ?>">
+						<?php echo $r->{$kFieldName}; ?>
+					</td>
+				<?php endforeach; ?>
+				<td>
+					<?php
+						if ($r->A_STATUS == 'WAITING') {
+							echo App::link("rozpocznij", array('task'=>'CRM_TEST', 'function_init'=>'fun_CRM_TEST_EDIT', 'subtask'=>'INIT', 'test_id'=>$r->ID), array('class'=>'btn btn-xs btn-primary'));
+						} else if ($r->A_STATUS == 'MONITOR') {
+							if ($r->TEST_INIT == '0000-00-00 00:00:00') {
+								echo App::link("rozpocznij", array('task'=>'CRM_TEST', 'function_init'=>'fun_CRM_TEST_EDIT', 'subtask'=>'INIT', 'test_id'=>$r->ID), array('class'=>'btn btn-xs btn-primary'));
+							} else {
+								echo ' ' . App::link("test", array('task'=>'CRM_TEST', 'test_id'=>$r->ID), array('class'=>'btn btn-xs btn-primary'));
+							}
+						} else if ($r->A_STATUS == 'NORMAL') {
+							echo 'Test zakonczono';
+						} else if ($r->A_STATUS == 'OFF_HARD') {
+							// test oceniony
 						} else {
 						} else {
-							echo ' ' . App::link("test", array('task'=>'CRM_TEST', 'test_id'=>$r->ID), array('class'=>'btn-p5'));
+							//echo '{'.$r->A_STATUS.'}';
 						}
 						}
-					} else if ($r->A_STATUS == 'NORMAL') {
-						echo 'Test zakonczono';
-					} else if ($r->A_STATUS == 'OFF_HARD') {
-						// test oceniony
-					} else {
-						//echo '{'.$r->A_STATUS.'}';
-					}
-					echo '</td>';
-				echo '</tr>';
-			}
-			echo '</tbody>';
-			echo '</table>';
-		}
-	}
-	else {
-		echo '<p>' . "Brak testów." . '</p>';
-	}
+					?>
+				</td>
+			</tr>
+			<?php endforeach; ?>
+		</tbody>
+	</table>
+<?php
 }
 }
 
 
 
 
 function task_CRM_TESTY__ADD_KANDYDAT() {
 function task_CRM_TESTY__ADD_KANDYDAT() {
 	Lib::loadClass('ProcesTestyHelper');
 	Lib::loadClass('ProcesTestyHelper');
 
 
-	echo '<h1 class="pathway">';
-		echo App::link("Testy", array('task'=>"CRM_TESTY"));
-		echo " &raquo; ";
-		echo App::link("Dodaj Kandydata i zaloguj się do testów", array('task'=>"CRM_TESTY__ADD_KANDYDAT"));
-	echo '</h1>';
+	?>
+<ol class="breadcrumb">
+  <li><?php echo App::link("Testy", array('task'=>'CRM_TESTY')); ?></li>
+  <li><?php echo App::link("Dodaj Kandydata i zaloguj się do testów", array('task'=>'CRM_TESTY__ADD_KANDYDAT')); ?></li>
+</ol>
+<?php
 
 
 	if (!User::hasAccess('procesy')) {
 	if (!User::hasAccess('procesy')) {
 		echo '<p>' . "Brak uprawnień!" . '</p>';
 		echo '<p>' . "Brak uprawnień!" . '</p>';
@@ -1018,23 +1029,24 @@ function task_CRM_TESTY__ADD_KANDYDAT() {
 function task_CRM_TESTY__ADD_TEST() {
 function task_CRM_TESTY__ADD_TEST() {
 	$arg_stanowisko_id = V::get('stanowisko_id', 0, $_GET, 'int');
 	$arg_stanowisko_id = V::get('stanowisko_id', 0, $_GET, 'int');
 
 
-	echo '<h1 class="pathway">';
-		echo App::link("Testy", array('task'=>"CRM_TESTY"));
-		echo " &raquo; " . App::link("Uruchom nowy test", array('task'=>"CRM_TESTY__ADD_TEST"));
-		if ($arg_stanowisko_id > 0) {
-			echo " &raquo; " . "Testy dla stanowiska [" . $arg_stanowisko_id . "]";
-		}
-	echo '</h1>';
+		?>
+<ol class="breadcrumb">
+  <li><?php echo App::link("Testy", array('task'=>'CRM_TESTY')); ?></li>
+  <li><?php echo App::link("Uruchom nowy test", array('task'=>'CRM_TESTY__ADD_TEST')); ?></li>
+	<?php if ($arg_stanowisko_id > 0) : ?>
+		<li class="active">Testy dla stanowiska [<?php echo $arg_stanowisko_id; ?>]</li>
+	<?php endif; ?>
+</ol>
+<?php
 
 
 	function this_CRM_TESTY_proces($proces, $stanowisko) {
 	function this_CRM_TESTY_proces($proces, $stanowisko) {
-
-		echo'<h1 class="pathway">';
-			echo App::link("Testy", array('task'=>App::get_task()));
-			echo' - ';
-			echo App::link("Testy dla stanowiska ".'<span class="green">'.$stanowisko->DESC.'</span>', array('task'=>App::get_task(), 'stanowisko_id'=>$stanowisko->ID));
-			echo' - ';
-			echo "Testy procesu ".'<span class="red">'.$proces->p__ID.'</span>';
-		echo'</h1>';
+		?>
+<ol class="breadcrumb">
+  <li><?php echo App::link("Testy", array('task'=>App::get_task())); ?></li>
+  <li><?php echo App::link("Testy dla stanowiska ".'<span class="green">'.$stanowisko->DESC.'</span>', array('task'=>App::get_task(), 'stanowisko_id'=>$stanowisko->ID)); ?></li>
+  <li class="active">Testy procesu <span class="red"><?php echo $proces->p__ID; ?></span></li>
+</ol>
+<?php
 
 
 		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">'.$proces->p__ID.': ';print_r($proces);echo'</pre>';
 		//echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">'.$proces->p__ID.': ';print_r($proces);echo'</pre>';
 
 
@@ -1060,119 +1072,73 @@ function task_CRM_TESTY__ADD_TEST() {
 	}
 	}
 
 
 	function this_CRM_TESTY_stanowisko($stanowisko) {
 	function this_CRM_TESTY_stanowisko($stanowisko) {
-		$procesy = array();
-		$db = DB::getDB();
-		$sql = "select
-				w.`ID_PROCES` as w__ID_PROCES
-				, w.`OPIS_ZASOB` as w__OPIS_ZASOB
-				, p.`ID` as p__ID
-				, p.`DESC` as p__DESC
-				, p.`OPIS` as p__OPIS
-				, p_root.`ID` as p_root__ID
-				, p_root.`DESC` as p_root__DESC
-				, p_root.`OPIS` as p_root__OPIS
-			from `CRM_WSKAZNIK` as w
-				left join `CRM_PROCES` as p on (p.`ID`=w.`ID_PROCES`)
-				left join `CRM_PROCES` as p_root on (p_root.`ID`=p.`PARENT_ID`)
-			where
-				w.`ID_ZASOB`={$stanowisko->ID}
-				and w.`A_STATUS` in('WAITING', 'NORMAL')
-		";
-		$res = $db->query($sql);
-		while ($r = $db->fetch($res)) {
-			$procesy[$r->w__ID_PROCES][] = $r;
-		}
+		//TODO: not used?// $idProces = V::get('proces_id', '', $_GET, 'int');
 
 
-		$procesy_init = array();
-		function this_CRM_TESTY_stanowisko_find_proces_init_rec($procesy_id, &$procesy_init, &$pomin_id = array(), $rec_limit = 50) {
-			//echo'<p>'."F.rec(limit:$rec_limit, proces_id:".implode(',', $procesy_id).") ...".'</p>';
-			if ($rec_limit-- <= 0) return;// recursion limit
-
-			foreach ($procesy_id as $id) {
-				$pomin_id[] = $id;
-			}
-
-			$find_procesy_id = array();
+		{// fetch procesy_init for group
+			$procesInitList = array();
 			$db = DB::getDB();
 			$db = DB::getDB();
 			$sql = "select p.`ID`, p.`PARENT_ID`, p.`TYPE`, p.`DESC`, p.`OPIS`, p.`TEST_SORT_PRIO`
 			$sql = "select p.`ID`, p.`PARENT_ID`, p.`TYPE`, p.`DESC`, p.`OPIS`, p.`TEST_SORT_PRIO`
-				from `CRM_PROCES` as p
+				from `CRM_PROCES_idx_GROUP_to_INIT_VIEW` giv
+					join `CRM_PROCES` as p on(p.`ID`=giv.`ID_PROCES_INIT`)
 				where
 				where
-					p.`ID` in(".implode(',', $procesy_id).")
+					giv.`ID_GROUP`='{$stanowisko->ID}'
+				order by p.`TEST_SORT_PRIO` desc, p.`ID` desc
 			";
 			";
 			$res = $db->query($sql);
 			$res = $db->query($sql);
 			while ($r = $db->fetch($res)) {
 			while ($r = $db->fetch($res)) {
-				if ($r->TYPE == 'PROCES_INIT') {
-					$procesy_init[$r->ID] = $r;
-				} else if (!in_array($r->PARENT_ID, $pomin_id)) {
-					$find_procesy_id[] = $r->PARENT_ID;
-				}
-			}
-			if (!empty($find_procesy_id)) {
-				this_CRM_TESTY_stanowisko_find_proces_init_rec($find_procesy_id, $procesy_init, $pomin_id, $rec_limit);
-			}
-		}
-		this_CRM_TESTY_stanowisko_find_proces_init_rec(array_keys($procesy), $procesy_init);
-
-		$proces_id = V::get('proces_id', '', $_GET, 'int');
-		if ($proces_id > 0) {
-			if (!array_key_exists($proces_id, $procesy)) {
-				echo'<div class="box box-red">';
-					echo "Wrong ID";
-				echo'</div>';
-			} else {
-				this_CRM_TESTY_proces(reset($procesy[$proces_id]), $stanowisko);
-				return;
+				$procesInitList[$r->ID] = $r;
 			}
 			}
 		}
 		}
 
 
-		function this_CRM_TESTY_sort_testy_callback($a, $b) {
-			return $b->TEST_SORT_PRIO - $a->TEST_SORT_PRIO;
-		}
-		uasort($procesy_init, 'this_CRM_TESTY_sort_testy_callback');
-
-		echo '<h3>' . "Stanowisko [" . $stanowisko->ID . "]: " . $stanowisko->DESC . '</h3>';
-		echo '<p>' . "Wybierz proces do przetestowania:" . '</p>';
-		if (empty($procesy_init)) {
-			echo '<div class="box box-red">';
+		//if ($idProces > 0) {
+		//	if (!array_key_exists($idProces, $procesInitList)) {
+		//		echo'<div class="alert alert-danger">';
+		//			echo "Wrong ID";
+		//		echo'</div>';
+		//	} else {
+		//		this_CRM_TESTY_proces($procesInitList[$idProces], $stanowisko);
+		//		return;
+		//	}
+		//}
+
+		echo '<h3>' . "Wybierz proces do przetestowania:" . '</h3>';
+		if (empty($procesInitList)) {
+			echo '<div class="alert alert-warning">';
 				echo "Brak danych";
 				echo "Brak danych";
 			echo '</div>';
 			echo '</div>';
 			return;
 			return;
 		}
 		}
-		echo '<style type="text/css">' . "
-.col-btns{text-align:left; vertical-align:top; padding:5px;}
-a.btn-test-teoretyczny {background-color:#FFCA9B;}
-a.btn-test-praktyczny {background-color:#B3EBFB;}
-		" . '</style>';
-		echo '<table border="1" cellspacing="0" cellpadding="0" class="tbl-view">';
-		echo '<thead>';
-		echo '<tr>';
-			echo '<th>' . "PROCES ID" . '</th>';
-			echo '<th style="text-align:left">' . "NAZWA / OPIS" . '</th>';
-			if (V::get('DBG_SORT', 0, $_GET)) echo '<th>SORT</th>';
-		echo '</tr>';
-		echo '</thead>';
-		echo '<tbody>';
-		$t = 0;
-		foreach ($procesy_init as $k_id => $v_proces) {
-			echo '<tr class="row-'.($t = 1 - $t).'">';
-				echo '<th class="col-btns">';
-					echo App::link('<nobr>' . "Start " . $k_id . " (Teoretyczny)" . '</nobr>', array('task'=>App::get_task(), 'function_init'=>'fun_CRM_TESTY_ADD', 'stanowisko_id'=>$stanowisko->ID, 'proces_id'=>$k_id, 'test_type'=>'TEORETYCZNY'), array('class'=>'btn-p5 btn-test-teoretyczny', 'title'=>"Uruchom test teoretyczny dla procesu ".$k_id));
-					echo '<br />';
-					echo '<br />';
-					echo App::link('<nobr>' . "Start " . $k_id . " (Praktyczny)" . '</nobr>', array('task'=>App::get_task(), 'function_init'=>'fun_CRM_TESTY_ADD', 'stanowisko_id'=>$stanowisko->ID, 'proces_id'=>$k_id, 'test_type'=>'PRAKTYCZNY'), array('class'=>'btn-p5 btn-test-praktyczny', 'title'=>"Uruchom test praktyczny dla procesu ".$k_id));
-				echo '</th>';
-				echo '<td>';
-					echo '<p>';
-						echo ' <b>' . $v_proces->DESC . '</b>';
-						echo '<br />';
-						echo '<em>' . $v_proces->OPIS . '</em>';
-					echo '</p>';
-				echo '</td>';
-				if (V::get('DBG_SORT', 0, $_GET)) echo '<td>'.$v_proces->TEST_SORT_PRIO.'</td>';
-			echo '</tr>';
-		}
-		echo '</tbody>';
-		echo '</table>';
+		?>
+		<table class="table table-bordered table-hover">
+			<thead>
+				<tr>
+					<th>Nr procesu</th>
+					<th style="text-align:left">Nazwa / opis</th>
+					<?php if (V::get('DBG_SORT', 0, $_GET)) echo '<th>SORT</th>'; ?>
+				</tr>
+			</thead>
+			<tbody>
+				<?php foreach ($procesInitList as $k_id => $v_proces) : ?>
+				<tr>
+					<td>
+						<a class="btn btn-xs btn-warning"
+							 href="procesy5.php?task=CRM_TESTY__ADD_TEST&function_init=fun_CRM_TESTY_ADD&stanowisko_id=<?php echo $stanowisko->ID; ?>&proces_id=<?php echo $v_proces->ID; ?>&test_type=TEORETYCZNY"
+							 title="Uruchom test teoretyczny dla procesu <?php echo $v_proces->ID; ?>">Start <?php echo $v_proces->ID; ?> (Teoretyczny)</a>
+						<br><br>
+						<a class="btn btn-xs btn-primary"
+							 href="procesy5.php?task=CRM_TESTY__ADD_TEST&function_init=fun_CRM_TESTY_ADD&stanowisko_id=<?php echo $stanowisko->ID; ?>&proces_id=<?php echo $v_proces->ID; ?>&test_type=PRAKTYCZNY"
+							 title="Uruchom test praktyczny dla procesu <?php echo $v_proces->ID; ?>">Start <?php echo $v_proces->ID; ?> (Praktyczny)</a>
+					</td>
+					<td>
+						<b><?php echo $v_proces->DESC; ?></b>
+						<br><em><?php echo $v_proces->OPIS; ?></em>
+					</td>
+					<?php if (V::get('DBG_SORT', 0, $_GET)) echo '<td>'.$v_proces->TEST_SORT_PRIO.'</td>'; ?>
+				</tr>
+				<?php endforeach; ?>
+			</tbody>
+		</table>
+<?php
 	}
 	}
 
 
 	function this_print_tree_rec( $user_menu_tree, &$user_menu, $parent_id = null ) {
 	function this_print_tree_rec( $user_menu_tree, &$user_menu, $parent_id = null ) {
@@ -1254,6 +1220,7 @@ a.btn-test-praktyczny {background-color:#B3EBFB;}
 		where
 		where
 			z.`TYPE`='STANOWISKO'
 			z.`TYPE`='STANOWISKO'
 			{$sqlWhereAdd}
 			{$sqlWhereAdd}
+		order by z.`ID` desc
 	";
 	";
 	$res = $db->query($sql);
 	$res = $db->query($sql);
 	while ($r = $db->fetch($res)) {
 	while ($r = $db->fetch($res)) {
@@ -1279,19 +1246,22 @@ a.btn-test-praktyczny {background-color:#B3EBFB;}
 		$stanowiskaList[$kNr] = "[{$r->ID}] {$r->DESC} {$r->OPIS}";
 		$stanowiskaList[$kNr] = "[{$r->ID}] {$r->DESC} {$r->OPIS}";
 	}
 	}
 	?>
 	?>
-	<p>Wybierz stanowisko do przetestowania:</p>
+	<h3>Wybierz stanowisko do przetestowania:</h3>
 
 
 	<form class="form-horizontal">
 	<form class="form-horizontal">
 		<input type="hidden" name="task" value="<?php echo $taskName; ?>" />
 		<input type="hidden" name="task" value="<?php echo $taskName; ?>" />
 		<div class="form-group">
 		<div class="form-group">
 			<div class="col-sm-10">
 			<div class="col-sm-10">
-				<select class="form-control" name="stanowisko_id">
-					<option value=""> [ wybierz ] </option>
+				<select class="form-control"
+								name="stanowisko_id"
+								size="<?php echo (count($stanowiskaList) > 10)? 20 : 10;?>">
 					<?php foreach ($stanowiskaList as $kNr => $stanowiskoLabel) : ?>
 					<?php foreach ($stanowiskaList as $kNr => $stanowiskoLabel) : ?>
 						<option value="<?php echo $kNr; ?>"><?php echo $stanowiskoLabel; ?></option>
 						<option value="<?php echo $kNr; ?>"><?php echo $stanowiskoLabel; ?></option>
 					<?php endforeach; ?>
 					<?php endforeach; ?>
 				</select>
 				</select>
 			</div>
 			</div>
+		</div>
+		<div class="form-group">
 			<div class="col-sm-2">
 			<div class="col-sm-2">
 				<input class="btn btn-primary" type="submit" value="Wybierz" />
 				<input class="btn btn-primary" type="submit" value="Wybierz" />
 			</div>
 			</div>
@@ -1338,13 +1308,21 @@ function task_CRM_TESTY() {
 	}
 	}
 	$tasks[] = App::link("Uruchom nowy test", array('task'=>"CRM_TESTY__ADD_TEST"), array('class'=>'btn-p5'));
 	$tasks[] = App::link("Uruchom nowy test", array('task'=>"CRM_TESTY__ADD_TEST"), array('class'=>'btn-p5'));
 
 
-	echo '<ol>';
-	foreach ($tasks as $v_task_link) {
-		echo '<li>';
-			echo $v_task_link;
-		echo '</li>';
+	$myTestsLink = App::build_http_query(array('task'=>"CRM_TESTY__LIST"));
+	$newTestLink = App::build_http_query(array('task'=>"CRM_TESTY__ADD_TEST"));
+	$addUserLink = null;
+	if (User::hasAccess('procesy')) {
+		$addUserLink = App::build_http_query(array('task'=>"CRM_TESTY__ADD_KANDYDAT"));
 	}
 	}
-	echo '</ol>';
+	?>
+	<div class="container" style="text-align:center;padding-top:20px">
+		<a class="btn btn-lg btn-info" href="<?php echo $myTestsLink; ?>">Twoje testy</a>
+		<a class="btn btn-lg btn-primary" href="<?php echo $newTestLink; ?>">Uruchom nowy test</a>
+		<?php if ($addUserLink) : ?>
+			<a class="btn btn-lg btn-danger" href="<?php echo $addUserLink; ?>">Dodaj Kandydata i zaloguj się do testów</a>
+		<?php endif; ?>
+	</div>
+<?php
 }
 }
 
 
 
 

+ 19 - 0
SE/se-lib/ACL.php

@@ -148,4 +148,23 @@ SQL;
 		return $map;
 		return $map;
 	}
 	}
 
 
+	public function canGroupViewProces($idGroup, $idProcesInit) {
+		$isAllowed = false;
+		$idProcesInit = (int)$idProcesInit;
+		if (!$idProcesInit) return false;
+		$checkProcesAccessSql = <<<SQL
+			select count(*) as cnt
+				from `CRM_PROCES_idx_GROUP_to_INIT_VIEW` giv
+				where giv.`ID_GROUP` = '{$idGroup}'
+					and giv.`ID_PROCES_INIT` = '{$idProcesInit}'
+SQL;
+		$db = DB::getDB();
+		$res = $db->query($checkProcesAccessSql);
+		if ($r = $db->fetch($res)) {
+			if ($r->cnt > 0) {
+				$isAllowed = true;
+			}
+		}
+		return $isAllowed;
+	}
 }
 }

+ 14 - 1
SE/se-lib/Route/FixCrmProcesInitIdx.php

@@ -561,7 +561,7 @@ SQL;
 				join `CRM_PROCES_idx` i on(i.`ID_PROCES`=gi.`ID_PROCES`)
 				join `CRM_PROCES_idx` i on(i.`ID_PROCES`=gi.`ID_PROCES`)
 				join `CRM_PROCES` p on(p.`ID`=i.`idx_PROCES_INIT_ID`)
 				join `CRM_PROCES` p on(p.`ID`=i.`idx_PROCES_INIT_ID`)
 			where p.`TYPE`='PROCES_INIT'
 			where p.`TYPE`='PROCES_INIT'
-			-- group by u.`ID`, p.`ID`
+			group by u.`ID`, p.`ID`
 SQL;
 SQL;
 		/* Usage - find proces init for user by $userLogin:
 		/* Usage - find proces init for user by $userLogin:
 				SELECT *
 				SELECT *
@@ -569,6 +569,19 @@ SQL;
 				WHERE  `ADM_ACCOUNT` LIKE  '{$userLogin}'
 				WHERE  `ADM_ACCOUNT` LIKE  '{$userLogin}'
 				GROUP BY ID_PROCES_INIT
 				GROUP BY ID_PROCES_INIT
 		*/
 		*/
+		$sqlList['RemoveViewGroupToInit'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_GROUP_to_INIT_VIEW`";
+		$sqlList['InstallViewGroupToInit'] = <<<SQL
+			CREATE VIEW `CRM_PROCES_idx_GROUP_to_INIT_VIEW` AS
+			select concat(gi.`ID_GROUP`, p.`ID`) as ID
+				, p.`ID` as `ID_PROCES_INIT`
+				, p.`DESC` as `DESC`
+				, gi.`ID_GROUP` as `ID_GROUP`
+			from `CRM_PROCES_idx_GROUP_to_PROCES` gi
+				join `CRM_PROCES_idx` i on(i.`ID_PROCES`=gi.`ID_PROCES`)
+				join `CRM_PROCES` p on(p.`ID`=i.`idx_PROCES_INIT_ID`)
+			where p.`TYPE`='PROCES_INIT'
+			group by gi.`ID_GROUP`, p.`ID`
+SQL;
 		$sqlList['RemoveViewTablesInfo'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLES_INFO_VIEW`";
 		$sqlList['RemoveViewTablesInfo'] = "DROP VIEW IF EXISTS `CRM_PROCES_idx_TABLES_INFO_VIEW`";
 		$sqlList['InstallViewTablesInfo'] = <<<SQL
 		$sqlList['InstallViewTablesInfo'] = <<<SQL
 			CREATE VIEW `CRM_PROCES_idx_TABLES_INFO_VIEW` AS
 			CREATE VIEW `CRM_PROCES_idx_TABLES_INFO_VIEW` AS