Browse Source

Testy - popraw ostatni test

Piotr Labudda 11 năm trước cách đây
mục cha
commit
06cca62ee5
4 tập tin đã thay đổi với 162 bổ sung38 xóa
  1. 1 1
      SE/VERSION
  2. 140 29
      SE/procesy/testy.php
  3. 12 5
      SE/se-lib/ProcesMenu.php
  4. 9 3
      SE/se-lib/ProcesTestyHelper.php

+ 1 - 1
SE/VERSION

@@ -1 +1 @@
-3.9.10-1
+3.9.10-2

+ 140 - 29
SE/procesy/testy.php

@@ -43,6 +43,79 @@ function fun_CRM_TESTY_ADD() {
 	App::redirect($redirect, $msg);
 }
 
+function fun_CRM_TESTY__ADD_FIX() {
+	$redirect = "?task=".App::get_task();
+	$msg = '';
+	$sqlObj = new stdClass();
+	$hasErrors = false;
+
+	$sqlObj->ID_TEST_TO_FIX = V::get('test_id', '', $_GET, 'int');
+	if (!$sqlObj->ID_TEST_TO_FIX) {
+		App::add_error("Bledny numer testu!");
+		$hasErrors = true;
+	}
+
+	$db = DB::getDB();
+	if (!$db) {
+		App::add_error("Błąd bazy danych!");
+		$hasErrors = true;
+	}
+
+	$oldTest = $db->get_by_id('CRM_TESTY', $sqlObj->ID_TEST_TO_FIX);
+	if (!$oldTest) {
+		App::add_error("Test do poprawy nie istnieje ({$sqlObj->ID_TEST_TO_FIX}).");
+		$hasErrors = true;
+	}
+
+	$sqlObj->ID_TESTER = User::getID();
+	if ($sqlObj->ID_TESTER != $oldTest->ID_TESTER) {
+		App::add_error("Nie można poprawiać cudzych testów ({$sqlObj->ID_TESTER},{$oldTest->ID_TESTER}).");
+		$hasErrors = true;
+	}
+
+	$sqlObj->ID_PROCES_INIT = $oldTest->ID_PROCES_INIT;
+	$sqlObj->ID_STANOWISKO = $oldTest->ID_STANOWISKO;
+	$sqlObj->TEST_TYPE = $oldTest->TEST_TYPE;
+
+	if (!$hasErrors) {
+		$newId = $db->ADD_NEW_OBJ('CRM_TESTY', $sqlObj);
+
+		if ($newId > 0) {
+			$sql = "insert into `CRM_TESTY_ODPOWIEDZI` (
+					`ID_TEST`
+					, `ID_PYTANIE`
+					, `ODPOWIEDZ`
+					, `ODP_0`
+					, `ODP_1`
+					, `ODP_2`
+					, `ODP_3`
+					, `ODP_4`
+					, `OCENA`
+				)
+				select
+					{$newId} as `ID_TEST`
+					, q.`ID_PYTANIE`
+					, q.`ODPOWIEDZ`
+					, q.`ODP_0`
+					, q.`ODP_1`
+					, q.`ODP_2`
+					, q.`ODP_3`
+					, q.`ODP_4`
+					, 0 as `OCENA`
+				from `CRM_TESTY_ODPOWIEDZI` as q
+				where `ID_TEST`={$sqlObj->ID_TEST_TO_FIX}
+			";
+			$db->query($sql);
+
+			$redirect = "?task=CRM_TEST&test_id={$newId}";// TODO: hide_menu - hide user panel
+			App::add_msg("Rozpocznij test");
+		}
+		else {
+			App::add_error("Error przy dodawaniu rekordu!");
+		}
+	}
+	App::redirect($redirect, $msg);
+}
 
 /**
  * @param $_GET['kandydat_id'] - kandydat id
@@ -467,24 +540,33 @@ function task_CRM_TEST() {
 		return;
 	}
 
-	$test_obj = DB::get_by_id( 'CRM_TESTY', $test_id );
+	$test_obj = DB::get_by_id('CRM_TESTY', $test_id);
 	if (!$test_obj) {
 		echo'<p class="red">'."Wrond ID.".'</p>';
 		return;
 	}
 
-	$stanowisko = DB::get_by_id( 'CRM_LISTA_ZASOBOW', $test_obj->ID_STANOWISKO );
-	$proces = DB::get_by_id( 'CRM_PROCES', $test_obj->ID_PROCES_INIT );
+	$stanowisko = DB::get_by_id('CRM_LISTA_ZASOBOW', $test_obj->ID_STANOWISKO);
+	$proces = DB::get_by_id('CRM_PROCES', $test_obj->ID_PROCES_INIT);
 
-	echo'<p>'."Test procesu ".'<b class="red">'."[".$proces->ID."] ".$proces->DESC.'</b>';
+	echo'<p>'."Test procesu ".'<b class="red">'."[{$proces->ID}] {$proces->DESC}".'</b>';
 		//echo'<br />'.'<em class="silver">'.$proces->OPIS.'</em>';
 	echo'</p>';
-	echo'<p>'."dla stanowiska ".'<b class="green">'."[".$stanowisko->ID."] ".$stanowisko->DESC.'</b>';
+	echo'<p>'."dla stanowiska ".'<b class="green">'."[{$stanowisko->ID}] {$stanowisko->DESC}".'</b>';
 		//echo'<br />'.'<em class="silver">'.$stanowisko->OPIS.'</em>';
 	echo'</p>';
 
 //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">test : ';print_r($test_obj);echo'</pre>';
 
+	$lastTestDate = null;
+	if ($test_obj->ID_TEST_TO_FIX > 0) {
+		$testToFix = DB::get_by_id('CRM_TESTY', $test_obj->ID_TEST_TO_FIX);
+		$lastTestDate = $testToFix->TEST_END;
+		if ($lastTestDate == '0000-00-00 00:00:00') $lastTestDate = $testToFix->TEST_START;
+		if ($lastTestDate == '0000-00-00 00:00:00') $lastTestDate = $testToFix->TEST_INIT;
+		if ($lastTestDate == '0000-00-00 00:00:00') $lastTestDate = null;
+	}
+
 /* 
  * WAITING - nowy test - oczekiwanie na rozpoczecie testu
  * MONITOR - test rozpoczety z data TEST_INIT
@@ -538,6 +620,10 @@ function task_CRM_TEST() {
 
 		foreach ($listFlat as $vItem) {
 			$item = $treeList->getData($vItem->ID);
+			$itemDate = ($item->A_RECORD_UPDATE_DATE)? $item->A_RECORD_UPDATE_DATE : $item->A_RECORD_CREATE_DATE;
+			if ($itemDate > $lastTestDate) {
+				$vItem->changedAfterLastTest = true;
+			}
 
 			if(V::get('DBG_TF', '', $_GET) > 0){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">wskazniki['.$item->ID.'] (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($wskazniki[$item->ID]);echo'</pre>';}
 
@@ -566,13 +652,20 @@ function task_CRM_TEST() {
 		?>
 		<style type="text/css">
 .proces-list-view-image { float:right; padding:0 0 8px 8px; clear:right; }
+.changed-after-last-test { padding-left:10px; border-left:4px solid orange; }
 		</style>
 		<div class="container">
 		<?php foreach ($listFlat as $vItem) {
 			$item = $treeList->getData($vItem->ID);
 			?>
-			<div class="proces-list-item-view">
-				<h4><?php echo $vItem->listNr; ?>. <?php echo $item->DESC; ?> <span class="muted">{<?php echo $item->ID; ?>}</span></h4>
+			<div class="proces-list-item-view<?php if ($vItem->changedAfterLastTest) { echo ' changed-after-last-test'; } ; ?>">
+				<h4>
+					<?php if ($vItem->changedAfterLastTest) : ?>
+						<i class="ico-exclamation-sign" style="background-color:orange;" title="Proces został zmieniony od poprzedniego wykonania testu"></i>
+					<?php endif; ?>
+					<?php echo $vItem->listNr; ?>.
+					<?php echo $item->DESC; ?> <span class="muted">{<?php echo $item->ID; ?>}</span>
+				</h4>
 				<p>
 					<?php if ($item->A_HAS_IMAGE > 0) : ?>
 						<?php $tbl = 'CRM_PROCES'; ?>
@@ -677,23 +770,24 @@ function task_CRM_TEST() {
 		$tree_params['rozwin_opis'] = true;
 		$tree_params['style'] = 'NOWY';
 		$tree_params['TEST_TYPE'] = $test_obj->TEST_TYPE;
+		if ($lastTestDate) $tree_params['lastTestDate'] = $lastTestDate;
 
-		$odpowiedzi = ProcesTestyHelper::get_odpowiedzi( $test_obj->ID, $test_obj->TEST_TYPE );
+		$odpowiedzi = ProcesTestyHelper::get_odpowiedzi($test_obj->ID, $test_obj->TEST_TYPE);
 		foreach ($odpowiedzi as $k_id_proces => $v_odp) {
 			foreach ($v_odp as $k_id_pyt => $v_pyt) {
-				$tree_params[ 'ODP_'.$k_id_pyt ] = $v_pyt->ODPOWIEDZ;
+				$tree_params["ODP_{$k_id_pyt}"] = $v_pyt->ODPOWIEDZ;
 				for ($i = 0; $i < 5; $i++) {
-					$v_pyt_field = "ODP_".$i;
-					$tree_params[ 'ODP_'.$k_id_pyt.'_ODP_'.$i ] = $v_pyt->$v_pyt_field;
+					$v_pyt_field = "ODP_{$i}";
+					$tree_params["ODP_{$k_id_pyt}_ODP_{$i}"] = $v_pyt->$v_pyt_field;
 				}
-				$tree_params[ 'ocena_'.$k_id_pyt ] = $v_pyt->OCENA;
+				$tree_params["ocena_{$k_id_pyt}"] = $v_pyt->OCENA;
 			}
 		}
 
 		if (!empty($_POST)) {
 			foreach ($_POST as $k => $v) {
 				if (substr($k, 0, 4) == 'ODP_') {
-					$tree_params[ $k ] = $v;// overwrite in tree params
+					$tree_params[$k] = $v;// overwrite in tree params
 				}
 			}
 		}
@@ -763,7 +857,7 @@ function task_CRM_TESTY__LIST() {
 	// validate params
 	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']);
 
@@ -772,15 +866,16 @@ function task_CRM_TESTY__LIST() {
 .cell-test_type-praktyczny {background-color:#B3EBFB;}
 		" . '</style>';
 
-		$testy_arr = ProcesTestyHelper::get_testy( $params );
+		$testy_arr = ProcesTestyHelper::get_testy($params);
 		$cols = array();
-		$cols ['ID'] = "ID";
-		$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";
+		$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>';
@@ -1961,16 +2056,32 @@ a.btn-test-praktyczny {background-color:#B3EBFB;}
 }
 
 
-function tree_callback__show_test_item_from_CRM_PROCES( &$r, &$tree ) {
+function tree_callback__show_test_item_from_CRM_PROCES(&$r, &$tree) {
 	$cls = array();
 	$cls = (!empty($cls))? ' class="'.implode(' ', $cls).'"' : '';
 	echo '<dl'.$cls.'>';
 	echo '<dt>';
 
-	echo '<span class="item_id btn-box'.(($r->TYPE == 'PROCES_INIT')? ' btn-box-red' : '').'">'.$r->ID.'</span>';
 
 	$tree_test_type = $tree->get_param('TEST_TYPE');
 
+	$changedAfterLastTest = false;
+	if ($tree->get_param('show_state') == 'items') {
+		$lastTestDate = $tree->get_param('lastTestDate');
+		$itemDate = ($r->A_RECORD_UPDATE_DATE)? $r->A_RECORD_UPDATE_DATE : $r->A_RECORD_CREATE_DATE;
+		$changedAfterLastTest = ($itemDate > $lastTestDate);
+	}
+
+	$outItemClass = '';
+	if ($r->TYPE == 'PROCES_INIT') $outItemClass .= ' btn-box-red';
+	if ($changedAfterLastTest) $outItemClass .= ' changed-after-last-test';
+	?>
+		<span class="item_id btn-box <?php echo $outItemClass; ?>"><?php echo $r->ID; ?></span>
+		<?php if ($changedAfterLastTest) : ?>
+			<i class="ico-exclamation-sign" style="background-color:orange;" title="Proces został zmieniony od poprzedniego wykonania testu"></i>
+		<?php endif; ?>
+		
+	<?php
 	echo' <span class="desc">';
 		if ($tree->get_param('show_state') == 'items') {
 			if ($r->TEST_PYTANIE) {
@@ -1986,23 +2097,23 @@ function tree_callback__show_test_item_from_CRM_PROCES( &$r, &$tree ) {
 	echo'</span>';
 	if ($tree->get_param('show_state') == 'items') {
 		Lib::loadClass('ProcesTestyHelper');
-		$pytania = ProcesTestyHelper::get_pytania_by_proces_id( $r->ID, $tree_test_type );
+		$pytania = ProcesTestyHelper::get_pytania_by_proces_id($r->ID, $tree_test_type);
 		if (!empty($pytania)) {
 			foreach ($pytania as $p) {
 				echo'<br /><span class="desc">'.$p->PYTANIE.'</span> ';
 				// TODO: nazwy pol dla pytan
-				$field = "ODP_".$p->ID;
+				$field = "ODP_{$p->ID}";
 				/**
 				 * ODP_{id_pyt}
 				 * ODP_{id_pyt}_{id_odp} (TAK/NIE)
 				 */
 				$pytanie_otwarte = true;
 				for ($i = 0; $i < 5; $i++) {
-					$odp_field = "ODP_".$i;
+					$odp_field = "ODP_{$i}";
 					if ($p->$odp_field != '') {
 						$pytanie_otwarte = false;
 						echo'<br />'.$p->$odp_field;
-						$field_odpowiedz = $field."_ODP_".$i;
+						$field_odpowiedz = "{$field}_ODP_{$i}";
 						echo' <select name="'.$field_odpowiedz.'">';
 						$options = array("", "TAK", "NIE");
 						foreach ($options as $k) {
@@ -2027,7 +2138,7 @@ function tree_callback__show_test_item_from_CRM_PROCES( &$r, &$tree ) {
 }
 
 
-function tree_callback__show_wynik_item_from_CRM_PROCES( &$r, &$tree ) {
+function tree_callback__show_wynik_item_from_CRM_PROCES(&$r, &$tree) {
 	$cls = array();
 	$cls = (!empty($cls))? ' class="'.implode(' ', $cls).'"' : '';
 	echo '<dl'.$cls.'>';

+ 12 - 5
SE/se-lib/ProcesMenu.php

@@ -3,6 +3,7 @@
 require_once dirname(__FILE__) . '/' . 'Lib.php';
 Lib::loadClass('V');
 Lib::loadClass('User');
+Lib::loadClass('ProcesTestyHelper');
 
 class ProcesMenu {
 
@@ -87,10 +88,10 @@ class ProcesMenu {
 		$testy_arr = array();
 		if ($this->_user_id > 0) {
 			$ses_cache_key = 'CRM_PROCES_USERA_WYKONANE_TESTY-' . $this->_user_id;
+			if ('1' == V::get('_CLEAN_CACHE', '', $_GET)) unset($_SESSION[$ses_cache_key]);// TODO: DBG
 			if (!isset($_SESSION[$ses_cache_key])) {
 				$proces_map = $this->_acl->getUsedProcesMap();
 				if (!empty($proces_map)) {
-					Lib::loadClass('ProcesTestyHelper');
 					$testy_arr = ProcesTestyHelper::get_tetsy_stats($this->_user_id, 0, array_keys($proces_map));// 30000000 => 0
 
 					// check if tests are actual - proces steps may change
@@ -116,9 +117,10 @@ class ProcesMenu {
 							if ($max_update_date) {
 								$max_update_date = substr($max_update_date, 0, 10);
 								$test_end = substr($last_test->TEST_END, 0, 10);
-								//echo '<p>' . "P_INIT($k_proces_id) max_update_date({$max_update_date}) TEST_END({$last_test->TEST_END}) not actual(" . ($max_update_date > $last_test->TEST_END) . ")" . '</p>';
+								echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">'."P_INIT({$k_proces_id}) max_update_date({$max_update_date}) TEST_END({$last_test->TEST_END}) not actual(" . ($max_update_date > $last_test->TEST_END) . ")".' (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($last_test);echo'</pre>';
 								if ($max_update_date > $test_end) {
 									$testy_arr[$last_test->test_ind]->unactual = $max_update_date;
+									$testy_arr[$last_test->test_ind]->unactualId = $last_test->ID;
 								}
 							}
 						}
@@ -181,8 +183,8 @@ class ProcesMenu {
 		while ($r = $db->fetch($res)) {
 			$procesy_init_ids[$r->ID] = $r->DESC;
 		}
-
-		echo '<style type="text/css">' . "
+		?>
+		<style type="text/css">
 .tbl-wyniki-testow {}
  .tbl-wyniki-testow td {vertical-align:top;font-size:small;}
  .tbl-wyniki-testow .proces-box {padding:0 6px;background:#f00;color:#fff;font-weight:bold;font-family:arial;text-decoration:none}
@@ -198,7 +200,8 @@ class ProcesMenu {
  .tbl-wyniki-testow .wynik-IDEALNY .proces-box {background-color:gold;}
  .tbl-wyniki-testow .wynik-NIEAKTUALNY .proces-box {background-color:silver;}
  .tbl-wyniki-testow .row-fluid {margin-bottom:20px;}
-		" . '</style>';
+		</style>
+		<?php
 
 		$userGroups = $this->_acl->fetchGroups();
 		$idZasobowUsera = array_keys($userGroups);
@@ -246,6 +249,9 @@ class ProcesMenu {
 			<?php if ($wynik_unactual) : ?>
 				<div class="alert alert-error">
 					<b>Uwaga! Test nieaktualny:</b>
+					<?php if ($wynik_unactual->unactualId) : ?>
+						<a class="btn btn-mini btn-primary" href="procesy5.php?task=CRM_TESTY__ADD_TEST&function_init=fun_CRM_TESTY__ADD_FIX&test_id=<?php echo $wynik_unactual->unactualId; ?>">popraw</a>
+					<?php endif; ?>
 					<br /><?php echo $wynik_unactual->TEST_END; ?> - zakończenie testu
 					<br /><?php echo $wynik_unactual->unactual; ?> - ostatnia zmiana w procesie
 				</div>
@@ -719,6 +725,7 @@ class ProcesMenu {
 				$x_test = new stdClass();
 				$x_test->TEST_END = substr($v_test->TEST_END, 0, 10);
 				$x_test->unactual = substr($v_test->unactual, 0, 10);
+				$x_test->unactualId = $v_test->unactualId;
 				$this->_wynik_testu_unactual[$v_test->ID_PROCES_INIT][$v_test->TEST_TYPE] = $x_test;
 			}
 		}

+ 9 - 3
SE/se-lib/ProcesTestyHelper.php

@@ -78,6 +78,7 @@ class ProcesTestyHelper {
 		$ret = array();
 		$sql_select = array();
 		$sql_select[] = "t.`ID`";
+		$sql_select[] = "t.`ID_TEST_TO_FIX`";
 		$sql_select[] = "t.`A_STATUS`";
 		$sql_select[] = "t.`A_RECORD_CREATE_DATE`";
 		$sql_select[] = "t.`ID_TESTER`";
@@ -346,13 +347,18 @@ class ProcesTestyHelper {
 		if ($max_age > 0) {
 			$sql_where_arr[] = "UNIX_TIMESTAMP(t.`TEST_END`) > (UNIX_TIMESTAMP(NOW()) - $max_age)";
 		}
-		$sql = "select tbl.*
-			from ( select t.`ID_PROCES_INIT`, t.`OCENA`, t.`A_STATUS`, t.`TEST_TYPE`, t.`TEST_END`
+		$sql = "select MAX(tbl.`ID`) as `ID`
+				, tbl.`ID_PROCES_INIT`
+				, tbl.`OCENA`
+				, tbl.`A_STATUS`
+				, tbl.`TEST_TYPE`
+				, tbl.`TEST_END`
+			from ( select t.`ID`, t.`ID_PROCES_INIT`, t.`OCENA`, t.`A_STATUS`, t.`TEST_TYPE`, t.`TEST_END`
 				from `CRM_TESTY` as t
 				where " . implode("\n and ", $sql_where_arr) . "
 				order by t.`ID` DESC
 			) AS tbl
-			group by tbl.TEST_TYPE, tbl.ID_PROCES_INIT
+			group by tbl.`TEST_TYPE`, tbl.`ID_PROCES_INIT`
 		";
 		$res = $db->query($sql);
 		while ($r = $db->fetch($res)) {