From 19985dbb8c0aa66dc4bf7905abc1148de909097d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Luka=20=C5=A0ijanec?= Date: Tue, 11 Jan 2022 12:35:47 +0100 Subject: prvi-commit --- .../class/Ajax/AjaxHierarhijaClass.php | 561 +++++ .../Ajax/AjaxHierarhijaDostopUporabnikovClass.php | 243 ++ .../class/Ajax/AjaxSuperSifraClass.php | 69 + .../class/Ajax/AjaxUporabnikiClass.php | 834 +++++++ .../mod_hierarhija/class/HierarhijaAjaxClass.php | 1063 ++++++++ .../class/HierarhijaAnalysisClass.php | 2617 ++++++++++++++++++++ .../mod_hierarhija/class/HierarhijaClass.php | 2261 +++++++++++++++++ .../mod_hierarhija/class/HierarhijaHelper.php | 340 +++ .../mod_hierarhija/class/HierarhijaIzvoz.php | 344 +++ .../class/HierarhijaIzvozAnalize.php | 470 ++++ .../class/HierarhijaKopiranjeClass.php | 418 ++++ .../class/HierarhijaPorocilaClass.php | 321 +++ 12 files changed, 9541 insertions(+) create mode 100644 admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaClass.php create mode 100644 admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaDostopUporabnikovClass.php create mode 100644 admin/survey/modules/mod_hierarhija/class/Ajax/AjaxSuperSifraClass.php create mode 100644 admin/survey/modules/mod_hierarhija/class/Ajax/AjaxUporabnikiClass.php create mode 100644 admin/survey/modules/mod_hierarhija/class/HierarhijaAjaxClass.php create mode 100644 admin/survey/modules/mod_hierarhija/class/HierarhijaAnalysisClass.php create mode 100644 admin/survey/modules/mod_hierarhija/class/HierarhijaClass.php create mode 100644 admin/survey/modules/mod_hierarhija/class/HierarhijaHelper.php create mode 100644 admin/survey/modules/mod_hierarhija/class/HierarhijaIzvoz.php create mode 100644 admin/survey/modules/mod_hierarhija/class/HierarhijaIzvozAnalize.php create mode 100644 admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php create mode 100644 admin/survey/modules/mod_hierarhija/class/HierarhijaPorocilaClass.php (limited to 'admin/survey/modules/mod_hierarhija/class') diff --git a/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaClass.php b/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaClass.php new file mode 100644 index 0000000..5bc9a66 --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaClass.php @@ -0,0 +1,561 @@ +anketa = $anketa; + + //global + global $lang; + global $global_user_id; + $this->lang = $lang; + $this->user_id = $global_user_id; + + return $this; + } + + private static $_instance; + + public static function init($anketa) + { + if (!static::$_instance) + return (new AjaxHierarhija($anketa)); + + return static::$_instance; + } + + /** + * Shranjuje št. in ime nivoja + * + * @return html -> select -> option + */ + public function postNivoji() + { + $nivo = $_POST['nivo']; + $ime = $_POST['ime']; + + // tracking - beleženje sprememb + $this->trackingChanges(); + + sisplet_query("INSERT INTO srv_hierarhija_ravni (anketa_id, user_id, level, ime) VALUES ('" . $this->anketa . "', '" . $this->user_id . "', '" . $nivo . "', '" . $ime . "')"); + $nivo_id = mysqli_insert_id($GLOBALS['connect_db']); + + return $nivo_id; + } + + + /** + * Shranjuje id nivoja, in šifrant za sledeči nivo + * + * @return JSON + */ + public function postSifranti() + { + $idNivoja = $_POST['idNivoja']; + $imeSifranta = $_POST['imeSifranta']; + + // tracking - beleženje sprememb + $this->trackingChanges(); + + // V podatke shranimo samo kadar pošljemo vrednost polja + if (!empty($imeSifranta)) { + $sql_hs = sisplet_query("INSERT INTO srv_hierarhija_sifranti (hierarhija_ravni_id, ime) VALUES ('" . $idNivoja . "', '" . $imeSifranta . "')"); + $this->sqlError($sql_hs); + } + + //izbrišemo šifrante + $sql_vsi_sifranti = sisplet_query("SELECT ime FROM srv_hierarhija_sifranti WHERE hierarhija_ravni_id='" . $idNivoja . "' ORDER BY ime"); + $sifranti = array(); + while ($row = mysqli_fetch_row($sql_vsi_sifranti)) { + $sifranti[] = $row[0]; + } + + // vrnemo json seznam vseh šifrantov za sledeči nivo + return json_encode($sifranti); + } + + /** + * Select box spremeni v ul in ponudi možnost brisanje šifrantov + * + * @return JSON + */ + public function brisiSifrante() + { + $idNivoja = $_POST['idNivoja']; + + //izbrišemo šifrante + $sql_vsi_sifranti = sisplet_query("SELECT * FROM srv_hierarhija_sifranti WHERE hierarhija_ravni_id='" . $idNivoja . "' ORDER BY ime"); + $sifranti = array(); + while ($row = mysqli_fetch_assoc($sql_vsi_sifranti)) { + $sifranti[] = [ + 'id' => $row['id'], + 'ime' => $row['ime'] + ]; + } + + // vrnemo json seznam vseh šifrantov za sledeči nivo + return json_encode($sifranti); + } + + /** + * Delete šifrant + */ + public function izbrisiSifrant() + { + $idSifranta = $_POST['idSifranta']; + + // tracking - beleženje sprememb + $this->trackingChanges(); + + // Najprej preveri, če je v strukturi že uporabljen omenjen šifrant v kolikor je potem ga ne sme dovoliti izbrisati + $sql_result = sisplet_query("SELECT ID FROM srv_hierarhija_struktura WHERE hierarhija_sifranti_id='" . $idSifranta . "'"); + + // V kolkor je kak vpis potem šifrant obstaja, drugače pa ga lahko izbrišemo + if (mysqli_num_rows($sql_result) > 0) { + echo 1; + } else { + //izbriši šifrant + sisplet_query("DELETE FROM srv_hierarhija_sifranti WHERE id='" . $idSifranta . "'"); + } + } + + /** + * Pridobi število že vpisanih nivojev + */ + public function stNnivojev() + { + $sql = sisplet_query("SELECT COUNT(id) FROM `srv_hierarhija_ravni` WHERE anketa_id='" . $this->anketa . "'"); + echo $sql->fetch_row()[0]; + } + + public function obnoviHierarhijo() + { + $hierarhija = (isset($_POST['hierarhija']) ? $_POST['hierarhija'] : null); + $uporabniki = (isset($_POST['uporabniki']) ? $_POST['uporabniki'] : null); + $id_shranjene_strukture = (isset($_POST['id']) ? $_POST['id'] : null); + + // tracking - beleženje sprememb + $this->trackingChanges(); + + // Pobrišemo dosedanjo hierarhijo + $this->izbrisiVseRavni(); + + // preverimo, če je json + if ($this->isJson($hierarhija)) + $hierarhija = $this->isJson($hierarhija, 1); + + $kopiranje = HierarhijaKopiranjeClass::getInstance($this->anketa)->ustvariRavniInSifranteLahkoTudiStrukturo($hierarhija, $id_shranjene_strukture, $uporabniki); + + if ($kopiranje) { + // Vkolikor je bilo kopiranje uspešno shranimo še podatke srv_hierarhija_shrani + + // Pridobimo vse ravni in šifrante, ki smo jih vpisali skupaj z ID-ji; + return json_encode($this->pridobiVseRavniSifrante()); + } + + return 'Napaka pri kopiranju hierarhije'; + } + + // izbriše shranjeno hierarhijo + public function izbrisiHierarhijo() + { + $hierarhija_id = $_POST['id']; + + if (empty($hierarhija_id)) { + echo 'Ni mogoče izbrisati error'; + return false; + } + + // tracking - beleženje sprememb + $this->trackingChanges(); + + // Preverimo, če je omenjena hierarhija že kje uporabljena + $uporabljena_hierarhija = sisplet_query("SELECT id FROM srv_hierarhija_options WHERE option_name='srv_hierarhija_shrani_id' AND option_value='" . $hierarhija_id . "'", "obj"); + + if (empty($uporabljena_hierarhija) || sizeof($uporabljena_hierarhija) == 0) { + $sql = sisplet_query("DELETE FROM srv_hierarhija_shrani WHERE id='" . $hierarhija_id . "'"); + $this->sqlError($sql); + + echo 'success'; + }else{ + echo 'nothing'; + } + + } + + // Uvozi hierarhijo + public function uvoziHierarhijo() + { + $izrisi = '
'; + $izrisi .= '

' . $this->lang['srv_hierarchy_import_code'] . '

'; + $izrisi .= '
'; + $izrisi .= '
' . $this->lang['srv_hierarchy_import_example'] . '
'; + $izrisi .= ' +
+
+ +
+
+ +
+
+ '; + + $izrisi .= '
'; + $izrisi .= '
'; + + // Gumb za zapret popup + $izrisi .= '
'; + $izrisi .= '' . $this->lang['srv_close_profile'] . '' . "\n\r"; + $izrisi .= '
'; + + return $izrisi; + } + + /** + * Pridobimo vse shranjene hierarhije + * + * @return $array + */ + public function seznamVsehShranjenihHierarhij() + { + $sql = sisplet_query("SELECT * FROM srv_hierarhija_shrani WHERE user_id='" . $this->user_id . "'"); + $this->sqlError($sql); + + $data = array(); + if ($sql->num_rows > 0) { + while ($row = $sql->fetch_object()) { + $data[] = [ + 'id' => $row->id, + 'ime' => $row->ime, + 'anketa' => $row->anketa_id, + 'hierarhija' => $row->hierarhija, + 'struktura' => (!is_null($row->struktura) ? 1 : 0), + 'stEvalvirancev' => (!is_null($row->st_uciteljev) ? $row->st_uciteljev : 0), + 'stUporabnikov' => (!is_null($row->st_vseh_uporabnikov) ? $row->st_vseh_uporabnikov : 0) + ]; + } + } + + return $data; + } + + /** + * Aktivno/trenutno hierarhijo shrani v srv_hierarhija_shrani v stringu + */ + public function updateAktivnoHierarhijo() + { + $id = $_POST['id']; + $hierarhija = $_POST['hierarhija']; + + // tracking - beleženje sprememb + $this->trackingChanges(); + + $sql_insert = sisplet_query("UPDATE srv_hierarhija_shrani SET hierarhija='" . $hierarhija . "' WHERE id='" . $id . "' AND anketa_id='" . $this->anketa . "'"); + $this->sqlError($sql_insert); + } + + private function trackingChanges() + { + TrackingClass::update($this->anketa, '21'); + } + + /** + * Pobrišemo vse ravni in nastavitve v podatkovni bazi + */ + public function izbrisiVseRavni() + { + //Pobrišemo vse nastavitve za omenjeno anketo + sisplet_query("DELETE FROM srv_hierarhija_options WHERE anketa_id='" . $this->anketa . "'"); + + sisplet_query("DELETE FROM srv_hierarhija_ravni WHERE anketa_id='" . $this->anketa . "'"); + } + + /** + * Pridobimo seznam vseh ravni skupaj s šifrani in vrnemo v obliki polja + * + * @param $anketa_id ; + * @return array(); + */ + public function pridobiVseRavniSifrante() + { + + $sql = sisplet_query("SELECT id, level, ime, unikaten FROM `srv_hierarhija_ravni` WHERE anketa_id='" . $this->anketa . "'"); + + $polje = array(); + if ($sql->num_rows > 0) { + while ($row = $sql->fetch_object()) { + + //Poiščemo še šifrante za omenjen nivo + $sql_sifranti = sisplet_query("SELECT id, ime FROM `srv_hierarhija_sifranti` WHERE hierarhija_ravni_id='" . $row->id . "' ORDER BY ime"); + $sifranti = array(); + if ($sql_sifranti->num_rows > 0) { + while ($sifrant = $sql_sifranti->fetch_object()) { + $sifranti[] = [ + 'id' => $sifrant->id, + 'ime' => $sifrant->ime + ]; + } + } + + + $polje[] = [ + 'st' => $row->level, + 'ime' => $row->ime, + 'id' => $row->id, + 'unikaten' => $row->unikaten, + 'sifranti' => $sifranti + ]; + } + } + + return $polje; + } + + /** + * Preimenuje ime hierarhije iz seznama hierarhij + */ + public function preimenujHierarhijo() + { + $hierarhija_id = $_POST['id']; + $ime = strip_tags($_POST['ime']); + + // tracking - beleženje sprememb + $this->trackingChanges(); + + if (!empty($ime)) { + $sql = sisplet_query("UPDATE srv_hierarhija_shrani SET ime='" . $ime . "' WHERE id='" . $hierarhija_id . "' AND anketa_id='" . $this->anketa . "'"); + $this->sqlError($sql); + } + } + + /** + * Popravi ime nivoja ali, da je unikaten in se ga lahko uporabi samo 1x , ko je enkrat že vnešeno v bazo + */ + public function postPopraviNivoSsifranti() + { + $id_nivoja = $_POST['id_nivoja']; + $vsebina = $_POST['besedilo']; + $unikaten = $_POST['unikaten']; + + // tracking - beleženje sprememb + $this->trackingChanges(); + + if (!empty($vsebina)) { + sisplet_query("UPDATE srv_hierarhija_ravni SET ime='$vsebina' WHERE id='$id_nivoja' AND anketa_id='" . $this->anketa . "'"); + } + + if (!is_null($unikaten)) { + sisplet_query("UPDATE srv_hierarhija_ravni SET unikaten='$unikaten' WHERE id='$id_nivoja' AND anketa_id='" . $this->anketa . "'"); + } + } + + /** + * Briši cel nivo skupaj s šifranti + * + * @return integer + */ + public function brisiCelNivoSkupajSsifranti() + { + $id_nivoja = $_POST['id_nivoja']; + + // tracking - beleženje sprememb + $this->trackingChanges(); + + # Najprej preverimo, če je za ta nivo že zgrajena hierarhija + $hierarhija = sisplet_query("SELECT * FROM srv_hierarhija_struktura WHERE hierarhija_ravni_id='$id_nivoja'"); + $this->sqlError($hierarhija); + if ($hierarhija->num_rows == 0) { + // sql level + $sql_level = sisplet_query("SELECT level FROM srv_hierarhija_ravni WHERE id='" . $id_nivoja . "'"); + $this->sqlError($sql_level); + + $nivo_brisi = sisplet_query("DELETE FROM srv_hierarhija_ravni WHERE id='" . $id_nivoja . "'"); + $this->sqlError($nivo_brisi); + + //Vse ostale preštevilčimo + $sql_prestevilci = sisplet_query("SELECT id, level FROM `srv_hierarhija_ravni` WHERE anketa_id='" . $this->anketa . "' AND level>'" . $sql_level->fetch_row()[0] . "'"); + if ($sql_prestevilci->num_rows > 0) { + while ($row = $sql_prestevilci->fetch_object()) { + sisplet_query("UPDATE `srv_hierarhija_ravni` SET level='" . ($row->level - 1) . "' WHERE anketa_id='" . $this->anketa . "' AND id='" . $row->id . "'"); + } + } + + + $sql = sisplet_query("SELECT COUNT(id) FROM `srv_hierarhija_ravni` WHERE anketa_id='" . $this->anketa . "'"); + echo $sql->fetch_row()[0]; + } else { + echo 0; + } + } + + /** + * Možnost dodajanja komentarja k hierarhiji + * + * @return html + */ + public function htmlPopUpKomentarKhierarhiji() + { + $shrani_id = (new HierarhijaQuery)->getRowOptions($this->anketa, 'srv_hierarhija_shrani_id'); + if (!is_null($shrani_id)) + $shrani_id = $shrani_id->option_value; + + // Če komenatar že obstaja + $sql_shrani = sisplet_query("SELECT komentar FROM srv_hierarhija_shrani WHERE id='" . $shrani_id . "'"); + $komentar = $sql_shrani->fetch_object()->komentar; + + echo '
'; + echo '

Komentar k hierarhiji

'; + echo '
'; + + echo '
'; + echo ''; + echo '
'; + + echo '
'; + echo '
'; + + // Gumb za zapret popup in potrdit + echo '
'; + echo '' . $this->lang['srv_potrdi'] . '' . "\n\r"; + echo '
'; + + echo '
'; + echo '' . $this->lang['srv_close_profile'] . '' . "\n\r"; + echo '
'; + } + + /** + * Post komentar k hierarhiji + * + * @return integer + */ + public function postKomentarKhierarhiji() + { + // tracking - beleženje sprememb + $this->trackingChanges(); + + $komentar = (!empty($_POST['komentar']) ? $_POST['komentar'] : null); + $shrani_id = (!empty($_POST['id']) ? $_POST['id'] : null); + + if (is_null($shrani_id)) + return 'Ni ID-ja.'; + + sisplet_query("UPDATE srv_hierarhija_shrani SET komentar='" . $komentar . "' WHERE id='" . $shrani_id . "' AND anketa_id='" . $this->anketa . "'"); + + echo 1; + } + + /** + * Prikaži popup za nalaganje logotipa + * + * @return render HTML + */ + public function htmlPopUpUploadLogo() + { + global $site_url; + + $shrani_id = (new HierarhijaQuery)->getRowOptions($this->anketa, 'srv_hierarhija_shrani_id'); + + if (!is_null($shrani_id)) + $shrani_id = $shrani_id->option_value; + + // Če komenatar že obstaja + $logo = sisplet_query("SELECT logo FROM srv_hierarhija_shrani WHERE id='" . $shrani_id . "'", "obj")->logo; + + echo '
'; + echo '

Logotip

'; + echo '
'; + if (!empty($logo)) + echo ''; + + echo '
'; + echo ' +
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ '; + echo '
'; + echo '
'; + echo '
'; + } + + + /** + * Preverimo, če je JSON + * + * @param (string) $string + * @return return true ali error + */ + private function isJson($string, $polje = 0) + { + if (is_string($string)) { + $array = json_decode(stripslashes($string)); + + if (json_last_error() == JSON_ERROR_NONE) { + if ($polje) + return $array; + + return true; + } + } + + return false; + } + + private function sqlError($sql) + { + if (!$sql) { + echo mysqli_error($GLOBALS['connect_db']); + die(); + } + + } + + /** + * Naredi JSON format + * + * @return json response + */ + public function jsonSerialize() + { + return $this->json; + } + +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaDostopUporabnikovClass.php b/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaDostopUporabnikovClass.php new file mode 100644 index 0000000..652cfa9 --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaDostopUporabnikovClass.php @@ -0,0 +1,243 @@ +isAjax()) + return redirect('/admin/survey/'); + } + + public function popupNew($id = null){ + $user = null; + + if(!empty($id)) { + $user = sisplet_query("SELECT id, u.name, u.surname, u.email, d.ustanova, d.aai_email FROM srv_hierarhija_dostop AS d LEFT JOIN users AS u ON u.id=d.user_id WHERE id='".$id."'", "obj"); + + if(empty($user->email)) + $user = null; + } + + global $lang; + echo '
'; + + echo '
'; + if(!empty($user)){ + echo '

Urejanje uporabnika '.$user->name.' ' .$user->surname.' za dostop do SA modula

'; + }else { + echo '

Vpiši uporabnika za dostop do SA modula

'; + } + echo '
'; + + // EMAIL + echo '
'; + echo '
'; + if(!empty($user)){ + echo ''; + }else{ + echo ''; + echo ''; + echo ''; + } + echo '
'; + + // Organizzacija + echo '
'; + echo '
'; + echo ''; + echo '
'; + + // Email za AAI dostop + echo '
'; + echo '
'; + echo ''; + echo '
'; + + echo '
'; + echo '
'; + + // Gumb za zapret popup in potrdit + echo '
'; + echo '
'; + if(!empty($user)) { + echo '' . $lang['srv_potrdi'] . '' . "\n\r"; + }else { + echo '' . $lang['srv_potrdi'] . '' . "\n\r"; + } + echo '
'; + + echo '
'; + echo '' . $lang['srv_close_profile'] . '' . "\n\r"; + echo '
'; + echo '
'; + + echo '
'; + + } + + public function save(){ + $email = (!empty($_POST['email']) ? $_POST['email'] : null); + $user_id = (!empty($_POST['id']) ? $_POST['id'] : null); + $ustanova = (!empty($_POST['ustanova']) ? $_POST['ustanova'] : null); + $aai_email = (!empty($_POST['aai']) ? $_POST['aai'] : null); + + $uporabnik = sisplet_query("SELECT id, email FROM users WHERE email='".$email."'", "obj"); + if($uporabnik->id != $user_id) + return false; + + sisplet_query("INSERT INTO srv_hierarhija_dostop (user_id, dostop, ustanova, aai_email) VALUES ('".$uporabnik->id."', '1', '".$ustanova."', '".$aai_email."')"); + + echo 'success'; + } + + public function update(){ + $user_id = (!empty($_POST['id']) ? $_POST['id'] : null); + $ustanova = (!empty($_POST['ustanova']) ? $_POST['ustanova'] : null); + $aai_email = (!empty($_POST['aai']) ? $_POST['aai'] : null); + + sisplet_query("UPDATE srv_hierarhija_dostop SET ustanova='".$ustanova."' , aai_email='".$aai_email."' WHERE user_id='".$user_id."'"); + + echo 'success'; + } + + public function delete(){ + $user_id = (!empty($_POST['id']) ? $_POST['id'] : null); + + sisplet_query("DELETE FROM srv_hierarhija_dostop WHERE user_id='".$user_id."'"); + } + + public function checkUserEmail(){ + $email = (!empty($_POST['email']) ? $_POST['email'] : null); + + if(!validEmail($email)) { + echo json_encode([ + 'tip' => 'error', + 'sporocilo' => 'Napačen email.' + ]); + + return FALSE; + } + + $uporabnik = sisplet_query("SELECT id, email FROM users WHERE email='".$email."'", "obj"); + + if(empty($uporabnik)) { + echo json_encode([ + 'tip' => 'error', + 'sporocilo' => 'Uporabnika z omenjenim emailom ni v bazi.' + ]); + + return FALSE; + } + + echo json_encode([ + 'tip' => 'success', + 'sporocilo' => 'Email pravilen, ker uporabnik obstaja v bazi.', + 'id' => $uporabnik->id + ]); + } + + public function show(){ + global $lang; + global $global_user_id; + global $admin_type; + + $user_id = (!empty($_POST['id']) ? $_POST['id'] : null); + + if(is_null($user_id)) + return false; + + + echo '
'; + echo '

'.$lang['srv_ankete'].'

'; + + echo ''; + echo '
'; + + $user = sisplet_query("SELECT id, u.name, u.surname, u.email, d.ustanova, d.aai_email, u.type, u.status, DATE_FORMAT(d.created_at, '%d.%m.%Y - %H:%i') AS created, DATE_FORMAT(d.updated_at, '%d.%m.%Y - %H:%i') AS updated FROM srv_hierarhija_dostop AS d LEFT JOIN users AS u ON u.id=d.user_id WHERE user_id='".$user_id."'", "obj"); + + echo '
'; + echo '

'.$lang['user2'].'

'; + echo '

'; + switch ($user->type){ + case 0: + echo $lang['admin_manager']; + break; + case 1: + echo $lang['admin_manager']; + break; + case 2: + echo $lang['admin_clan']; + break; + default: + echo $lang['admin_narocnik']; + } + echo '

'; + echo '

'; + switch ($user->status){ + case 0: + echo $lang['srv_user_banned']; + break; + case 1: + echo $lang['srv_user_notbanned']; + break; + } + echo '

'; + echo '

'.$user->email.'

'; + echo '

'.$user->name.'

'; + echo '

'.$user->surname.'

'; + echo '

'.$user->ustanova.'

'; + echo '

'.$user->aai_email.'

'; + echo '

'.$user->created.'

'; + echo '

'.$user->updated.'

'; + + // Gumb za zapret popup in potrdit + echo '
'; + echo '
'; + echo '' . $lang['srv_close_profile'] . '' . "\n\r"; + echo '
'; + echo '
'; + echo '
'; + + + } + + + /** + * Preverimo, če je ajax request + * + * @return boolean + */ + private function isAjax() + { + if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') + return true; + + return false; + } + +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxSuperSifraClass.php b/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxSuperSifraClass.php new file mode 100644 index 0000000..478094d --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxSuperSifraClass.php @@ -0,0 +1,69 @@ +anketa = $anketa; + + //global + global $lang; + global $global_user_id; + $this->lang = $lang; + $this->user_id = $global_user_id; + + // tracking - beleženje sprememb + TrackingClass::update($this->anketa, '22'); + + return $this; + } + + private static $_instance; + + public static function init($anketa) + { + if (!static::$_instance) + return (new AjaxSuperSifra($anketa)); + + return static::$_instance; + } + + + /** + * Shrani superšifro in prikaži v tabeli + * + * @return + */ + public function shrani() + { + $kode = ((!empty($_POST['kode']) && is_array($_POST['kode'])) ? $_POST['kode'] : null); + + if(is_null($kode)) + return ''; + + $ss = HierarhijaQuery::saveSuperSifra($this->anketa, $kode); + + echo json_encode($ss); + } + + public function getAll() + { + echo json_encode(HierarhijaQuery::vseSuperkodeSpripadajocimiHierarhijami($this->anketa)); + } + +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxUporabnikiClass.php b/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxUporabnikiClass.php new file mode 100644 index 0000000..628977f --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/Ajax/AjaxUporabnikiClass.php @@ -0,0 +1,834 @@ +anketa = $anketa; + + // global variable + global $lang; + global $global_user_id; + $this->lang = $lang; + $this->user_id = $global_user_id; + $this->hierarhija_type = HierarhijaHelper::preveriTipHierarhije($this->anketa); + + return $this; + } + + private static $_instance; + + public static function init($anketa) + { + if (!static::$_instance) + return (new AjaxUporabniki($anketa)); + + return static::$_instance; + } + + /** + * Pridobimo vse celotno strukturo za prikaz v dataTables + * + * @return $array - večdimenzionalni + */ + public function getDataTablesPodatkeZaPrikazTabele() + { + // če je admin + if ($this->hierarhija_type < 5) { + $podatki = (new HierarhijaQuery())->hierarhijaArrayDataTables($this->anketa); + } else { + $hierarhija = (new HierarhijaQuery()); + $uporabnik = $hierarhija->preveriPravicoUporabnika($this->anketa); + $struktura = $hierarhija->poisciHierarhijoNavzgor($uporabnik->struktura_id); + + $podatki = (new HierarhijaQuery())->hierarhijaArrayDataTables($this->anketa, $struktura); + } + + return $podatki; + } + + /** + * Preverimo, če je omenjen šifrant že napisan za ustrezen nivo + * + * @return $array or null + */ + public function preveriVpisSifrantaZaSledeciNivo() + { + $level = $_POST['level']; + $hierarhija_sifranti_id = $_POST['hierarhija_sifranti_id']; + + // Če je parent_id = potem moramo pogledati na prvi nivo IS NULL + if (empty($_POST['parent_id'])) { + $parent = "parent_id IS NULL"; + } else { + $parent = "parent_id='" . $_POST['parent_id'] . "'"; + } + + $sql = sisplet_query("SELECT * FROM srv_hierarhija_struktura WHERE hierarhija_sifranti_id='" . $hierarhija_sifranti_id . "' AND level='" . $level . "' AND " . $parent); + + // imamo zapis v bazi, potem pogledamo še če obstajajo uporabniki + if ($sql->num_rows > 0) { + + $podatki = []; + while ($row = $sql->fetch_object()) { + + $podatki = [ + 'id' => $row->id, + 'level' => $row->level, + 'parent_id' => $row->parent_id, + 'hierarhija_sifranti_id' => $row->hierarhija_sifranti_id + + ]; + + $sql_user = sisplet_query(" + SELECT + users.id as id, + users.email as email, + users.name as name, + users.surname as surname + FROM + srv_hierarhija_struktura_users as u + LEFT JOIN + users ON users.id = u.user_id + WHERE + u.hierarhija_struktura_id = '" . $row->id . "' + "); + + // V kolikor so v bazi uporabniki potem pridobimo vse in zapišemo v polje + if ($sql_user->num_rows > 0) { + while ($user = $sql_user->fetch_object()) { + $podatki['uporabniki'][] = [ + 'id' => $user->id, + 'email' => $user->email, + 'ime' => $user->name, + 'priimek' => $user->surname + ]; + } + } + + } + + return ($podatki); + } + + return 0; + } + + /** + * Posodobimo sifrante za JS tree, če brišemo element iz drevesne strukture + * + * @return array + */ + public function getPosodobiSifranteZaJsTree() + { + $id = $_POST['id']; + + # Pridobimo strukturo navzgor od trenutnega ID-ja za vse šifrante + $nivoji = HierarhijaQuery::posodobiSifranteVrednostiGledeNaTrenutenIdStrukture($id); + + # Pridobimo max st nivojev + $max_st = sisplet_query("SELECT MAX(level) AS max FROM srv_hierarhija_ravni WHERE anketa_id='$this->anketa'")->fetch_object()->max; + + # Preverimo na katerem ID-ju (nivoju) se nahaja uporabnik, ki je kliknil na strukturo + $user_db = HierarhijaOnlyQuery::queryStrukturaUsersLevel($this->anketa, $this->user_id); + if ($user_db->num_rows == 0 && $this->hierarhija_type < 5) { + $nivoji['user'] = [ + 'id_strukture' => 'admin', + 'max_level' => $max_st + ]; + } + + if ($user_db->num_rows > 0) { + $user_db = $user_db->fetch_object(); + $nivoji['user'] = [ + 'id_strukture' => $user_db->struktura_id, + 'level' => $user_db->level, + 'max_level' => $max_st + ]; + } + + return $nivoji; + } + + /** + * Shrani strukturo v bazo (novi šifranti in uporabniki za sledeči nivo + * + * @return string or intiger + */ + public function shraniStrukturoSifrantovInUporabnikov() + { + // tracking - beleženje sprememb + $this->trackingChanges(); + + $vnos = $_POST['vnos']; + $osebe = $_POST['osebe']; + $hierarhija_id = null; + + if (empty($vnos)) + return 0; + + // Najprev shranimo strukturo, da pridobimo id za vpis oseb + foreach ($vnos as $nivo => $vpis) { + // Vpišemo samo nivoje večje od 0, ker post request vsebuje tudi polje 0, ki za naš ni relavanto + + if ($nivo > 0 && is_array($vpis) && empty($vpis['id'])) { + $ravni_id = $vpis['hierarhija_ravni_id']; + $sifrant_id = $vpis['hierarhija_sifranti_id']; + $level = $vpis['level']; + + // Če je prvi nivo potem je parent_id NULL, za vse ostale primere pa moramo met parenta, če naprej v hierarhiji ni parenta potem uporabimo $hierarhija_id - predhodni element vpisa + if ($level == 1) + $parent_id = null; + elseif ($level > 1 && empty($vpis['parent_id'])) + $parent_id = $hierarhija_id; + else + $parent_id = $vpis['parent_id']; + + // Vpis nove strukture, kjer dobimo ID in uporabimo potem za parent id + $hierarhija_id = sisplet_query("INSERT INTO + srv_hierarhija_struktura (anketa_id, hierarhija_ravni_id, parent_id, hierarhija_sifranti_id, level) + VALUES + ('" . $this->anketa . "', '" . $ravni_id . "', " . var_export($parent_id, true) . ",'" . $sifrant_id . "', ' " . $level . "')", "id"); + + // Vpišemo še uporabnike, če obstaja + if (!empty($osebe[$vpis['level']]) && is_array($osebe[$vpis['level']])) { + // Osebe so nanizane v poljih, vsaka oseba je podana preko polja, kjer [ 0 => email, 1=>ime, 2=>priimek], obvezen je samo prvi element + foreach ($osebe[$vpis['level']] as $oseba) { + $this->dodajUporabnikaVbazo($oseba, $hierarhija_id); + } + } + + } elseif ($nivo > 0 && is_array($vpis) && !empty($vpis['id'])) { + // Vpišemo samo uporabnika + if (!empty($osebe[$vpis['level']]) && is_array($osebe[$vpis['level']])) { + // Osebe so nanizane v poljih, vsaka oseba je podana preko polja, kjer [ 0 => email, 1=>ime, 2=>priimek], obvezen je samo prvi element + foreach ($osebe[$vpis['level']] as $oseba) { + $this->dodajUporabnikaVbazo($oseba, $vpis['id']); + } + } + } + } + + // Podatke shranimo še v srv_hierarhija_shrani + (new HierarhijaAjax($this->anketa))->shraniStrukturoHierarhijeVString(); + + return 'success'; + } + + /** + * pridobimo pravice trenutnega uporabnika + * + * level 1 - super admin ima vse pravice, ponavadi je lastnik ankete oz. jo je ustvaril in vključil hierarhijo + * levle 10 - običajni uporabnik, ki je dodan na določen nivo hierarhije + * + * @return array + */ + public function getUserLevelPermission() + { + // vrne polje leve, struktura_id in parent_id + $hierarhija = (new HierarhijaQuery()); + $uporabnik = $hierarhija->preveriPravicoUporabnika($this->anketa); + + if (is_array($uporabnik) && $uporabnik['uporabnik'] == 1) { + echo json_encode($uporabnik); + die(); + } + + $struktura = $hierarhija->poisciHierarhijoNavzgor($uporabnik->struktura_id); + + return [ + 'uporabnik' => $uporabnik, + 'struktura' => $struktura + ]; + } + + /** + * Pridobimo nivoje in šifrane za sledečo raven pri tem če ni super admin ga omejimo + * + * @return array - ['nivoji', 'sifranti', 'maxLevel] + */ + public function getSifrantiZaHierarhijaUserType() + { + if ($this->hierarhija_type < 5) { + // Pridobimo vse ravni in šifrante + $podatki = (new HierarhijaQuery())->getSifrantAdmin($this->anketa); + } else { + // Pridobimo nivo uporabnika, ki se nahaja najvišje v strukturi + $uporabnik = (new HierarhijaQuery())->preveriPravicoUporabnika($this->anketa); + + // Pridobimo vse ravni in šifrante samo od uporabnikovega nivoja/level navzdol + $podatki = (new HierarhijaQuery())->getSifrantAdmin($this->anketa, 999, $uporabnik->level); + } + + // Pridobimo max število nivojev, ki jih lahko vnesemo + $podatki['maxLevel'] = sisplet_query("SELECT MAX(level) as level FROM srv_hierarhija_ravni WHERE anketa_id='" . $this->anketa . "'")->fetch_object()->level; + + return $podatki; + } + + /** + * Dodamo uporabnika v bazo za sledečo strukturo + */ + private function dodajUporabnikaVbazo($oseba, $struktura_id, $last = false) + { + global $pass_salt; + + // Podatki o uporabniku + $email = (is_array($oseba) ? trim($oseba[0]) : $oseba); + $update = false; + + //Iz emaila pridobimo podatke + preg_match('/(\w+)((?:\.)(\w+))?/', $email, $matches); + + $name = !empty($oseba[1]) ? trim($oseba[1]) : ucfirst(mb_strtolower($matches[1])); + + // V kolikor je primek ga + if(!empty($oseba[2])) { + $surname = trim($oseba[2]); + $update = true; + }elseif(!empty($matches[3])){ + $surname = ucfirst(mb_strtolower($matches[3])); + }else{ + $surname = ''; + } + + + if ($email != '' && validEmail($email)) { + $sql_user = sisplet_query("SELECT id FROM users WHERE email='$email'"); + + if (mysqli_num_rows($sql_user) == 0) { + sisplet_query("INSERT INTO users (name, surname, email, pass, type, when_reg, came_from) VALUES ('$name', '$surname', '$email', '" . base64_encode((hash(SHA256, '' . $pass_salt))) . "', '3', DATE_FORMAT(NOW(), '%Y-%m-%d'), '1')"); + $user_id = mysqli_insert_id($GLOBALS['connect_db']); + } else { + $row = mysqli_fetch_array($sql_user); + $user_id = $row['id']; + + // V kolikor smo mi vnesli ime in prrimek potem popravimo tudi v bazi + if($update) + sisplet_query("UPDATE users SET name='".$name."', surname='".$surname."' WHERE id='".$user_id."'"); + } + + // V kolikor smo dodali nov email na zadnji nivo potem samo zamenjamo z obstoječim + if ($last) { + $query = sisplet_query("UPDATE srv_hierarhija_struktura_users SET user_id='" . $user_id . "' WHERE hierarhija_struktura_id='" . $struktura_id . "'"); + } else { + $query = sisplet_query("INSERT INTO srv_hierarhija_struktura_users (hierarhija_struktura_id, user_id) VALUES ('" . $struktura_id . "', '" . $user_id . "')"); + } + if (!$query) echo mysqli_error($GLOBALS['connect_db']); + + // Preverimo, če je uporabnik že dodan in če ni ga nato šele dodamo + $user_search = sisplet_query("SELECT * FROM srv_hierarhija_users WHERE user_id='" . $user_id . "' AND anketa_id='$this->anketa'"); + if ($user_search->num_rows == 0) { + $user_query = sisplet_query("INSERT INTO srv_hierarhija_users (user_id, anketa_id, type) VALUES ('" . $user_id . "', '" . $this->anketa . "', 10)"); + if (!$user_query) echo mysqli_error($GLOBALS['connect_db']); + } + + // Preverimo, če ima uporabnik za omenjeno anketo že pravice in mu nato dodamo pravice + HierarhijaQuery::dostopZaUporabnika($this->anketa, $user_id, 'insert'); + } + + } + + /** + * Pridobi vse uporabnike za določen nivo + * uporablja se prid DataTables edit mode, da izpiše uporabnike pod vsak nivo + * + * @var $id - struktura id + * @return $array + */ + public function pridobiUporabnikeZaDolocenNivoId() + { + // id strukture, da preverimo kateri uporabnikise nahajajo na omenjeni strukturi + $id = $_POST['id']; + + $uporabniki = (new HierarhijaQuery())->pridobiVseUporabnikeZaSpecificnoStrukturo($id); + + if (!is_array($uporabniki) || sizeof($uporabniki) == 0) + return 0; + + //Preverimo max število nivojev/ravni za omenjeno anketo + $max_level = sisplet_query("SELECT MAX(level) AS level FROM srv_hierarhija_ravni WHERE anketa_id='" . $this->anketa . "'")->fetch_object()->level; + + return [ + 'uporabniki' => $uporabniki, + 'maxLevel' => $max_level + ]; + } + + /** + * Shrani uporabnike na določen nivo strukture - pri DataTables edit mode + */ + public function postUporabnikeZaDolocenNivoId() + { + // tracking - beleženje sprememb + $this->trackingChanges(); + + $uporabniki = json_decode(stripslashes($_POST['uporabniki'])); + $struktura_id = $_POST['struktura']; + + if (sizeof($uporabniki) == 0) + return 'uporabnik'; + + // pobrišemo vse že dodane uporabnike + sisplet_query("DELETE FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='" . $struktura_id . "'"); + + // vpišemo nove uporabnike + foreach ($uporabniki as $uporabnik) { + sisplet_query("INSERT INTO srv_hierarhija_struktura_users (hierarhija_struktura_id, user_id) VALUES ('" . $struktura_id . "', '" . $uporabnik . "')"); + } + } + + /** + * Prikaži popup za vnos uporabnikov + * + * @return html + */ + public function getUsersImportPopup(){ + + // tracking - beleženje sprememb + $this->trackingChanges(); + + echo '
'; + echo '

' . $this->lang['srv_hierarchy_import_user_title'] . '

'; + echo '
'; + echo $this->lang['srv_hierarchy_import_user_text']; + + echo '
'; + echo ''; + echo '
'; + echo 'Seznam učiteljev:'; + + $vsi_ucitelji = $this->getAllUserInJson(true); + + if(!empty($vsi_ucitelji)) { + echo '
    '; + foreach($vsi_ucitelji as $ucitelj) { + echo '
  • '.$ucitelj['label'].'
  • '; + } + echo '
'; + } + echo '
'; + echo '
'; + + echo '
'; + echo '
'; + + // Gumb za zapret popup in potrdit + echo '
'; + echo '' . $this->lang['srv_potrdi'] . '' . "\n\r"; + echo '
'; + + echo '
'; + echo '' . $this->lang['srv_close_profile'] . '' . "\n\r"; + echo '
'; + } + + /** + * POST: vnos podatkov za vpis uporabnikov* + */ + public function postImportUsers(){ + $users = (!empty($_POST['users']) ? json_decode(stripslashes($_POST['users'])) : null); + + if(is_null($users)) + return 'null'; + + // Vsakega uporabnika pridobimo v svoj array + $users = explode(PHP_EOL, $users); + + // Pridobimo ID za izbrano shranjeno hierarhijo + $id = HierarhijaQuery::getOptions($this->anketa, 'srv_hierarhija_shrani_id'); + + // Pridobimo podatke od prej, če niso NULL + $ze_vpisani_uporabniki = HierarhijaQuery::getHierarhijaShraniRow($id, 'uporabniki_list'); + + // Če imamo obstoječe upoabnik, jih sedajali nove + $polje = []; + if(!empty($ze_vpisani_uporabniki)) + $polje = unserialize($ze_vpisani_uporabniki); + + foreach($users as $user){ + $user = trim($user); + + $uporabnik = explode(',', $user); + + if(validEmail($uporabnik[0])) { + preg_match('/(\w+)((?:\.)(\w+))?/', $uporabnik[0], $matches); + + $name = ( !empty($uporabnik[1]) ? trim($uporabnik[1]) : ucfirst(mb_strtolower($matches[1])) ); + $surname = ( !empty($uporabnik[2]) ? trim($uporabnik[2]) : ucfirst(mb_strtolower($matches[2])) ); + + $polje[] = [ + 'id' => $user, + 'label' => $name. ' '.$surname.' - ('.$uporabnik[0].')' + ]; + } + } + + sisplet_query("UPDATE srv_hierarhija_shrani SET uporabniki_list='".serialize($polje)."' WHERE id='" . $id . "' AND anketa_id='" . $this->anketa . "'"); + + echo json_encode($polje); + } + + /** + * Pridobimo vse uporabnike + * + * @return json + */ + public function getAllUserInJson($return = false) + { + $id = HierarhijaQuery::getOptions($this->anketa, 'srv_hierarhija_shrani_id'); + $uporabniki = HierarhijaQuery::getHierarhijaShraniRow($id, 'uporabniki_list'); + + if($return) + return unserialize($uporabniki); + + echo json_encode(unserialize($uporabniki)); + } + + + /** + * Pop up obrazec za dodajanje uporabnikov na določen nivo + * + * @return html + */ + public function htmlPopUpDodajUporabnikeZaDolocenNivoId() + { + + // tracking - beleženje sprememb + $this->trackingChanges(); + + $struktura_id = $_POST['struktura']; + $last = $_POST['last']; + + echo '
'; + echo '

' . ($last ? $this->lang['srv_hierarchy_add_new_user_popup_last'] : $this->lang['srv_hierarchy_add_new_user_popup']) . '

'; + echo '
'; + echo($last ? $this->lang['srv_hierarchy_edit_users_last'] : $this->lang['srv_hierarchy_edit_users']); + echo '
'; + if ($last) { + echo ''; + } else { + echo ''; + } + echo '
'; + + echo '
'; + echo '
'; + + // Gumb za zapret popup in potrdit + echo '
'; + echo '' . $this->lang['srv_potrdi'] . '' . "\n\r"; + echo '
'; + + echo '
'; + echo '' . $this->lang['srv_close_profile'] . '' . "\n\r"; + echo '
'; + } + + /** + * Pošlji ID uporabnikov za vpis na strukturo + * + * @return boolean + */ + public function postDodatneUporabnikeNaNivoId() + { + $struktura = $_POST['struktura']; + $uporabniki = $_POST['uporabniki']; + $last = $_POST['last']; + + if (empty($struktura) || empty($uporabniki)) + return false; + + $this->trackingChanges(); + + $uporabniki = json_decode(stripslashes($uporabniki)); + + foreach ($uporabniki as $uporabnik) { + $this->dodajUporabnikaVbazo($uporabnik, $struktura, $last); + } + + return true; + } + + /** + * Kopiraj vrstico iz DataTables v urejanje + * + * @return array $struktura + */ + public function kopirajVrsticoStruktureIzDataTablesVFormo() + { + $idLastStrukture = $_POST['id']; + if (empty($idLastStrukture)) + return false; + + // tracking - beleženje sprememb + $this->trackingChanges(); + + return (new HierarhijaQuery())->poisciHierarhijoNavzgor($idLastStrukture); + } + + /** + * Pop up zamenjaj uporabnika v strukturi + * + * @return html + */ + public function htmlPopUpZamenjajUporabnikaVstrukturi() + { + echo '
'; + echo '
'; + echo '

' . $this->lang['srv_hierarchy_title_find_and_replace_user'] . '

'; + + echo '
'; + echo $this->lang['srv_hierarchy_text_find_and_replace_user']; + + echo '
'; + echo ''; + echo ''; + echo '' . $this->lang['srv_hierarchy_error_wrong_email_format'] . ''; + echo '
'; + + echo '
'; + echo ''; + echo ''; + echo '' . $this->lang['srv_hierarchy_error_wrong_email_format'] . ''; + echo '
'; + + echo '
'; + + echo '
'; + + echo '
'; + + // Gumb za zapret popup in potrdit + echo '
'; + echo '' . $this->lang['srv_potrdi'] . '' . "\n\r"; + echo '
'; + + echo ''; + + echo '
'; + echo '' . $this->lang['srv_close_profile'] . '' . "\n\r"; + echo '
'; + echo '
'; + } + + /** + * testno preveri, kolikokrat bi bil email zamenjan + * + * @return integer + */ + public function getTestnoPreveriStZamenjavEmailVstrukturi() + { + $email_za_zamenjavo = $_POST['find_email']; + + $user = sisplet_query("SELECT id, email FROM users WHERE email='" . $email_za_zamenjavo . "'", "obj"); + + if (sizeof($user) == 0) + return 'Ni v baz'; + + // Pridobimo uporabnika samo na zadnjem nivoju + $users_upravicen_do_evalvacije = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND users.id="' . $user->id . '" AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ')'); + + if (mysqli_num_rows($users_upravicen_do_evalvacije) > 0) { + echo mysqli_num_rows($users_upravicen_do_evalvacije); + } else { + echo 0; + } + } + + /** + * Briši uporabnika iz strukture pri DataTables pogledu oz. če je že vpisan v bazo + */ + public function brisiUporabnikaIzStrukture() + { + // tracking - beleženje sprememb + $this->trackingChanges(); + + if (empty($_POST['uporabnik_id']) || !is_numeric($_POST['uporabnik_id']) || empty($_POST['struktura_id'])) { + echo 'Ni mogoče'; + return false; + } + + $uporabnik_id = $_POST['uporabnik_id']; + $struktura_id = $_POST['struktura_id']; + + // Uporabnika najprej izbrišemo iz strukture hierarhije + $sql_user = sisplet_query("DELETE FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='" . $struktura_id . "' AND user_id='" . $uporabnik_id . "'"); + $this->sqlError($sql_user); + + // Preverimo, če je uporabnik še kje drugje dodan v hierarhiji, drugače ga moramo odstraniti še iz srv_hierarhija_users, da nima dostopa do ankete ob aktivaciji in tudi da ne prejme emaila za dostop + $this->preveriCeJeUporabnikPrisotenSeKjeVStrukturi($uporabnik_id); + } + + /** + * Zamenjaj email uporabnika v strukturi z novim emailom + * + * @param + * @return + */ + public function postZamenjajEmailVstrukturi() + { + // tracking - beleženje sprememb + $this->trackingChanges(); + + $find_email = $_POST['find_email']; + $replace_email = $_POST['replace_email']; + + // Validacija, če email obstaja + if (empty($find_email) && !validEmail($find_email) || empty($replace_email) && !validEmail($replace_email)) + return 'Manjka email'; + + // Poiščemo ID uporabnika + $user = sisplet_query("SELECT id, email FROM users WHERE email='" . $find_email . "'", "obj"); + + // Pridobimo uporabnika samo na zadnjem nivoju + $users_upravicen_do_evalvacije = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND users.id="' . $user->id . '" AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ')'); + + // Dodamo novega uporabnika v + if (mysqli_num_rows($users_upravicen_do_evalvacije) > 0) { + while ($evalviranec = $users_upravicen_do_evalvacije->fetch_object()) { + $this->dodajUporabnikaVbazo($replace_email, $evalviranec->id, true); + } + } + + // Preverimo, če je uporabnik, ki smo ga želeli zamenjati prisoten še kje + $this->preveriCeJeUporabnikPrisotenSeKjeVStrukturi($user->id); + + return 1; + } + + /** + * Briši element vhiertarhiji, ki se prikaže v data tables ali jstree + * + * @param + * @return + */ + public function brisiZadnjiElementVstrukturiHierarhije() + { + $id = $_POST['id']; + + #V kolikor je anketa aktivna potem brisanje ni več možno + if (SurveyInfo::getSurveyModules('hierarhija') == 2) + return 2; + + + // tracking - beleženje sprememb + $this->trackingChanges(); + + # Omenjen Id je tudi parent id, zato brisanje ni mogoče + $parent_obstaja = sisplet_query("SELECT id, parent_id FROM srv_hierarhija_struktura WHERE parent_id='$id'"); + if ($parent_obstaja->num_rows > 0) { + echo 'obstaja'; + die(); + } + +// # Pridobimo vse ID strukture hierarhije, ki so pod to drevesno strukturo, da lahko potem izbrišemo vse te elemente +// $el = (new HierarhijaQuery())->pridobiIdStruktureDoKonca($id, $this->anketa); +// # Dodamo naš $id in sortiramo po zadnjih elementih, ter brišemo hierarhijo od spodaj navzgor. Do našega ID-ja +// array_push($el, $id); +// rsort($el); + + + # Preverimo, če je bil dodan uporabnik na to strukturo + $user_id = sisplet_query("SELECT user_id FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='" . $id . "'", "obj"); + + # Izbrišemo uporabnika, ki je bil pri določeni strukturi v hierarhiji + $sql_us = sisplet_query("DELETE FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='" . $id . "'"); + $this->sqlError($sql_us); + + // V kolikor je bil dodan uporabnik na strukturo potem tudi odstranimo vse pravice tega uporabnika, če ga ni več v strukturi + if (!is_null($user_id)) + $this->preveriCeJeUporabnikPrisotenSeKjeVStrukturi($user_id->user_id); + + # Izbrišemo strukturo + $sql_hi = sisplet_query("DELETE FROM srv_hierarhija_struktura WHERE id='" . $id . "' AND anketa_id='" . $this->anketa . "'"); + $this->sqlError($sql_hi); + + # Pobriši opcijo, če ni več strukture + $st_vpisov = sisplet_query("SELECT COUNT(ID) as vsota FROM srv_hierarhija_struktura WHERE anketa_id='" . $this->anketa . "'", "obj"); + if ($st_vpisov->vsota == 0) + (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, 'vpisana_struktura', null, true); + } + + /** + * Shrani hierarhijo in prido ID polja v bazi + * + * @return integer + */ + public function shraniHierarhijo() + { + $ime = $_POST['ime']; + + // Za decoding je potrebno json_decode(stripslashes($_POST['hierarhija'])), za shranjevanje v bazo pustomo kar json format + $hierarhija = $_POST['hierarhija']; + + echo sisplet_query("INSERT INTO srv_hierarhija_shrani (anketa_id, user_id, ime, hierarhija) VALUES ('$this->anketa', '$this->user_id','$ime', '$hierarhija')", "id"); + } + + /** + * Preverimo, če je user id prisoten še kje v strukturi, v kolikor ga ni potem odstranimo pravice dostopa do ankete in strukture + * + * @param $user_id + * @return boolean + */ + private function preveriCeJeUporabnikPrisotenSeKjeVStrukturi($user_id) + { + $uporabnik_db = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND users.id="' . $user_id . '"'); + + // Uporabnik je še prisoten + if (mysqli_num_rows($uporabnik_db) > 0) + return true; + + // Uporabnik ni prisoten in odstranimo vse pravice za dostop do ankete in hierarhije + // Preverimo, če je uporabnik med privilegiji za dostop do hierarhije + $user_search = sisplet_query("SELECT id FROM srv_hierarhija_users WHERE user_id='" . $user_id . "' AND anketa_id='" . $this->anketa . "' AND type='10'", 'obj'); + if (sizeof($user_search) > 0) + sisplet_query("DELETE FROM srv_hierarhija_users WHERE id='" . $user_search->id . "'"); + + + // Preverimo, če ima uporabnik ima pravice za dostop do ankete in potem tudi to odstranimo + HierarhijaQuery::dostopZaUporabnika($this->anketa, $user_id, 'delete'); + + return false; + } + + private function trackingChanges() + { + TrackingClass::update($this->anketa, '22'); + } + + private function sqlError($sql) + { + if (!$sql) { + echo mysqli_error($GLOBALS['connect_db']); + die(); + } + + } + + +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/HierarhijaAjaxClass.php b/admin/survey/modules/mod_hierarhija/class/HierarhijaAjaxClass.php new file mode 100644 index 0000000..0ed3956 --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/HierarhijaAjaxClass.php @@ -0,0 +1,1063 @@ +anketa = $anketa; + + if (!(new Dostop())->checkDostop($this->anketa)) + return false; + + if (!$this->isAjax()) + return redirect('/admin/survey/'); + + global $lang; + global $global_user_id; + global $site_url; + $this->lang = $lang; + $this->user_id = $global_user_id; + $this->hierarhija_type = HierarhijaHelper::preveriTipHierarhije($this->anketa); + $this->site_url = $site_url; + + } + + /** + * Preverimo, če je ajax request + * + * @return boolean + */ + private function isAjax() + { + if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') + return true; + + return false; + } + + //AJAX POST requesti + public function ajax() + { + // Preverimo ustreznost ankete + if ($_GET['a'] == 'preveri-ustreznost-ankete') + return $this->preveriUstreznostCeJePrimernaZaHierarhijo(); + + if ($_GET['a'] == 'get-all-hierarchy-library') + return $this->pridobiVseAnketeKiSoVknjizniciZaHierarhijo(); + + + /********* HIERARHIJA UREJANJE **************/ + /** + * Shranjuje št. in ime nivoja + * + * @return html -> select -> option + */ + if ($_GET['a'] === 'post_nivoji') + echo AjaxHierarhija::init($this->anketa)->postNivoji(); + + /** + * Shranjuje id nivoja, in šifrant za sledeči nivo + * + * @return JSON + */ + if ($_GET['a'] === 'post_sifranti') + echo AjaxHierarhija::init($this->anketa)->postSifranti(); + + /** + * Select box spremeni v ul in ponudi možnost brisanje šifrantov + * + * @return JSON + */ + if ($_GET['a'] === 'brisi_sifrante') + echo AjaxHierarhija::init($this->anketa)->brisiSifrante(); + + /** + * Delete šifrant + */ + if ($_GET['a'] === 'izbrisi_sifrant') + return AjaxHierarhija::init($this->anketa)->izbrisiSifrant(); + + /** + * Pridobi število že vpisanih nivojev + */ + if ($_GET['a'] === 'st_nivojev') { + $sql = sisplet_query("SELECT COUNT(id) FROM `srv_hierarhija_ravni` WHERE anketa_id='" . $this->anketa . "'"); + echo $sql->fetch_row()[0]; + } + + /** + * Popravimo ime nivoja v bazi + */ + if ($_GET['a'] == 'popravi_nivo_hierarhija') + return AjaxHierarhija::init($this->anketa)->postPopraviNivoSsifranti(); + + /** + * Briši nivo v hierarhiji preko AJAX ukaza + */ + if ($_GET['a'] == 'brisi_nivo_hierarhija') + return AjaxHierarhija::init($this->anketa)->brisiCelNivoSkupajSsifranti(); + + if ($_GET['a'] === 'json_nivoji_podatki') { + echo json_encode(AjaxHierarhija::init($this->anketa)->pridobiVseRavniSifrante()); + } + + // Komentar k izbrani hierarhiji + if ($_GET['a'] == 'komentar-k-hierarhiji') { + if ($_GET['m'] == 'get') + return AjaxHierarhija::init($this->anketa)->htmlPopUpKomentarKhierarhiji(); + + if ($_GET['m'] == 'post') + return AjaxHierarhija::init($this->anketa)->postKomentarKhierarhiji(); + } + + // Naloži logo kj hierarhiji + if ($_GET['a'] == 'upload-logo') { + if ($_GET['m'] == 'get') + return AjaxHierarhija::init($this->anketa)->htmlPopUpUploadLogo(); + + if ($_GET['m'] == 'delete') + return Hierarhija::brisiLogo($this->anketa); + } + /********* END HIERARHIJA UREJANJE **************/ + + + /***************************** HIERARHIJA UPORABNIKI ***********************/ + //Brišemo iz DataTables ali JsTree + if ($_GET['a'] == 'brisi_element_v_hierarhiji') + echo AjaxUporabniki::init($this->anketa)->brisiZadnjiElementVstrukturiHierarhije(); + + // Pridobimo podatke o sifrantih iz baze + if ($_GET['a'] == 'posodobi_sifrante') + echo json_encode(AjaxUporabniki::init($this->anketa)->getPosodobiSifranteZaJsTree()); + + /** + * Shranimo hierarhijo + */ + if ($_GET['a'] == 'shrani_hierarhijo') + return AjaxUporabniki::init($this->anketa)->shraniHierarhijo(); + + + /** + * Shrani strukturo hierarhije v tabelo srv_hierarhija_shrani + * + * @param (int) shrani + * @param (int) id + */ + if ($_GET['a'] == 'shrani-strukturo-hierarhije') { + if ($_POST['id'] != $this->anketa && empty($_POST['shrani'])) + return 'Ni shranjeno'; + + // tracking - beleženje sprememb + $this->trackingChanges(); + + $this->shraniStrukturoHierarhijeVString(); + } + + /** + * Vrnemo JSON podatke hierarhije za jsTree + */ + if ($_GET['a'] == 'json_jstree') { + $struktura = (new HierarhijaQuery())->json_jstree($this->anketa); + + echo json_encode($struktura); + } + + /** + * Podatki, ko nalagamo prvi element hierarhije + */ + if ($_GET['a'] == 'json_jstree_first_level') { + $hierarhija = (new HierarhijaOnlyQuery())->queryStruktura($this->anketa, null, ' AND parent_id IS NULL')->fetch_object(); + + echo '

Hierarhija

'; + echo '' . $hierarhija->ravni_ime; + if ($this->hierarhija_type > 4) + echo ' - ' . $hierarhija->sifrant_ime; + echo ': '; + } + + /** + * Update hierarhije, ki je trenutno aktivna + */ + if ($_GET['a'] == 'update-aktivno-hierarhijo') + return AjaxHierarhija::init($this->anketa)->updateAktivnoHierarhijo(); + + + if ($_GET['a'] == 'json_shranjene_hierarhije') + echo json_encode(AjaxHierarhija::init($this->anketa)->seznamVsehShranjenihHierarhij()); + + // vse nastavitve povezane s hierarhijo + if ($_GET['a'] == 'hierarhija-options') { + + if ($_GET['m'] == 'get') { + if (!empty($_POST['option_name'])) { + echo (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, $_POST['option_name'], null, null, false); + return ''; + } + + return json_encode((new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa)); + } + + if ($_GET['m'] == 'save') { + $option = $_POST['option_name']; + $value = (!empty($_POST['option_value']) ? $_POST['option_value'] : 'false'); + + // tracking - beleženje sprememb + $this->trackingChanges(); + + if (!empty($option)) + (new HierarhijaQuery())->saveHierarhijaOptions($this->anketa, $option, $value); + } + } + + // pridobimo hierarhijo iz JSON in pobrišemo staro ali pa samo dopišemo nove nivoje in šifrante + if ($_GET['a'] == 'obnovi-hierarhijo') + echo AjaxHierarhija::init($this->anketa)->obnoviHierarhijo(); + + + // izbriše shranjeno hierarhijo + if ($_GET['a'] == 'izbrisi-hierarhijo') + return AjaxHierarhija::init($this->anketa)->izbrisiHierarhijo(); + + + // izbriši trenutno shranjene ravni + if ($_GET['a'] == 'izbrisi_vse_ravni') { + // tracking - beleženje sprememb + $this->trackingChanges(); + return AjaxHierarhija::init($this->anketa)->izbrisiVseRavni(); + } + + // preimenuj hierarhijo + if ($_GET['a'] == 'preimenuj-hierarhijo') { + $this->trackingChanges(); + return AjaxHierarhija::init($this->anketa)->preimenujHierarhijo(); + } + + // Uvoz hierarhije + if ($_GET['a'] == 'uvozi-hierarhijo') + echo AjaxHierarhija::init($this->anketa)->uvoziHierarhijo(); + + + // pridobimo celotno strukturo šifrantov za prikaz v tabeli + if ($_GET['a'] == 'get-datatables-data') { + $polje = [ + 'data' => AjaxUporabniki::init($this->anketa)->getDataTablesPodatkeZaPrikazTabele() + ]; + + echo json_encode($polje); + } + + // Ukazi za brisanje + if ($_GET['a'] == 'brisi') { + // Briši uporabnika iz baze srv_hierarhija_struktura_users in srv_hierarhija_users (tukaj ima pravico do ankete) + if ($_GET['m'] == 'uporabnika') + return AjaxUporabniki::init($this->anketa)->brisiUporabnikaIzStrukture(); + + } + + // pridobimo podatke iz srv_hierarhija_shrani + if ($_GET['a'] == 'pridobi-shranjeno-hierarhijo-bool') { + $id = (!empty($_POST['id']) ? $_POST['id'] : null); + $polje = (!empty($_POST['polje']) ? $_POST['polje'] : null); + + if (is_null($id)) + return ''; + + $polje = HierarhijaQuery::getHierarhijaShraniRow($id, $polje); + + + echo(!is_null($polje) ? 1 : 0); + } + + + /** + * Gradnja hierarhije + */ + if ($_GET['a'] == 'gradnja-hierarhije') { + /** + * Uvoz uporabnikov preko tekstovnega polaj + */ + if ($_GET['m'] == 'import-user') { + // PPrikaži popup za uvoz uporabnikov + if ($_GET['s'] == 'get') + return AjaxUporabniki::init($this->anketa)->getUsersImportPopup(); + + if ($_GET['s'] == 'getAll') + return AjaxUporabniki::init($this->anketa)->getAllUserInJson(); + + // Pošlji podatke za shranjevanje + if ($_GET['s'] == 'post') + return AjaxUporabniki::init($this->anketa)->postImportUsers(); + } + + + /** + * Preveri pravice uporabnika in v kolikor ni admin tudi njegove nivoje, ki so nad njim + * + * Preveri, če gre za admina in v tem primeru vrne samo uporabnik=1, drugače vrne objekt s podatki o levele, parent_id, struktura_id + * @return json + */ + if ($_GET['m'] == 'get-user-level') + echo json_encode(AjaxUporabniki::init($this->anketa)->getUserLevelPermission()); + + + /** + * Pridobimo nivoje in šifrane za sledečo raven, vrenomo polje ['nivoji', 'sifranti'] + * + * @return json + */ + if ($_GET['m'] == 'get-sifranti') + echo json_encode(AjaxUporabniki::init($this->anketa)->getSifrantiZaHierarhijaUserType()); + + + /** + * Preveri, če je omenjen šifrant že napisan na nivo in če je pridobi podatke o uporabnikih + * @return json object + */ + if ($_GET['m'] == 'preveri-sifrant-za-nivo') + echo json_encode(AjaxUporabniki::init($this->anketa)->preveriVpisSifrantaZaSledeciNivo()); + + + /** + * Shranimo vse nove šifrante in tudi uporabnike, ki so dodani k novim šifrantom + */ + if ($_GET['m'] == 'post-struktura') + AjaxUporabniki::init($this->anketa)->shraniStrukturoSifrantovInUporabnikov(); + + /** + * Pridobi uporabnike, ki so dodani na specifični nivo + * @params $id - struktura id + * @return json + */ + if ($_GET['m'] == 'get-uporabniki') + echo json_encode(AjaxUporabniki::init($this->anketa)->pridobiUporabnikeZaDolocenNivoId()); + + /** + * Pošljemo id uporabnikov in id strukture, da ponovno shranimo druge uporabnike v bazo + */ + if ($_GET['m'] == 'post-uporabniki') + return AjaxUporabniki::init($this->anketa)->postUporabnikeZaDolocenNivoId(); + + /** + * Popup z vsebino, kjer se urejajo uporabniki za posamezni nivo / textarea za dodajanje novega uporabnika + * + * @return html + */ + if ($_GET['m'] == 'uredi-uporabnike-v-strukturi') + return AjaxUporabniki::init($this->anketa)->htmlPopUpDodajUporabnikeZaDolocenNivoId(); + + + /** + * Pošljemo dodano dodane uporab + * + * @param + */ + if ($_GET['m'] == 'post-dodatne-uporabnike-k-strukturi') + return AjaxUporabniki::init($this->anketa)->postDodatneUporabnikeNaNivoId(); + + /** + * Kopiranje vrstice hierarhije iz DataTables ponovno v možnost urejanja + * + * @param (int) id - id zadnjega elementa strukture + * @return json + */ + if ($_GET['m'] == 'kopiranje-vrstice') + echo json_encode(AjaxUporabniki::init($this->anketa)->kopirajVrsticoStruktureIzDataTablesVFormo()); + + /** + * Poišči uporabnika glede na vpisan email in ga zamnjaj z novim emailom. + */ + if ($_GET['m'] == 'zamenjaj-uporabnika-v-strukturi') + return AjaxUporabniki::init($this->anketa)->htmlPopUpZamenjajUporabnikaVstrukturi(); + + /** + * Pridobimo število oseb, ki jih je potrebno zamenjati + */ + if ($_GET['m'] == 'post-st-zamenjav') + return AjaxUporabniki::init($this->anketa)->getTestnoPreveriStZamenjavEmailVstrukturi(); + + /** + * Uporabnika v strukturi zamenjaj z novim + * Zamenjamo samo na zadnjem nivoju, prejšnjega pa izbrišemo iz sistema + */ + if ($_GET['m'] == 'post-zamenjaj-uporabnika-z-novim') + echo AjaxUporabniki::init($this->anketa)->postZamenjajEmailVstrukturi(); + /***************************** HIERARHIJA UPORABNIKI ***********************/ + + } + + /** + * Aktivacija ankete in generiranje sistemskih vprašanj za Hierarhijo + */ + if ($_GET['a'] == 'aktivacija_ankete') { + if (SurveyInfo::getSurveyModules('hierarhija') == 1) { + // tracking - beleženje sprememb + $this->trackingChanges(); + + // Sistemsko vprašanje prestavimo na prvo mesto VLOGA v kolikor ni + $this->postaviVlogoNaPrvoMestoInIzbrisiCeJeKakNivo(); + + //pridobimo vse nivoje za omenjeno anketo, ker potrebujemo število nivojov in imena nivojev + $nivoji = (new HierarhijaOnlyQuery())->getRavni($this->anketa); + + //preštevilčimo vsa vprašnja na prvi strani za število nivojev pustimo samo vlogo na prvem mestu + (new HierarhijaAjax($this->anketa))->prestevilciBranching($nivoji->num_rows); + + //Pridobimo gru_id od vloge, ker je na isti strani + $grup_id = HierarhijaOnlyQuery::getGrupaId($this->anketa, 1); + + $vrstni_red = 2; + while ($nivo = $nivoji->fetch_object()) { + //vnesemo v srv_spremenljivke in srv_branching + $naslov = $nivo->level . ". " . $nivo->ime; + $variabla = 'nivo' . $nivo->level; + + $spr = [$grup_id, $naslov, $variabla, '3', $vrstni_red]; + $sql_sifranti = (new HierarhijaOnlyQuery())->getSamoSifrant($nivo->id); + + (new HierarhijaQuery())->insertSpremenljivkaBranching($spr, $sql_sifranti, $this->anketa); + + $vrstni_red++; + } + + //Popravimo vrednost pri anleketi, da je sedaj hierarhija enako 2 = je že bila aktivirana + $anketa_id = SurveyInfo::getInstance()->getSurveyColumn('id'); + sisplet_query("UPDATE srv_anketa_module SET vrednost='2' WHERE ank_id='" . $anketa_id . "'"); + + $b = new Branching($anketa_id); + $b->repare_branching(); + + // Shranimo podatke kdaj in kdo je aktiviral hierarhijo + (new HierarhijaQuery())->saveHierarhijaOptions($this->anketa, 'uporabnik_aktiviral_hierarhijo', $this->user_id); + (new HierarhijaQuery())->saveHierarhijaOptions($this->anketa, 'cas_aktivacije_hierarhije', date('d.m.Y, G:i')); + + // KO se izdelajo polja za anketo se potem tudi posreduje email za učitelje oz. zadnji nivo + Hierarhija::aktivacijaAnketePosljiEmail($this->anketa); + } + } + + /** + * Statusi in generiranje superšifre + */ + if($_GET['a'] == 'super-sifra'){ + + //Shrani superšifro + if ($_GET['m'] == 'shrani') + return AjaxSuperSifra::init($this->anketa)->shrani(); + + //Shrani superšifro + if ($_GET['m'] == 'getAll') + return AjaxSuperSifra::init($this->anketa)->getAll(); + + } + + /* Ostalo */ + if ($_GET['a'] == 'ostalo') { + //Obvesti managerje + if ($_GET['m'] == 'obvesti-managerje') { + // tracking - beleženje sprememb + $this->trackingChanges(); + + $this->obvestiManagerjeSendEmail(); + } + + if ($_GET['m'] == 'preview-mail') { + // tracking - beleženje sprememb + $this->trackingChanges(); + + return $this->predogledEmailaZaUciteljeAliManagerje(); + } + + if ($_GET['m'] == 'opcije') { + // tracking - beleženje sprememb + $this->trackingChanges(); + + return $this->posodobiAliVnesiVtabeloOpcije(); + } + + if ($_GET['m'] == 'poslji-email-samo-uciteljem') { + // tracking - beleženje sprememb + $this->trackingChanges(); + + return $this->posljiElektronskoSamoUciteljem(); + } + } + } + + /** + * Prestavimo vlogo na prvo stran in rvo mesto v kolikor, bi slučajno bila zmaknjena, kje drugje v anketi + */ + private function postaviVlogoNaPrvoMestoInIzbrisiCeJeKakNivo() + { + //Preverimo, če je sistemsko vprašanje vloga že ustvarjeno + $grup_ids = sisplet_query("SELECT id, vrstni_red FROM srv_grupa WHERE ank_id='" . $this->anketa . "' ORDER BY vrstni_red", "obj"); + + $prva_stran_group_id = null; + + // gremo po vseh straneh, da preverimo, če je kje vloga + foreach ($grup_ids as $grup_id) { + $sql_vpisane_spr = sisplet_query("SELECT id, gru_id, variable, vrstni_red FROM srv_spremenljivka WHERE gru_id='" . $grup_id->id . "' AND variable='vloga'", "obj"); + + // Pridobimo Group ID za prvo stran + if ($grup_id->vrstni_red == 1) + $prva_stran_group_id = $grup_id->id; + + // Vloga je na prvi strani vendar ne na prvem mestu, zato jo postavimo na prvo mesto ali, če je na katerikoli drugi strani jo tudi postzavimo na prvo mesto + if (!empty($sql_vpisane_spr) && ($sql_vpisane_spr->vrstni_red > 1 || $sql_vpisane_spr->gru_id != $prva_stran_group_id)) { + sisplet_query("UPDATE srv_branching SET vrstni_red = '1' WHERE ank_id='" . $this->anketa . "' AND element_spr='" . $sql_vpisane_spr->id . "'"); + sisplet_query("UPDATE srv_spremenljivka SET vrstni_red = '1', gru_id = '" . $prva_stran_group_id . "' WHERE id='" . $sql_vpisane_spr->id . "'"); + } + } + } + + private function trackingChanges() + { + TrackingClass::update($this->anketa, '20'); + } + + +// /** +// * Funkcija, ko poišče parent id, zanka gre od prvega nivoja do predzadnjega, ki je parent ID +// * +// * @param array $nivoId +// * @param int $velikost +// * @return int $parent_id +// */ +// protected $nivoId; +// protected $velikost; +// +// private function poisciPrentId($nivoId, $velikost) +// { +// $parent_id = null; +// for ($i = 0; $i < ($velikost - 1); $i++) { +// $nivo = explode('-', $nivoId[$i]); +// $search = ' AND hr.level=' . $nivo[0] . ' AND hs.id=' . $nivo[1] . (!empty($parent_id) ? " AND str.parent_id='$parent_id'" : ''); +// if ($i == 0) +// $search = ' AND hr.level=' . $nivo[0] . ' AND hs.id=' . $nivo[1]; +// $parent_id = (new HierarhijaOnlyQuery())->queryStruktura($this->anketa, null, $search)->fetch_object()->id; +// } +// +// return $parent_id; +// } + + protected $sql; + + public function sqlError($sql) + { + if (!$sql) { + echo mysqli_error($GLOBALS['connect_db']); + die(); + } + + } + + + /** + * Funkcija preštevilci vrstni red vprašanj samo na prvi strani, ker bomo tam dodajali sistemske spremenljivke, vlogo pustimo na prvem mestu + */ + protected $st_prestevilcenja; + + public function prestevilciBranching($st_prestevilcenja = 0, $vloga_prestevilci = false) + { + // Pridobi id srv_grupa - vsa sistemska vprašanaj bodo na strani 1 + $grup_id = HierarhijaOnlyQuery::getGrupaId($this->anketa, 1); + + if (empty($grup_id)) + die('Group ID is null!'); + + // Pogleda za že vnesene spremenljivke na prvi strani in povečamo vrstni red za št. nivojev, ki bodo naše sistemske spremenljivke srv_spremenljivke + $vpisane_spr = sisplet_query("SELECT id, gru_id, variable, vrstni_red FROM srv_spremenljivka WHERE gru_id='" . $grup_id . "' AND variable!='vloga' ORDER BY vrstni_red", "obj"); + + // povečamo vrstni red pri srv_spremenljivke + if (!is_null($vpisane_spr) && sizeof($vpisane_spr) > 0) { + // ker prvi je še vedno vloga, ko se aktivira anketo + $i = 2; + if (!empty($vpisane_spr->id)) { + $vrstni_red = $st_prestevilcenja + $i; + sisplet_query("UPDATE srv_spremenljivka SET vrstni_red='" . $vrstni_red . "' WHERE id='" . $vpisane_spr->id . "'"); + } else { + foreach ($vpisane_spr as $spr) { + $vrstni_red = $i + $st_prestevilcenja; + $sql_spremenljivka = sisplet_query("UPDATE srv_spremenljivka SET vrstni_red='" . $vrstni_red . "' WHERE id='" . $spr->id . "'"); + $this->sqlError($sql_spremenljivka); + $i++; + } + } + } + + $vloga_je = ''; + if (!$vloga_prestevilci) { + // Pridobi spremenljivka id za vlogo in ga ne šteje pri srv_branchingu + $sql_vloga_id = sisplet_query("SELECT id, gru_id, variable, vrstni_red FROM srv_spremenljivka WHERE gru_id='" . $grup_id . "' AND variable='vloga' ORDER BY vrstni_red LIMIT 0,1", "obj")->id; + $vloga_je = " AND element_spr!='" . $sql_vloga_id . "'"; + } + + // Pridobi branching brez vloge, ker vloga mora ostati na prvem mestu + $vpisan_branch = sisplet_query("SELECT * FROM srv_branching WHERE ank_id='$this->anketa' " . $vloga_je . " ORDER BY vrstni_red", "obj"); + + //povečamo vrstni red tudi pri srv_branching + if (!is_null($vpisan_branch) && sizeof($vpisan_branch) > 0) { + if (!empty($vpisan_branch->ank_id)) { + $vrstni_red = $st_prestevilcenja + 2; + sisplet_query("UPDATE srv_branching SET vrstni_red='" . $vrstni_red . "' WHERE element_spr='" . $vpisan_branch->element_spr . "' AND ank_id='" . $this->anketa . "'"); + } else { + foreach ($vpisan_branch as $branch) { + $vrstni_red = $branch->vrstni_red + ($st_prestevilcenja + 1); + $sql_branching = sisplet_query("UPDATE srv_branching SET vrstni_red='" . $vrstni_red . "' WHERE element_spr='" . $branch->element_spr . "' AND ank_id='" . $this->anketa . "'"); + $this->sqlError($sql_branching); + } + } + + } + } + + /** + * Preverimo, če je JSON + * + * @param (string) $string + * @return return true ali error + */ + public function isJson($string, $polje = 0) + { + if (is_string($string)) { + $array = json_decode(stripslashes($string)); + + if (json_last_error() == JSON_ERROR_NONE) { + if ($polje) + return $array; + + return true; + } + } + + return false; + } + + /** + * Iz vgnezdenega polja izdela vrstice z vsemi nivoji, če nekje ni podatka potem izdela prazna polja do konca + * @return array + */ + public function array_flatten($array, $koncniArray = []) + { + + foreach ($array as $key => $value) { + if (is_array($value) && $key != 0) + return $this->array_flatten($value, $koncniArray); + + } + $koncniArray[] = $array; + +// d($koncniArray); + return $koncniArray; + + foreach ($array as $key => $row) { + if (is_array($row)) { + return $this->array_flatten($row, $return); + } else { + $return[] = $row; + } +// if (count($row) == count($row, COUNT_RECURSIVE)) +// $row = $this->array_flatten($row); + + + $return[] = $array; + } + + return $return; + } + + + /** + * Shrani trenutno strukturo v srv_hierarhija_shrani + * + * @param + * @return + */ + public function shraniStrukturoHierarhijeVString() + { + // tracking - beleženje sprememb + $this->trackingChanges(); + + if (empty($this->anketa)) + return 'false'; + + // ID shranjene strukture + $id = (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, 'srv_hierarhija_shrani_id', null, null, false); + + // Celotno strukturo skopiramo v string/serialize() + $struktura_string = HierarhijaKopiranjeClass::getInstance($this->anketa)->get(true); + + // Kadar še nimamo vpisano strukturo ali izbrišemo vse uporabnike, vedno shranimo potem NULL + if (sizeof($struktura_string) == 0) + return sisplet_query("UPDATE srv_hierarhija_shrani SET struktura = NULL WHERE id='" . $id . "' AND anketa_id='" . $this->anketa . "'"); + + // Shrani strukturo + $sql_insert = sisplet_query("UPDATE srv_hierarhija_shrani SET struktura='" . $struktura_string . "' WHERE id='" . $id . "' AND anketa_id='" . $this->anketa . "'"); + $this->sqlError($sql_insert); + + // Prešteje število uporabnikov na zadnjem nivoju + $users_upravicen_do_evalvacije = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ')'); + $st_upravicencev_do_evalvacije = mysqli_num_rows($users_upravicen_do_evalvacije); + + // Število vseh uporabnikov v hierarhiji + $vseh_uporabnikov = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa); + $st_vseh_uporabnikov = mysqli_num_rows($vseh_uporabnikov); + + sisplet_query("UPDATE srv_hierarhija_shrani SET st_uciteljev='" . $st_upravicencev_do_evalvacije . "' WHERE id='" . $id . "' AND anketa_id='" . $this->anketa . "'"); + sisplet_query("UPDATE srv_hierarhija_shrani SET st_vseh_uporabnikov='" . $st_vseh_uporabnikov . "' WHERE id='" . $id . "' AND anketa_id='" . $this->anketa . "'"); + } + + public function sendMail($email, $content = null, $subject = null) + { + if (empty($email)) + return false; + + try { + $MA = new MailAdapter($this->anketa, $type='account'); + $MA->addRecipients($email); + $MA->sendMail(stripslashes($content), $subject); + } catch (Exception $e) { + print_r('Email ni bil poslan: ' . $e); + error_log("Email ni bil poslan: $e"); + } + } + + /** + * Pošlji email za managerje, ki so na hiearhiji + * + * @return string + */ + public function obvestiManagerjeSendEmail() + { + $managerji = (!empty($_POST['managerji']) ? $_POST['managerji'] : null); + + if (sizeof($managerji) > 0) { + foreach ($managerji as $user_id) { + $email = sisplet_query("SELECT email FROM users WHERE id='" . $user_id . "'", "obj")->email; + + $subject = 'Dostop do gradnje samooevalvacije - 1ka.si'; + $content = $this->lang['srv_hierarchy_manager_email_1']; + $content .= '

' . $this->lang['srv_hierarchy_manager_email_2'] . '»' . SurveyInfo::getInstance()->getSurveyColumn('naslov') . '«' . $this->lang['srv_hierarchy_manager_email_3'] . '' . $this->site_url . '

'; + + //Zaključek emaila + $content .= '

' . $this->lang['srv_hierarchy_manager_email_4'] . '' . $this->site_url . '.' . $this->lang['srv_hierarchy_manager_email_5']; + $content .= '»' . $email . '«' . $this->lang['srv_hierarchy_manager_email_6'] . '

'; + + // Podpis + $signature = Common::getEmailSignature(); + $content .= $signature; + + $this->sendMail($email, $content, $subject); + } + } + + return 'success'; + } + + + /** + * Vrni html predogleda emaila za učitelje ali managerje + * + * @return html + */ + public function predogledEmailaZaUciteljeAliManagerje() + { + if (empty($_POST['vrsta'])) + return null; + + // Kodo za učence pokažemo, samo kadar ni podatka v bazi + if (HierarhijaQuery::getOptionsPosljiKode($this->anketa) == 'nikomur' && SurveyInfo::getSurveyModules('hierarhija') < 2) { + + echo '
' . $this->lang['srv_hierarchy_preview_none'] . '
'; + + } else { + + $vrsta = $_POST['vrsta']; + + echo '
'; + echo '

' . ($vrsta == 1 ? $this->lang['srv_hierarchy_preview_email_teacher_header'] : $this->lang['srv_hierarchy_preview_email_manager_header']) . '

'; + echo '
'; + + // email učitelji + if ($vrsta == 1) { + $koda_za_resevanje_ankete = HierarhijaQuery::getOptionsPosljiKode($this->anketa); + + echo $this->lang['srv_hierarchy_teacher_email_1']; + echo '

' . $this->lang['srv_hierarchy_teacher_email_2'] . '»' . SurveyInfo::getSurveyTitle() . '«' . $this->lang['srv_hierarchy_teacher_email_3'] . '' . $this->site_url . 'sa

'; + + echo '
'; + echo ''; + echo ' + '; + + // Koda samo za ucence + if (SurveyInfo::getSurveyModules('hierarhija') == 2 || in_array($koda_za_resevanje_ankete, ['vsem', 'ucitelju'])) + echo ''; + + // V kolikor nimamo nikakršne izbere potem posredujemo kodo tudi za učence + if (in_array($koda_za_resevanje_ankete, ['vsem', 'ucencem'])) + echo ''; + + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + + if (SurveyInfo::getSurveyModules('hierarhija') == 2 || in_array($koda_za_resevanje_ankete, ['vsem', 'ucitelju'])) + echo ''; + + if (in_array($koda_za_resevanje_ankete, ['vsem', 'ucencem'])) + echo ''; + echo ''; + + echo ''; + echo '
HierarhijaKoda za učiteljaKoda za učence
Struktura hierarhije # # # # # # # # # #

'; + + //Zaključek emaila + // V kolikor se emailpošlje samo učiteljem potem se skrije možnost za dostop učiteljem + $onemogocenDostopUcitelju = (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, 'onemogoci_dostop_uciteljem', NULL, NULL, FALSE); + + if (is_null($onemogocenDostopUcitelju) && in_array($koda_za_resevanje_ankete, ['ucitelju'])) { + echo '

' . $this->lang['srv_hierarchy_teacher_email_4'] . '' . $site_url . '' . $this->lang['srv_hierarchy_teacher_email_5']; + echo '»' . $uporabnik->email . '«' . $this->lang['srv_hierarchy_teacher_email_6'] . '

'; + } + + } + + + // email managerji + if ($vrsta == 2) { + echo $this->lang['srv_hierarchy_manager_email_1']; + echo '

' . $this->lang['srv_hierarchy_manager_email_2'] . '»' . SurveyInfo::getInstance()->getSurveyColumn('naslov') . '«' . $this->lang['srv_hierarchy_manager_email_3'] . '' . $this->site_url . '

'; + + //Zaključek emaila + echo '

' . $this->lang['srv_hierarchy_manager_email_4'] . '' . $this->site_url . '.' . $this->lang['srv_hierarchy_manager_email_5']; + echo '»#elektronski naslov uporabnika#«' . $this->lang['srv_hierarchy_manager_email_6'] . '

'; + } + + // Podpis + $signature = Common::getEmailSignature(); + echo $signature . '

'; + + echo ''; + echo ''; + } + + // Gumb za zapret popup in potrdit + echo '
'; + echo '' . $this->lang['srv_close_profile'] . '' . "\n\r"; + echo '
'; + + } + + /** + * Preverimo, če vprašanja obstajajo in če vsebuje samo dovoljena vprašanja + * + * @return int 1 or 0; + */ + public function preveriUstreznostCeJePrimernaZaHierarhijo() + { + + if(!HierarhijaHelper::preveriDostop($this->anketa)){ + echo 'dostop'; + return false; + } + + + // Preverimo, če je že kakšno vprašanje v anketi ali ni nič + $napaka = HierarhijaQuery::preveriBranchingCeJeKakoVprasanje($this->anketa); + + // Izberemo prevzeto anketo, ker v bazi še ni vprašanj + if ($napaka == 1) + echo 'privzeta'; + + // Ne moremo aktivirati modula, ker vsebuje napačen tip + if ($napaka == 2) + echo 'napacen-tip'; + + if ($napaka == 3) + echo 'samo-besedilni-tip'; + + if ($napaka == 9) + echo 'ponovna-aktivacija'; + + if ($napaka == 'ok') + echo 'ok'; + + } + + /** + * Pridobimo vse ankete, ki so v knjižnici za hierarhijo + * + * @return HTML + */ + public function pridobiVseAnketeKiSoVknjizniciZaHierarhijo() + { + global $site_url; + global $hierarhija_folder_id; + + $ime_mape = sisplet_query("SELECT * FROM srv_library_folder where id='" . $hierarhija_folder_id . "'", "obj")->naslov; + $ankete_v_knjiznici = sisplet_query("SELECT * FROM srv_library_anketa WHERE folder='" . $hierarhija_folder_id . "'", "obj"); + + if (empty($ime_mape) && sizeof($ankete_v_knjiznici) == 0) { + echo 'Knjižnica je prazna.'; + return null; + } + + echo '

' . $ime_mape . '

'; + echo '
    '; + + if (is_array($ankete_v_knjiznici) && empty($ankete_v_knjiznici->ank_id)) { + foreach ($ankete_v_knjiznici as $anketa) { + $srv_anketa = sisplet_query("SELECT id, naslov FROM srv_anketa WHERE id='" . $anketa->ank_id . "'", "obj"); + + if(!empty($srv_anketa->naslov)) { + echo '
  • '; + echo ' '; + echo ''; + echo ' + + + + '; + echo ''; + echo '
  • '; + } + } + } elseif (is_object($ankete_v_knjiznici)) { + $srv_anketa = sisplet_query("SELECT id, naslov FROM srv_anketa WHERE id='" . $ankete_v_knjiznici->ank_id . "'", "obj"); + + if(!empty($srv_anketa->naslov)) { + echo '
  • '; + echo ' '; + echo ' + + + + '; + echo ''; + echo '
  • '; + } + } + + echo '
'; + + } + + /** + * Posodobi, vnesi ali briši iz tabele srv_hierarhija_options + * + * @return + */ + public function posodobiAliVnesiVtabeloOpcije() + { + $name = (!empty($_POST['name']) ? $_POST['name'] : null); + $value = (!empty($_POST['value']) ? $_POST['value'] : null); + $method = (!empty($_POST['method']) ? $_POST['method'] : null); + + if (empty($name)) + return false; + + if ($method == 'delete') { + sisplet_query("DELETE FROM srv_hierarhija_options WHERE anketa_id='" . $this->anketa . "' AND option_name='" . $name . "'"); + + // Pri ocijah izbrišemo "onemogoci_dostop_uciteljem" potem moramo v tabeli srv_dostop dodati dostop za vse te učitelje + if ($name == 'onemogoci_dostop_uciteljem') + $this->preveriDostopDoAnkete('insert'); + + echo 'Delete'; + return true; + } + + // Vsekakor preverimo, če podatek že obstaja v bazi + $obstaja = sisplet_query("SELECT id FROM srv_hierarhija_options WHERE anketa_id='" . $this->anketa . "' AND option_name='" . $name . "'", "obj"); + if (!is_null($obstaja) && sizeof($obstaja) > 0) + $method = 'put'; + + if ($method == 'put') { + sisplet_query("UPDATE srv_hierarhija_options SET option_value='" . $value . "' WHERE anketa_id='" . $this->anketa . "' AND option_name='" . $name . "'"); + echo 'Update'; + return true; + } + + sisplet_query("INSERT INTO srv_hierarhija_options (anketa_id, option_name, option_value) VALUES ($this->anketa, '" . $name . "', '" . $value . "')"); + + // Pri ocijah dodamoo "onemogoci_dostop_uciteljem" potem moramo v tabeli srv_dostop izbrisati vsem učiteljem dostop + if ($name == 'onemogoci_dostop_uciteljem') + $this->preveriDostopDoAnkete('delete'); + + echo 'Insert'; + } + + /** + * Prteverimo, če imajo učitelji na hierarhiji dostop drugače jih dodamo ali odstranimo + * + * @param string $tip + */ + + private function preveriDostopDoAnkete($tip = null) + { + // Vsi uporabniki na zadnjem nivoju + $users_na_zadnjem_nivoju = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ') GROUP BY users.id'); + + if ($tip == 'insert') { + while ($uporabnik = $users_na_zadnjem_nivoju->fetch_object()) { + HierarhijaQuery::dostopZaUporabnika($this->anketa, $uporabnik->user_id, 'insert'); + } + } + + if ($tip == 'delete') { + while ($uporabnik = $users_na_zadnjem_nivoju->fetch_object()) { + HierarhijaQuery::dostopZaUporabnika($this->anketa, $uporabnik->user_id, 'delete'); + } + } + } + + + /** + * Pošlji vabilo samo učiteljem, če jim predhodno ni bilo poslano + * + * @return string + */ + private function posljiElektronskoSamoUciteljem() + { + + Hierarhija::posljiEmailSkodamiUcencemAliSamoUciteljem($this->anketa); + + HierarhijaQuery::saveOptions($this->anketa, 'obvesti_samo_ucitelje', 1); + + return true; + } + + +} + + diff --git a/admin/survey/modules/mod_hierarhija/class/HierarhijaAnalysisClass.php b/admin/survey/modules/mod_hierarhija/class/HierarhijaAnalysisClass.php new file mode 100644 index 0000000..a322a5d --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/HierarhijaAnalysisClass.php @@ -0,0 +1,2617 @@ + array('seq' => '0', 'spr' => 'undefined', 'grd' => 'undefined')); # array drugih variable, kamor shranimo spr, grid_id, in sequenco + public $variabla2 = array('0' => array('seq' => '0', 'spr' => 'undefined', 'grd' => 'undefined')); # array drugih variable, kamor shranimo spr, grid_id, in sequenco + + public $variablesList = null; # Seznam vseh variabel nad katerimi lahko izvajamo meanse (zakeširamo) + + public $_CURRENT_STATUS_FILTER = ''; # filter po statusih, privzeto izvažamo 6 in 5 + + public $_HAS_TEST_DATA = false; # ali anketa vsebuje testne podatke + + public $doValues = true; # checkbox Prikaži vrednosti + + private $sessionData; # podatki ki so bili prej v sessionu - za nastavitve, ki se prenasajo v izvoze... + + + public function __construct($sid) + { + global $global_user_id; + + if (is_null($sid)) + $sid = $_GET['anketa']; + + // v kolikor ni ID ankete potem nič ne prikazujemo + if ((int)$sid <= 0) { + echo 'Invalid Survey ID!'; + exit(); + } + + // ID ankete + $this->anketa = $sid; + + // Preveri, če ia parameter id strukture + $this->pregledAnalizeSamoZaEnoStrukturo(); + + # polovimo vrsto tabel (aktivne / neaktivne) + SurveyInfo::getInstance()->SurveyInit($this->anketa); + if (SurveyInfo::getInstance()->getSurveyColumn('db_table') == 1) { + $this->db_table = '_active'; + } + + # Inicializiramo in polovimo nastavitve missing profila + SurveyStatusProfiles::Init($this->anketa); + SurveyUserSetting::getInstance()->Init($this->anketa, $global_user_id); + + $this->_CURRENT_STATUS_FILTER = STATUS_FIELD . ' ~ /6|5/'; + + SurveyStatusProfiles::Init($this->anketa); + SurveyMissingProfiles::Init($this->anketa, $global_user_id); + SurveyConditionProfiles::Init($this->anketa, $global_user_id); + SurveyZankaProfiles::Init($this->anketa, $global_user_id); + SurveyTimeProfiles::Init($this->anketa, $global_user_id); + SurveyVariablesProfiles::Init($this->anketa); + SurveyDataSettingProfiles:: Init($this->anketa); + + + // Poskrbimo za datoteko s podatki + $SDF = SurveyDataFile::get_instance(); + $SDF->init($this->anketa); + $SDF->prepareFiles(); + + $this->headFileName = $SDF->getHeaderFileName(); + $this->dataFileName = $SDF->getDataFileName(); + $this->dataFileStatus = $SDF->getStatus(); + + + // preberemo nastavitve iz baze (prej v sessionu) + SurveyUserSession::Init($this->anketa); + // V kolikor ni shranjeno polje v bazi potem pobrišemo trenutno, kar je nastavljeno, da se izognemo napakam, ki bi se pojavile v nadaljevanju + if (!empty(SurveyUserSession::getData()) && !is_array(SurveyUserSession::getData())) + SurveyUserSession::delete(); + + $this->sessionData = SurveyUserSession::getData(); + + if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') { + if (!empty($_GET['s'])) { + $this->sessionData['means']['struktura'] = (int)$_GET['s']; + } elseif (!empty($this->sessionData['means']['struktura'])) { + unset($this->sessionData['means']['struktura']); + } + + SurveyUserSession::saveData($this->sessionData); + } + + // V kolikor preverjamo anketo za učitelja z že izbranimi parametri potem pobrišemo nastavitve iz baze + if (!is_null($this->struktura)) + $this->sessionData['means']['filterHierarhija'] = array(); + + + if ($this->dataFileStatus == FILE_STATUS_NO_DATA || $this->dataFileStatus == FILE_STATUS_NO_FILE || $this->dataFileStatus == FILE_STATUS_SRV_DELETED) { + Common::noDataAlert(); + exit(); + } + + if ($this->headFileName !== null && $this->headFileName != '') { + $this->_HEADERS = unserialize(file_get_contents($this->headFileName)); + } + + // Kdar je variable2 prazna in podatki še niso shranjeni v bazi potem prikažemo vse odgovore; + if (!is_null($this->struktura) || (empty($this->sessionData['means']['means_variables']['variabla2']) || sizeof($this->sessionData['means']['means_variables']['variabla2']) < 1) && !empty($this->_HEADERS)) { + $polje = array(); + if (!empty($this->getVariableList(2))) { + foreach ($this->getVariableList(2) as $vprasanje) { + if ($vprasanje['canChoose']) { + $polje[] = [ + 'seq' => $vprasanje['sequence'], + 'spr' => $vprasanje['spr_id'], + 'grd' => 'undefined' + ]; + } + } + } + + $this->sessionData['means']['means_variables']['variabla2'] = $polje; + + if (!empty($this->struktura)) + $this->variabla2 = $polje; + + + // dodan js, da osveži vse elemente in vse izbrane spremenljivke shrani v bazo + echo ''; + } + + + # nastavimo vse filtre +// $this->setUpFilter(); + + # nastavimo uporabniške nastavitve + $this->readUserSettings(); + + if (!empty($this->struktura)) { + // posodobimo vse filtre, ki so bili izbrani + echo ''; + } + + } + + + /** + * Pogledamo, če imamo id strukture in potem prikažemo rezulatate samo teh reševanj + */ + private function pregledAnalizeSamoZaEnoStrukturo() + { + if (is_null($_GET['s']) || is_string((int)$_GET['s'])) + return null; + + $this->struktura = (int)$_GET['s']; + } + + + private function readUserSettings() + { + $sdsp = SurveyDataSettingProfiles:: getSetting(); + $this->doValues = $sdsp['doValues'] == '1' ? true : false; + } + + + public function ajax() + { + #nastavimo variable če so postane + $this->setPostVars(); + + # izvedemo akcijo + switch ($_GET['a']) { + case 'changeDropdown': + $this->displayDropdowns(); + break; + case 'change': + $this->displayData(); + break; + case 'add_new_variable': + $this->addNewVariable(); + break; + case 'changeMeansSubSetting': + $this->changeMeansSubSetting(); + break; + case 'changeMeansShowChart': + $this->changeMeansShowChart(); + break; + case 'posodobi-ucitelja': + $this->posodobiPodatkeZaUcitelja(); + break; + case 'posodobi-izbran-predmet': + $this->posodobiIzbranPredmet(); + break; + case 'posodobi-seznam-za-ucitelje': + $this->posodobiSeznamFiltrovUcitelja(); + breake; + case 'pobrisi-filter': + $this->pobrisiFilterUciteljevAliHierarhije(); + break; + default: + print_r("
");
+                print_r($_GET);
+                print_r($_POST);
+                break;
+        }
+
+    }
+
+    function Display()
+    {
+        global $lang;
+        
+        $hierarhija_type = (!empty($_SESSION['hierarhija'][$this->anketa]['type']) ? $_SESSION['hierarhija'][$this->anketa]['type'] : null);
+
+        // meni za izbiranlje za filtre
+        $this->displayHierarhijaAliUcitelji();
+
+        # ali imamo testne podatke
+        if ($this->_HAS_TEST_DATA) {
+            # izrišemo bar za testne podatke
+            $SSH = new SurveyStaticHtml($this->anketa);
+            $SSH->displayTestDataBar(true);
+        }
+
+        # preberemo prednastavljene variable iz seje, če obstajajo
+        # v koolikor gledamo za specifični  ID, potem prikažemo trenutne podatke
+        if (is_null($_GET['s']))
+            $this->presetVariables();
+
+        // v kolikor gre za specifično anketo potem naredimo skrito polje z ID-jem strukture tega učitelja
+        if (!is_null($this->struktura))
+            echo '';
+
+
+//        $this->DisplayLinks();
+//        $this->DisplayFilters();
+
+        // ruleta za izbiro po učiteljih
+        if ($hierarhija_type < 5) {
+            $prikazi_fitre = is_array($this->sessionData['means']['strukturaUcitelj']);
+            $prikazi_rezultate = (isset($this->sessionData['means']['uciteljFilter']) && $this->sessionData['means']['uciteljFilter'] == 'predmeti');
+
+            echo '
'; + // Prikažemo seznam učiteljev za agregirane analize + $this->displayDropdownSeznamUciteljev(); + echo '
'; + + echo '
'; + $this->displayDropdownSeznamUciteljevZaSpecificniPredmet(); + echo '
'; + } + + + echo '
'; +// echo '
Prikaži filtre
'; +// echo '
Skrij filtre
'; + echo '
'; + $this->displayDropdowns(); + echo '
'; + + // Prikažemo izvoz, če gre za učitelja + if ($_GET['a'] == 'hierarhija') { + $href_pdf = makeEncodedIzvozUrlString('izvoz.php?b=export&m=hierarhija_pdf_izpis&anketa=' . $this->anketa); + $href_rtf = 'index.php?anketa=' . $this->anketa . '&a=hierarhija&m=analize&r=custom'; + + echo ''; + + } + echo '
'; + + echo '
'; + $this->displayData(); + echo '
'; #id="div_means_data" + + } + + + /** + * Izpišemo opcijo za izbiro ali filtri hierarhije ali filtri po učiteljih + * + * @return html + */ + public function displayHierarhijaAliUcitelji() + { + $hierarhija_type = (!empty($_SESSION['hierarhija'][$this->anketa]['type']) ? $_SESSION['hierarhija'][$this->anketa]['type'] : null); + global $lang; + + if ($hierarhija_type > 4) + return null; + + echo '

'; + $seja = SurveyUserSession::getData(['means']['imeHierarhije']); + if(!empty($this->sessionData['means']['imeHierarhije'])) + echo $this->sessionData['means']['imeHierarhije']; + echo '

'; + + + // V kolikor gre za filtre po hierarhiji ali za filtre samo po učiteljih + echo '
'; + echo '
'; + echo 'Filtriranje po: '; + echo 'sessionData['means']['strukturaUcitelj']) ? 'checked="checked"' : null) . '/> '; + echo 'sessionData['means']['strukturaUcitelj']) ? 'checked="checked"' : null) . '/> '; + + echo '
'; + echo 'Rezultati bodo prikazani: '; + echo 'sessionData['means']['uciteljFilter']) || $this->sessionData['means']['uciteljFilter'] == 'agregirano' ? 'checked="checked"' : null) . '/> '; + echo 'sessionData['means']['uciteljFilter'] == 'predmeti' ? 'checked="checked"' : null) . '/> '; + echo '
'; + + echo '
'; + + echo '
'; + echo 'Poročila po meri: '; + echo ''; + echo ''; + if($_GET['error'] == 'invalid') { + echo '
'.$lang['srv_hierarchy_analysis_error_invalid_data'].'
'; + } + echo '
'; + echo '
'; + } + + /** + * Izriše seznam vseh učiteljev, ki so v strukturi + * + * @return html + */ + private function displayDropdownSeznamUciteljev() + { + $vsi_uporabniki_upraviceni_do_evalvacije = (new \Hierarhija\Model\HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ') GROUP BY users.id'); + + echo ''; + echo ''; + } + + /** + * Izriše seznam vseh učiteljev in strukture - za 1 predmet + * + * @return html + */ + private function displayDropdownSeznamUciteljevZaSpecificniPredmet() + { + $struktura_uporabnikov = (new \Hierarhija\Model\HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ')'); + + echo ''; + echo ''; + } + + public function displayDropdowns() + { + global $lang; + $variables1 = $this->getVariableList(1); + $variables2 = $this->getVariableList(2); + + + // V kolikor je struktura 0 in post request je notri ID strukture potem zapišemo v globalno spremenljivko + if (is_null($this->struktura) && !empty($_POST['strukturaId'])) + $this->struktura = (int)$_POST['strukturaId']; + + // Pridobimo strukturo za specifično anketo + $imena_sifrantov_ucitelja = array(); + if (!is_null($this->struktura)) { + $this->sessionData['means']['filterHierarhija'] = array(); + $imena_sifrantov_ucitelja = $this->pridobiStrukturoZaUcitelja(); + } + + ### Levi meni za prikaz vloge + echo ''; + + ### Prikaz elementov hierarhije in nivojev, ki so že zaklenjeni + echo '
struktura) || is_array($this->sessionData['means']['struktura']) || isset($this->sessionData['means']['strukturaUcitelj'])) ? ' style="display:none;"' : '') . '>'; + echo $lang['srv_hierarchy_label_analyse']; + echo '
'; + + #### Pridobimo strukturo hierarhije + $struktura_hierarhije = $this->hierarhijaUporabnika(); //tukaj dobimo samo polja, do katerih ima uporabnik dovoljenje + + #### V kolikor je učitelj oz. poljuben uporabnik na določeni ravni potem preverimo max št nivojev + $max_st_nivojev = sisplet_query("SELECT MAX(level) AS max + FROM + srv_hierarhija_ravni AS r + LEFT JOIN + srv_hierarhija_sifranti AS s + ON + s.hierarhija_ravni_id = r.id + WHERE + r.anketa_id = '" . $this->anketa . "' + ORDER BY level", "obj")->max; + + // filter za vsak nivo shranimo v polje in v kolikor se filter ponovi potem izpišemo vedno samo enega + foreach ($this->_HEADERS as $h_key => $header) { + preg_match('/^(?:nivo)([0-9]+)/', $header['variable'], $match); + if ((int)$h_key > 0 && sizeof($match) > 0) { + echo '
'; + echo ''; + echo '
'; + + // Prikaz chosen za vse šifrante, ki jih imamo + echo ''; + echo '
'; + } + } + + echo ''; + + echo '
'; + + +# echo '
'; +# if ($this->isSelectedBothVariables()) { +# echo 'rotate'; +# } else { +# echo 'rotate'; +# } +# echo '
'; + + echo '
struktura) ? ' style="display:none;"' : '') . '>'; + if ((int)$this->variabla1['0']['seq'] > 0) { + echo ' '; + } + echo $lang['srv_means_label2']; + echo '
'; + + + # za vsako novo spremenljivko 2 nardimo svoj select + if (count($this->variabla2) > 0) { + if ((int)$this->variabla1['0']['seq'] > 0) { + echo ''; + } + + foreach ($this->variabla2 AS $_key => $variabla2) { + echo $_br; + echo ''; + echo ''; + if (count($this->variabla2) > 1) { + echo ''; + } else { + echo ' '; + } + + $_br = '
 '; + echo '
'; + } + } + echo '
'; + + echo ''; + if (count($this->variabla2) > 1) { + ### Skrijemo možnost preklopa odgovorov v skupno tabelo + echo '
'; + echo ''; + echo '
'; + echo '
' . $lang['srv_hierarchy_analysis_show_questions'] . '
'; + echo ''; +// echo '
sessionData['means']['meansSeperateTables'] != true ? '' : ' class="displayNone"') . '>'; + } + echo '
sessionData['mean_charts']['showChart'] == true ? ' checked="checked"' : '') . '>
'; + echo '
'; + echo ''; + + echo '
'; + + + // Ikone za izvoz (so tukaj da se refreshajo ob ajax klicu) + $this->displayExport(); + } + + + /** + * Pridobimo hierarhijo uporabnika, ki je prijavljen + * + * @return (array) $hierarhija + */ + public function hierarhijaUporabnika() + { + # Podatki za pregled nivojev hierarhije + $hierarhija_type = \Hierarhija\HierarhijaHelper::preveriTipHierarhije($this->anketa); + + if (empty($hierarhija_type)) + return false; + + if ($hierarhija_type > 4) { + $struktura_user = (new \Hierarhija\Model\HierarhijaQuery())->pridobiHierarhijoNavzgor($this->anketa, true); + + $hierarhija = array(); + + foreach ($struktura_user as $key => $struktura) { + foreach ($struktura as $row) { + $nivo = trim($row['nivo'], 'nivo'); + + ### Gremo skozi hierarhijo in v kolikor ima uporabnik več izvedenih anket (za različne letnike) potem vpišemo vse unikatne nivoje hierarhije; + if (!in_array($nivo, $hierarhija) && + (is_array($hierarhija[$nivo]) && + !in_array($row['st_odgovora'], $hierarhija[$nivo]) || empty($hierarhija[$nivo])) + ) { + $hierarhija[$nivo][] = $row['st_odgovora']; + } +// else { +// +//// $st_last = 0; +// ### V kolikor obstaja element potem vedno prepišemo zadnjega vnešenega +//// if (isset($hierarhija[$nivo]) && sizeof($hierarhija[$nivo]) > 0) +//// $st_last = sizeof($hierarhija[$nivo]) - 1; +// +//// $hierarhija[$nivo][$st_last] = $row['st_odgovora']; //če se je nivo ponovil ga vedno vpišemo na prvo mesto +// +// } + + } + } + + return $hierarhija; + } + + return 'admin'; + } + + + /** + * Pridobimo strukturo za učitelja za specifično anketo in vrnemo imena vseh šifrantov, ker jih bomo uporabili za filtriranje + * + * @return (array) $imena_sifrantov + */ + public function pridobiStrukturoZaUcitelja() + { + $struktura = \Hierarhija\Model\HierarhijaQuery::posodobiSifranteVrednostiGledeNaTrenutenIdStrukture($this->struktura); + $imena_sifrantov = array(); + foreach ($struktura as $row) { + $sql = sisplet_query("SELECT ime FROM srv_hierarhija_sifranti WHERE id='" . $row['id_sifranta'] . "'", "obj"); + $imena_sifrantov[] = $sql->ime; + } + + return $imena_sifrantov; + } + + /** + * Osvežimo vse podatke, ki so potrebni za pridobitev pdoatkov + * + * @return html + */ + public function displayData($filter_hierarhija = null) + { + global $site_path; + + $br = ''; + $means = array(); + + if (!file_exists($site_path . EXPORT_FOLDER . '/export_data_' . $this->anketa . '.dat')) { + echo 'Ni odgovorov'; + die(); + } + + + # če ne uporabljamo privzetega časovnega profila izpišemo opozorilo + SurveyTimeProfiles::printIsDefaultProfile(false); + + # če imamo filter ifov ga izpišemo + SurveyConditionProfiles::getConditionString(); + + # če imamo filter spremenljivk ga izpišemo + SurveyVariablesProfiles::getProfileString($doNewLine, true); + + # če imamo rekodiranje + $SR = new SurveyRecoding($this->anketa); + $SR->getProfileString(); + + if ($this->getSelectedVariables(1) !== null && $this->getSelectedVariables(2) !== null) { + $variables1 = $this->getSelectedVariables(2); + $variables2 = $this->getSelectedVariables(1); + + $c1 = 0; + $c2 = 0; + + # odvisno ok checkboxa prikazujemo druge variable v isti tabeli ali v svoji + if ($this->sessionData['means']['meansSeperateTables'] == true || !isset($this->sessionData['means']['meansSeperateTables'])) { + #prikazujemo ločeno + if (is_array($variables2) && count($variables2) > 0) { + foreach ($variables2 AS $v_second) { + if (is_array($variables1) && count($variables1) > 0) { + foreach ($variables1 AS $v_first) { + $_means = $this->createMeans($v_first, $v_second); + if ($_means != null) { + $means[$c1][0] = $_means; + } + $c1++; + } + } + } + } + } else { + #prikazujemo v isti tabeli + if (is_array($variables2) && count($variables2) > 0) { + foreach ($variables2 AS $v_second) { + if (is_array($variables1) && count($variables1) > 0) { + foreach ($variables1 AS $v_first) { + $_means = $this->createMeans($v_first, $v_second); + if ($_means != null) { + $means[$c1][$c2] = $_means; + } + $c2++; + } + } + $c1++; + $c2 = 0; + } + } + } + + //ddd($means); + if (is_array($means) && count($means) > 0) { + $counter = 0; + foreach ($means AS $mean_sub_grup) { + echo($br); + $this->displayMeansTable($mean_sub_grup); + $br = '
'; + + // Zvezdica za vkljucitev v porocilo + $spr2 = $mean_sub_grup[0]['v1']['seq'] . '-' . $mean_sub_grup[0]['v1']['spr'] . '-' . $mean_sub_grup[0]['v1']['grd']; + $spr1 = $mean_sub_grup[0]['v2']['seq'] . '-' . $mean_sub_grup[0]['v2']['spr'] . '-' . $mean_sub_grup[0]['v2']['grd']; + SurveyAnalysis::Init($this->anketa); + SurveyAnalysis::addCustomReportElement($type = 6, $sub_type = 0, $spr1, $spr2); + + // Izrisemo graf za tabelo - zaenkrat samo admin + if ($this->sessionData['mean_charts']['showChart'] && $_GET['m'] != 'analysis_creport') { + $tableChart = new SurveyTableChart($this->anketa, $this, 'mean', $counter); + $tableChart->display(); + } + + $counter++; + } + } + + } else { + # dropdowni niso izbrani + } + + + if ($this->aliImaPravicoDoPrikazaOdprtihOdgovorov()) { + echo '
'; + + foreach ($this->_HEADERS AS $skey => $spremenljivka) { + if ($spremenljivka['tip'] == 21) { + if ($spremenljivka['cnt_all'] == 1) { + // če je enodimenzionalna prikažemo kot frekvence + // predvsem zaradi vprašanj tipa: language, email... + + $this->izrisiOdprteOdgovoreZaUcitelja($skey, $spremenljivka); +// $this->sumTextVertical($skey, 'sums'); +// + } else { + SurveyAnalysis::sumMultiText($skey, 'sums'); + } + } + } + + echo '
'; + } + } + + /** + * Preverimo, če je res učitelj in če ima pravico do odprtih odgovorov + * + * @return boolean + */ + public function aliImaPravicoDoPrikazaOdprtihOdgovorov() + { + global $global_user_id; + + // Pridobimo max število nivojev + $max_st = (new \Hierarhija\Model\HierarhijaOnlyQuery())->getRavni($this->anketa, 'MAX(level) AS max_level')->fetch_object()->max_level; + + $struktura = sisplet_query("SELECT s.level AS level FROM srv_hierarhija_struktura_users AS u LEFT JOIN srv_hierarhija_struktura AS s ON s.id=u.hierarhija_struktura_id WHERE s.anketa_id='" . $this->anketa . "' AND u.user_id='" . $global_user_id . "'", "obj"); + + if (is_array($struktura) && $struktura[0]->level == $max_st || $struktura->level == $max_st) + return true; + + return false; + } + + /* + * Pridobimo strukture za učitelja na vseh nivojih + */ + public function posodobiPodatkeZaUcitelja($user_id = null) + { + if (empty($_POST['user_id']) && is_null($user_id)) + return null; + + if (is_null($user_id)) + $user_id = $_POST['user_id']; + + // Pridobimo uporabnika za vse njegove predmete + $vsi_predmeti_uporabnika = (new \Hierarhija\Model\HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ') AND users.id="' . $user_id . '"'); + + $struktura_ids = []; + while ($row = $vsi_predmeti_uporabnika->fetch_object()) { + $struktura_ids[] = $row->id; + } + + // Pridobimo vse šifrante od učitelja navzgor - celo strukturo + $this->struktura_ucitelj = []; + foreach ($struktura_ids as $struktura_id) { + $struktura_baza = \Hierarhija\Model\HierarhijaQuery::posodobiSifranteVrednostiGledeNaTrenutenIdStrukture($struktura_id); + + foreach ($struktura_baza as $key => $row) { + // $struktura_id - je ID strukture na kateremse nahaja učitelj + // $key - je level na katerem je šifrant + // $row['id_sifranta'] - je ID sifranta kateri je na tem nivoju + $this->struktura_ucitelj[$struktura_id][$key]['sifrant'] = $row['id_sifranta']; + + // Šifrant preverimo glede na vrstni red + $this->struktura_ucitelj[$struktura_id][$key]['stevilka'] = $this->pridobiStZaSpecificniSifrant($row['hierarhija_ravni_id'], $row['id_sifranta']); + } + } + + // Filtriranje po učitelju + if (isset($this->struktura_ucitelj) && sizeof($this->struktura_ucitelj) > 0) + $this->sessionData['means']['strukturaUcitelj'] = $this->struktura_ucitelj; + + // Shranimo spremenjene nastavitve v bazo + SurveyUserSession::saveData($this->sessionData); + + return $this->struktura_ucitelj; + } + + /* +* Pridobimo strukture za učitelja na vseh nivojih +*/ + public function posodobiIzbranPredmet() + { + if (empty($_POST['strukutra_id'])) + return null; + + $struktura_id = $_POST['strukutra_id']; + + // Pridobimo vse šifrante od učitelja navzgor - celo strukturo + $this->struktura_ucitelj = []; + + $struktura_baza = \Hierarhija\Model\HierarhijaQuery::posodobiSifranteVrednostiGledeNaTrenutenIdStrukture($struktura_id); + + + foreach ($struktura_baza as $key => $row) { + // $struktura_id - je ID strukture na kateremse nahaja učitelj + // $key - je level na katerem je šifrant + // $row['id_sifranta'] - je ID sifranta kateri je na tem nivoju + $this->struktura_ucitelj[$struktura_id][$key]['sifrant'] = $row['id_sifranta']; + + // Šifrant preverimo glede na vrstni red + $this->struktura_ucitelj[$struktura_id][$key]['stevilka'] = $this->pridobiStZaSpecificniSifrant($row['hierarhija_ravni_id'], $row['id_sifranta']); + } + + + // Filtriranje po učitelju + if (isset($this->struktura_ucitelj) && sizeof($this->struktura_ucitelj) > 0){ + $this->sessionData['means']['strukturaUcitelj'] = $this->struktura_ucitelj; + + $user = sisplet_query("SELECT user_id FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='".$struktura_id."'", "obj")->user_id; + + $this->sessionData['means']['imeHierarhije'] = \Hierarhija\HierarhijaHelper::hierarhijaPrikazNaslovovpriUrlju($this->anketa, $struktura_id, $user); + } + + // Shranimo spremenjene nastavitve v bazo + SurveyUserSession::saveData($this->sessionData); + + + echo $this->sessionData['means']['imeHierarhije']; + } + + /** + * Posodobimo seznam filtrov za učitelja ali so samo učitelji ali so izlistani po predmetih: + */ + public function posodobiSeznamFiltrovUcitelja(){ + $this->sessionData['means']['uciteljFilter'] = (!empty($_POST['vrsta']) ? $_POST['vrsta'] : 'agregirano'); + + unset($this->sessionData['means']['imeHierarhije']); + + SurveyUserSession::saveData($this->sessionData); + + } + + /** + * Pobrišemo filter učitljev ali hierarhije, odvisno kaj je bilo izbrano + * + * @return bool + */ + public function pobrisiFilterUciteljevAliHierarhije() + { + if (empty($_POST['vrsta'])) + return null; + + $vrsta = $_POST['vrsta']; + + if ($vrsta == 'ucitelji') { + $this->struktura = []; + $this->sessionData['means']['strukturaUcitelj'] = []; + unset($this->sessionData['means']['filterHierarhija']); + } + + if ($vrsta == 'filtri') { + $this->struktura_ucitelj = null; + unset($this->sessionData['means']['strukturaUcitelj']); + } + + SurveyUserSession::saveData($this->sessionData); + } + + /** + * Pridobimo vrstni red šifranta iz tabele srv_hierarhija_sifranti + * + * @param int $sifrant_id + * @return int + */ + private function pridobiStZaSpecificniSifrant($ravni_id, $sifrant_id) + { + if (!is_numeric($sifrant_id) || !is_numeric($sifrant_id)) + return null; + + $sql = sisplet_query("SELECT id, ime FROM srv_hierarhija_sifranti WHERE hierarhija_ravni_id='" . $ravni_id . "' ORDER BY ime", "obj"); + + $st = 0; + foreach ($sql as $row) { + $st++; + if ($row->id == $sifrant_id) + break; + } + + return $st; + } + + static public $textAnswersMore = array('0' => '10', '10' => '30', '30' => '300', '300' => '600', '600' => '900', '900' => '100000'); + + static function getNumRecords() + { + if (isset($_POST['num_records']) && (int)$_POST['num_records'] > 0) { + $result = (int)self::$textAnswersMore[$_POST['num_records']]; + } else { + $result = (int)SurveyDataSettingProfiles:: getSetting('numOpenAnswers'); + } + return $result; + } + + /** + * Izriši odprrte odgovore za specifičnega učitelja + * + * @param int $variable - ID vpršanja, ki se nahaja v $_HEADERS + * @param array $data + * @return html + */ + public function izrisiOdprteOdgovoreZaUcitelja($variable, $data) + { + global $site_path; + global $global_user_id; + + if (!is_array($data)) + return null; + + + $polje_v_datoteki = '$' . $data['sequences']; +// $filter_za_specificno_anketo = $this->filterHierarhijeZaSpecificnegaUciteljaIzDatoteke(); + + // V sejo shranimo vse strukture, ki ima dotični učitelj + $this->posodobiPodatkeZaUcitelja($global_user_id); + + if (!empty($this->sessionData['means']['strukturaUcitelj'][$this->sessionData['means']['struktura']])) { + $ucitelj_filter = '&& ('; + $ostali_fitri = false; + foreach ($this->sessionData['means']['strukturaUcitelj'][$this->sessionData['means']['struktura']] as $key => $struktura) { + + $ucitelj_filter .= ($ostali_fitri ? ' && ' : null); + $ucitelj_filter .= '($1' . $key . ' == ' . $struktura['stevilka'] . ')'; + $ostali_fitri = true; + } + $ucitelj_filter .= ')'; + } + + + if (is_null($ucitelj_filter)) + return null; + + # začasna datoteka za hierarhijo odprti odgovori + $folder = $site_path . EXPORT_FOLDER . '/'; + $tmp_file = $folder . 'tmp_hierarhija_' . $this->anketa . '.tmp'; + + + // Na začetku datoteke dodamo dataFileName . ' >> ' . $tmp_file; + shell_exec($commandHierarhija); + + // Na koncu datoteke dodamo zaključek php dokumenta + $file_handler = fopen($tmp_file, "a"); + fwrite($file_handler, '?>'); + fclose($file_handler); + + include($tmp_file); + + if (file_exists($tmp_file)) + unlink($tmp_file); + + return $this->izrisiHtmlTabeloZaOdprtOdgovor($odprtiOdgovori); + + } + + /** + * Izrišemo tabelo za odprt odgovor + * + * @param array $odprtiOdgovori + * @return html + */ + private function izrisiHtmlTabeloZaOdprtOdgovor($odprtiOdgovori) + { + foreach ($odprtiOdgovori as $keyVprasanja => $tabela) { + $vprasanje = $this->_HEADERS[$keyVprasanja . '_0']; + + echo '
+ + + + + + + + + + '; + $st = 0; + foreach ($tabela as $keyOdgovor => $odgovori) { + if (!is_numeric($odgovori) && is_string($odgovori)) { + $st++; + echo ' + + + + '; + } + } + echo ' + + + + '; + echo ' +
+ ' . $vprasanje['variable'] . ' + + ' . $vprasanje['naslov'] . ' +
OdgovoriFrekvenca
  +
' . $odgovori . '
+
1
+ Skupaj' . $st . '
'; + } + } + + + /** Izriše tekstovne odgovore v vertikalni obliki + * + * @param unknown_type $spid + */ + public function sumTextVertical($spid, $_from) + { + global $lang; + + # dajemo v bufer, da da ne prikazujemo vprašanj brez veljavnih odgovorov če imamo tako nastavljeno + $spremenljivka = $this->_HEADERS[$spid]; + $_FREQUENCYS = SurveyAnalysis::getFrequencys(); + + # preverimo ali prikazujemo spremenljivko, glede na veljavne odgovore in nastavitev + // Izrisujemo naše odgovore + $only_valid = 0; + if (count($spremenljivka['grids']) > 0) { + foreach ($spremenljivka['grids'] AS $gid => $grid) { + + # dodamo dodatne vrstice z albelami grida + if (count($grid['variables']) > 0) + foreach ($grid['variables'] AS $vid => $variable) { + $_sequence = $variable['sequence']; # id kolone z podatki v text datoteki + $only_valid += (int)$_FREQUENCYS[$_sequence]['validCnt']; + } + + } + } + + // V kolikor ni odgovorov potem nič ne izrisujemo + if (SurveyDataSettingProfiles:: getSetting('hideEmpty') == 1 && $only_valid == 0) { + return; + } + + # dodamo opcijo kje izrisujemo legendo + # če je besedilo * in je samo ena kategorija je inline legd('da');enda false + $inline_legenda = ($this->_HEADERS[$spid]['cnt_all'] == 1 || in_array($spremenljivka['tip'], array(1, 8))) ? false : true; + + # koliko zapisov prikažemo naenkrat + $num_show_records = self::getNumRecords(); + + $options = array('inline_legenda' => $inline_legenda, 'isTextAnswer' => false, 'isOtherAnswer' => false, 'num_show_records' => $num_show_records); + +// if (self :: $show_spid_div == true) { +// echo '
'; +// self::displaySpremenljivkaIcons($spid); +// } + # tekst vprašanja + echo ''; + + // naslovna vrstica tabele + echo ''; + #variabla + echo ''; + + #odgovori + echo ''; + echo ''; + + // Druga vrstica glave pri odprtih odgovorih + echo ''; + #variabla + echo ''; + + #odgovori + echo ''; + // if (self::$_SHOW_LEGENDA && $inline_legenda){ + // echo ''; + // echo ''; + // } + echo ''; + echo ''; + if ($this->_HEADERS[$spid]['show_valid_percent'] == true) { + echo ''; + } + echo ''; + echo ''; + // end naslovne vrstice + + // Prikažemo naše odgovore + $_answersOther = array(); + $_grids_count = count($spremenljivka['grids']); + + if ($_grids_count > 0) + foreach ($spremenljivka['grids'] AS $gid => $grid) { + $_variables_count = count($grid['variables']); + if ($_variables_count > 0) + foreach ($grid['variables'] AS $vid => $variable) { + $_sequence = $variable['sequence']; # id kolone z podatki + + if ($variable['other'] != true) { + # dodamo dodatne vrstice z labelami grida + if ($_variables_count > 1) { + self::outputGridLabelVertical($gid, $grid, $vid, $variable, $spid, $options); + } + + $counter = 0; + $_kumulativa = 0; + + //self::$_FREQUENCYS[$_sequence] + + if (count($_FREQUENCYS[$_sequence]['valid']) > 0) { + $_valid_answers = SurveyAnalysis::sortTextValidAnswers($spid, $variable, $_FREQUENCYS[$_sequence]['valid']); + + foreach ($_valid_answers AS $vkey => $vAnswer) { + if ($counter < $num_show_records || self::$isArchive) { + if ($vAnswer['cnt'] > 0 || true) { # izpisujemo samo tiste ki nisno 0 + $options['isTextAnswer'] = true; + $counter = SurveyAnalysis::outputValidAnswerVertical($counter, $vkey, $vAnswer, $_sequence, $spid, $_kumulativa, $options); + } + } + } + # izpišemo sumo veljavnih + $counter = SurveyAnalysis::outputSumaValidAnswerVertical($counter, $_sequence, $spid, $options); + } + if (count($_FREQUENCYS[$_sequence]['invalid']) > 0) { + foreach ($_FREQUENCYS[$_sequence]['invalid'] AS $ikey => $iAnswer) { + if ($iAnswer['cnt'] > 0) { # izpisujemo samo tiste ki nisno 0 + $counter = SurveyAnalysis::outputInvalidAnswerVertical($counter, $ikey, $iAnswer, $_sequence, $spid, $options); + } + } + # izpišemo sumo veljavnih + $counter = SurveyAnalysis::outputSumaInvalidAnswerVertical($counter, $_sequence, $spid, $options); + } + #izpišemo še skupno sumo +// $counter = self::outputSumaVertical($counter,$_sequence,$spid,$options); + } else { + $_answersOther[] = array('spid' => $spid, 'gid' => $gid, 'vid' => $vid, 'sequence' => $_sequence); + } + } + } + + echo '
'; + echo ''; + echo $spremenljivka['variable']; + echo ''; + echo ''; + echo $spremenljivka['naslov'] . ''; + echo '
'; + // echo self::showIcons($spid,$spremenljivka,$_from); + echo '' . $lang['srv_analiza_frekvence_titleAnswers'] . ''.$lang['srv_analiza_opisne_variable_expression'].''.$lang['srv_analiza_opisne_variable_skala'].'' . $lang['srv_analiza_frekvence_titleFrekvenca'] . '' . $lang['srv_analiza_frekvence_titleOdstotek'] . '' . $lang['srv_analiza_frekvence_titleVeljavni'] . '' . $lang['srv_analiza_frekvence_titleKumulativa'] . '
'; + # izpišemo še tekstovne odgovore za polja drugo + if (count($_answersOther) > 0 && self::$_FILTRED_OTHER) { + foreach ($_answersOther AS $oAnswers) { + echo '
'; + SurveyAnalysis::outputOtherAnswers($oAnswers); + echo '
'; + } + } + +// if (self :: $show_spid_div == true) { +// echo '
'; +// echo '
'; +// } + + } + + static function outputValidAnswerVertical($counter, $vkey, $vAnswer, $_sequence, $spid, &$_kumulativa, $_options = array()) + { + global $lang; + # opcije + + $options = array('isTextAnswer' => false, # ali je tekstovni odgovor + 'isOtherAnswer' => false, # ali je odgovor Drugo + 'inline_legenda' => true, # ali je legenda inline ali v headerju + ); + + foreach ($_options as $_oKey => $_option) { + $options[$_oKey] = $_option; + } + $cssBck = ' ' . self::$cssColors['0_' . ($counter & 1)]; + + $_valid = (self::$_FREQUENCYS[$_sequence]['validCnt'] > 0) ? 100 * $vAnswer['cnt'] / self::$_FREQUENCYS[$_sequence]['validCnt'] : 0; + $_percent = (self::$_FREQUENCYS[$_sequence]['allCnt'] > 0) ? 100 * $vAnswer['cnt'] / self::$_FREQUENCYS[$_sequence]['allCnt'] : 0; + $_kumulativa += $_valid; + + # če smo v arhivih dodamovse odgovore vendar so nekateri skriti + if ($counter >= $options['num_show_records'] && self::$isArchive) { + $cssHide = ' class="displayNone"'; + } + echo ' 0 ? ' vkey="' . $vkey . '"' : '') . $cssHide . '>'; + echo ' '; + echo ''; + echo '
' . $vkey . '
'; + echo(($options['isTextAnswer'] == false && (string)$vkey != $vAnswer['text']) ? ' (' . $vAnswer['text'] . ')' : ''); + # if ( $counter+1 == $options['num_show_records'] && $options['num_show_records'] < count(self::$_FREQUENCYS[$_sequence]['valid'])) { + # echo '
'.$lang['srv_anl_more'].'
'; + # } + echo ''; + if (self::$_SHOW_LEGENDA && $options['isOtherAnswer'] == false && $options['inline_legenda'] == true) { + echo ' '; + echo ' '; + } + + echo ''; + echo (int)$vAnswer['cnt']; + echo ''; + echo ''; + echo self::formatNumber($_percent, SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_PERCENT'), '%'); + echo ''; + if (self::$_HEADERS[$spid]['show_valid_percent']) { + echo ''; + echo self::formatNumber($_valid, SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_PERCENT'), '%'); + echo ''; + } + echo ''; + echo self::formatNumber($_kumulativa, SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_PERCENT'), '%'); + + echo ''; + echo ''; + + # če mamo več + if ($counter + 1 == $options['num_show_records'] && $options['num_show_records'] < count(self::$_FREQUENCYS[$_sequence]['valid'])) { + if (self::$isArchive == false) { + echo ''; + echo ' '; + echo ''; + // Pri javni povezavi drugace izpisemo + if (self::$printPreview == false) { + echo '
' . $lang['srv_anl_more'] . '
'; + echo '
' . $lang['srv_anl_more'] . '
'; + } else { + echo '
' . $lang['srv_anl_more'] . '
'; + echo '
' . $lang['srv_anl_more'] . '
'; + } + echo ''; + if (self::$_SHOW_LEGENDA && $options['isOtherAnswer'] == false && $options['inline_legenda'] == true) { + echo ' '; + echo ' '; + } + echo '' . ''; + echo '' . ''; + if (self::$_HEADERS[$spid]['show_valid_percent']) { + echo '' . ''; + } + echo '' . ''; + echo ''; + } else { + #v arhivie dodamo vse odgovore vendar so skriti + echo ''; + echo ' '; + echo ''; + echo '
' . $lang['srv_anl_all'] . '
'; + echo '
' . $lang['srv_anl_all'] . '
'; + echo ''; + if (self::$_SHOW_LEGENDA && $options['isOtherAnswer'] == false && $options['inline_legenda'] == true) { + echo ' '; + echo ' '; + } + echo '' . ''; + echo '' . ''; + if (self::$_HEADERS[$spid]['show_valid_percent']) { + echo '' . ''; + } + echo '' . ''; + echo ''; + } + } + + $counter++; + return $counter; + } + + + // Izvoz pdf in rtf + function displayExport() + { + + if ($this->isSelectedBothVariables()) { + $vars1 = $this->getSelectedVariables(1); + $vars2 = $this->getSelectedVariables(2); + + $data1 = ''; + $data2 = ''; + + foreach ($vars1 as $var1) { + $data1 .= implode(',', array_values($var1)) . ','; + } + $data1 = substr($data1, 0, -1); + + foreach ($vars2 as $var2) { + $data2 .= implode(',', array_values($var2)) . ','; + } + $data2 = substr($data2, 0, -1); + + + $href_pdf = makeEncodedIzvozUrlString('izvoz.php?b=export&m=hierarhija_pdf_izpis&anketa=' . $this->anketa); +// $href_rtf = 'index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=analize&r=custom'; + $href_rtf = makeEncodedIzvozUrlString('izvoz.php?b=export&m=hierarhija_rtf_izpis&anketa=' . $this->anketa); +// $href_xls = makeEncodedIzvozUrlString('izvoz.php?b=export&m=mean_izpis_xls&anketa=' . $this->anketa); + echo ''; + } + } + + public function setPostVars() + { + if (isset($_POST['sequence1']) && count($_POST['sequence1']) > 0) { + $i = 0; + if (is_array($_POST['sequence1']) && count($_POST['sequence1']) > 0) { + foreach ($_POST['sequence1'] AS $_seq1) { + $this->variabla1[$i]['seq'] = $_seq1; + $i++; + } + } + } + if (isset($_POST['spr1']) && count($_POST['spr1']) > 0) { + $i = 0; + if (is_array($_POST['spr1']) && count($_POST['spr1']) > 0) { + foreach ($_POST['spr1'] AS $_spr1) { + $this->variabla1[$i]['spr'] = $_spr1; + $i++; + } + } + } + if (isset($_POST['grid1']) && count($_POST['grid1']) > 0) { + $i = 0; + if (is_array($_POST['grid1']) && count($_POST['grid1']) > 0) { + foreach ($_POST['grid1'] AS $_grd1) { + $this->variabla1[$i]['grd'] = $_grd1; + $i++; + } + } + } + + if (isset($_POST['sequence2']) && count($_POST['sequence2']) > 0) { + $i = 0; + + if (is_array($_POST['sequence2']) && count($_POST['sequence2']) > 0) { + + foreach ($_POST['sequence2'] AS $_seq2) { + $this->variabla2[$i]['seq'] = $_seq2; + $i++; + } + } + } + if (isset($_POST['spr2']) && count($_POST['spr2']) > 0) { + $i = 0; + if (is_array($_POST['spr2']) && count($_POST['spr2']) > 0) { + foreach ($_POST['spr2'] AS $_spr2) { + $this->variabla2[$i]['spr'] = $_spr2; + $i++; + } + } + } + if (isset($_POST['grid2']) && is_array($_POST['grid2']) && count($_POST['grid2']) > 0) { + $i = 0; + if (count($_POST['grid2']) > 0) { + foreach ($_POST['grid2'] AS $_grd2) { + $this->variabla2[$i]['grd'] = $_grd2; + $i++; + } + } + } + + if (isset($_POST['filter_vrednosti']) && count($_POST['filter_vrednosti']) > 0) { + $this->filter_hierarhija = $_POST['filter_vrednosti']; + } + + if (is_null($_POST['filter_vrednosti'])) { + $this->filter_hierarhija = array(); + } + + // Preverimo, če imamo strukturo za uporabnika in , če do sedaj ni bil izbran še noben filter, potem vedno izberemo vse iz danjega nivoja + $struktura_ucitelja = $this->hierarhijaUporabnika(); + + if (empty($this->sessionData['means']['filterHierarhija']) && $struktura_ucitelja != 'admin' && is_array($struktura_ucitelja)) { + $st_nivojev = sizeof($struktura_ucitelja); + $this->filter_hierarhija['nivo' . $st_nivojev] = $struktura_ucitelja[$st_nivojev]; + } + + # variable shranimo v sejo, da jih obdržimo tudi če spreminjamo nastavitve ali razne filtre analiz + if (isset($this->variabla1) && count($this->variabla1) > 0) { + $this->sessionData['means']['means_variables']['variabla1'] = $this->variabla1; + } + if (isset($this->variabla2) && count($this->variabla2) > 0) { + $this->sessionData['means']['means_variables']['variabla2'] = $this->variabla2; + } + + // Filtriranje po šifrantih + if (isset($this->filter_hierarhija) && sizeof($this->filter_hierarhija) > 0) { + $this->sessionData['means']['filterHierarhija'] = $this->filter_hierarhija; + } + + // Shranimo spremenjene nastavitve v bazo + SurveyUserSession::saveData($this->sessionData); + } + + + /** + * funkcija vrne seznam primern variabel za meanse + */ + function getVariableList($dropdown) + { + if (isset($this->variablesList[$dropdown]) && is_array($this->variablesList[$dropdown]) && count($this->variablesList[$dropdown]) > 0) { + return $this->variablesList[$dropdown]; + } else { + # pobrišemo array() + $this->variablesList = array(); + + + # zloopamo skozi header in dodamo variable (potrebujemo posamezne sekvence) + foreach ($this->_HEADERS AS $skey => $spremenljivka) { + if ((int)$spremenljivka['hide_system'] == 1 && in_array($spremenljivka['variable'], array('email', 'ime', 'priimek', 'telefon', 'naziv', 'drugo'))) { + continue; + } + + $tip = $spremenljivka['tip']; + + $skala = (int)$spremenljivka['skala']; + # pri drugi, analizirani variabli morajo biti numerične ali ordinalne, v ostalem pa nič) + # skala - 0 Ordinalna + # skala - 1 Nominalna + $_dropdown_condition = $dropdown == 1 + || ($dropdown == 2 + && ($skala == 0 # ordinalna + || $tip == 7 # number + || $tip == 6 + || $tip == 18 # vsota + || $tip == 20)) # multi number + ? true : false; + + //V kolikor gre za prvi meni, potem notri dodamo samo vlogo, ki jo bomo naknadno skrili pri prikazu + if ((is_numeric($tip) + && $tip != 4 #text + && $tip != 5 #label + && $tip != 9 #SN-imena + && $tip != 22 #compute + && $_dropdown_condition # ali ustreza pogoju za meanse + && $dropdown != 1) + || (is_numeric($tip) + && $tip == 1 + && $dropdown == 1) + ) { + + $cnt_all = (int)$spremenljivka['cnt_all']; + # radio in select in checkbox + if ($cnt_all == '1' || $tip == 1 || $tip == 3 || $tip == 2) { + + + # pri tipu radio ali select dodamo tisto variablo ki ni polje "drugo" + if (($tip == 1 || $tip == 3)) { + if (count($spremenljivka['grids']) == 1) { + + # če imamo samo en grid ( lahko je več variabel zaradi polja drugo. + $grid = $spremenljivka['grids'][0]; + if (count($grid['variables']) > 0) { + foreach ($grid['variables'] AS $vid => $variable) { + + //Tukaj zapišemo, samo če gre za vlogo, ker bomo delali anlize po teh vrednostih + if (($variable['other'] != 1 && $dropdown == 2) || ($variable['variable'] == 'vloga' && $dropdown == 1)) { + # imampo samo eno sekvenco grids[0]variables[0] + $this->variablesList[$dropdown][] = array( + 'tip' => $tip, + 'spr_id' => $skey, + 'sequence' => $spremenljivka['grids'][0]['variables'][$vid]['sequence'], + 'variableNaslov' => '(' . $spremenljivka['variable'] . ') ' . strip_tags($spremenljivka['naslov']), + 'canChoose' => true, + 'sub' => 0); + + } + + } + } + } + } else if ($skala == 1 || true) { # ta pogoj skala == 1 je malo sumljiv. ne vem več zakaj je tako + + # imampo samo eno sekvenco grids[0]variables[0] + $this->variablesList[$dropdown][] = array( + 'tip' => $tip, + 'spr_id' => $skey, + 'sequence' => $spremenljivka['grids'][0]['variables'][0]['sequence'], + 'variableNaslov' => '(' . $spremenljivka['variable'] . ') ' . strip_tags($spremenljivka['naslov']), + 'canChoose' => true, + 'sub' => 0); + } + } else if ($cnt_all > 1) { + + # imamo več skupin ali podskupin, zato zlopamo skozi gride in variable + if (count($spremenljivka['grids']) > 0) { + $this->variablesList[$dropdown][] = array( + 'tip' => $tip, + + 'variableNaslov' => '(' . $spremenljivka['variable'] . ') ' . strip_tags($spremenljivka['naslov']), + 'canChoose' => false, + 'sub' => 0); + # ali imamo en grid, ali več (tabele + if (count($spremenljivka['grids']) == 1) { + # če imamo samo en grid ( lahko je več variabel zaradi polja drugo. + $grid = $spremenljivka['grids'][0]; + if (count($grid['variables']) > 0) { + foreach ($grid['variables'] AS $vid => $variable) { + if ($variable['other'] != 1) { + $this->variablesList[$dropdown][] = array( + 'tip' => $tip, + 'spr_id' => $skey, + 'sequence' => $variable['sequence'], + 'variableNaslov' => '(' . $variable['variable'] . ') ' . strip_tags($variable['naslov']), + 'canChoose' => true, + 'sub' => 1); + } + } + } + + } else if ($tip == 16 || $tip == 18) { + # imamo multicheckbox + foreach ($spremenljivka['grids'] AS $gid => $grid) { + $sub = 0; + if ($grid['variable'] != '') { + $sub++; + $this->variablesList[$dropdown][] = array( + 'tip' => $tip, + 'spr_id' => $skey, + 'grd_id' => $gid, + 'sequence' => $grid['variables'][0]['sequence'], + 'variableNaslov' => '(' . $grid['variable'] . ') ' . strip_tags($grid['naslov']), + 'canChoose' => true, + 'sub' => 1); + } + } + } else { + # imamo več gridov - tabele + foreach ($spremenljivka['grids'] AS $gid => $grid) { + $sub = 0; + if ($grid['variable'] != '') { + $sub++; + $this->variablesList[$dropdown][] = array( + 'tip' => $tip, + 'variableNaslov' => '(' . $grid['variable'] . ') ' . strip_tags($grid['naslov']), + 'canChoose' => false, + 'sub' => $sub); + } + if (count($grid['variables']) > 0) { + $sub++; + foreach ($grid['variables'] AS $vid => $variable) { + if ($variable['other'] != 1) { + $this->variablesList[$dropdown][] = array( + 'tip' => $tip, + 'spr_id' => $skey, + 'sequence' => $variable['sequence'], + 'variableNaslov' => '(' . $variable['variable'] . ') ' . strip_tags($variable['naslov']), + 'canChoose' => true, + 'sub' => $sub); + } + } + } + } + } + + } + } + } + } + return $this->variablesList[$dropdown]; + } + } + + function isSelectedBothVariables() + { + $selected1 = false; + $selected2 = false; + if (count($this->variabla1)) { + foreach ($this->variabla1 AS $var1) { + if ((int)$var1['seq'] > 0) { + $selected1 = true; + } + } + } + if (count($this->variabla2)) { + foreach ($this->variabla2 AS $var2) { + if ((int)$var2['seq'] > 0) { + $selected2 = true; + } + } + } + + return ($selected1 && $selected2); + } + + + function getSelectedVariables($which = 1) + { + $selected = array(); + if ($which == 1) { + if (count($this->variabla1) > 0) { + foreach ($this->variabla1 AS $var1) { + if ((int)$var1['seq'] > 0) { + $selected[] = $var1; + } + } + } + } else { + if (count($this->variabla2) > 0) { + foreach ($this->variabla2 AS $var2) { + if ((int)$var2['seq'] > 0) { + $selected[] = $var2; + } + } + } + } + + return count($selected) > 0 ? $selected : null; + } + + + public function createMeans($v_first, $v_second) + { + global $site_path; + + $folder = $site_path . EXPORT_FOLDER . '/'; + + if ($this->dataFileName != '' && file_exists($this->dataFileName)) { + + $spr1 = $this->_HEADERS[$v_first['spr']]; + $spr2 = $this->_HEADERS[$v_second['spr']]; + + $grid1 = $spr1['grids'][$v_first['grd']]; + $grid2 = $spr2['grids'][$v_second['grd']]; + + $sequence1 = $v_first['seq']; + $sequence2 = $v_second['seq']; + + # za checkboxe gledamo samo odgovore ki so bili 1 in za vse opcije + $sekvences1 = array(); + $sekvences2 = array(); + $spr_1_checkbox = false; + $spr_2_checkbox = false; + + if ($spr1['tip'] == 2 || $spr1['tip'] == 16) { + $spr_1_checkbox = true; + if ($spr1['tip'] == 2) { + $sekvences1 = explode('_', $spr1['sequences']); + } + if ($spr1['tip'] == 16) { + + foreach ($grid1['variables'] AS $_variables) { + $sekvences1[] = $_variables['sequence']; + } + } + } else { + $sekvences1[] = $sequence1; + } + + if ($spr2['tip'] == 2 || $spr2['tip'] == 16) { + $spr_2_checkbox = true; + if ($spr2['tip'] == 2) { + $sekvences2 = explode('_', $this->_HEADERS[$v_second['spr']]['sequences']); + } + if ($spr2['tip'] == 16) { + foreach ($grid2['variables'] AS $_variables) { + $sekvences2[] = $_variables['sequence']; + } + } + } else { + $sekvences2[] = $sequence2; + } + + # pogoji so že dodani v _CURRENT_STATUS_FILTER + + # dodamo filter za loop-e + if (isset($this->_CURRENT_LOOP['filter']) && $this->_CURRENT_LOOP['filter'] != '') { + $status_filter = $this->_CURRENT_STATUS_FILTER . ' && ' . $this->_CURRENT_LOOP['filter']; + } else { + $status_filter = $this->_CURRENT_STATUS_FILTER; + } + + + # dodamo status filter za vse sekvence checkbox-a da so == 1 + if ($additional_status_filter != null) { + $status_filter .= $additional_status_filter; + } + + # odstranimo vse zapise, kjer katerakoli od variabel vsebuje missing + $_allMissing_answers = SurveyMissingValues::GetMissingValuesForSurvey(array(1, 2, 3)); + $_pageMissing_answers = $this->getInvalidAnswers(MISSING_TYPE_CROSSTAB); + # polovimo obe sequenci + $tmp_file = $folder . 'tmp_means_' . $this->anketa . '.tmp'; + + // Na začetku datoteke dodamo 0) + foreach ($sekvences1 AS $sequence1) { + if (count($sekvences2) > 0) + foreach ($sekvences2 AS $sequence2) { + #skreira variable: $meansArray + $additional_filter = ''; + if ($spr_1_checkbox == true) { + $_seq_1_text = '' . $sequence1; + + # pri checkboxih gledamo samo kjer je 1 ( ne more bit missing) + $additional_filter = ' && ($' . $sequence1 . ' == 1)'; + } else { + $_seq_1_text = '$' . $sequence1; + + # dodamo še pogoj za missinge + foreach ($_pageMissing_answers AS $m_key1 => $missing1) { + $additional_filter .= ' && ($' . $sequence1 . ' != ' . $m_key1 . ')'; + } + } + + if ($spr_2_checkbox == true) { + $_seq_2_text = '' . $sequence2; + + # pri checkboxih gledamo samo kjer je 1 ( ne more bit missing) + $additional_filter .= ' && ($' . $sequence2 . ' == 1)'; + } else { + $_seq_2_text = '$' . $sequence2; + + # dodamo še pogoj za missinge + foreach ($_pageMissing_answers AS $m_key2 => $missing2) { + $additional_filter .= ' && ($' . $sequence2 . ' != ' . $m_key2 . ')'; + } + } + + # V kolikor smo izbrali filtre potem prikažemo samo ustrezne rezultate glede na filtre + ## Postavimo filter za hierarhijo na null + $hierarhija_filter = $this->filterHierarhijeIzTekstovneDatoteke(); + + // V kolikor imamo filter po učiteljih + $ucitelj_filter = $this->filterHierarhijeZaSpecificnegaUciteljaIzDatoteke(); + + if (IS_WINDOWS) { + $command = 'awk -F"|" "BEGIN {{OFS=\"\"} {ORS=\"\n\"}} ' . $status_filter . $additional_filter . (!empty($ucitelj_filter) ? $ucitelj_filter : $hierarhija_filter) . ' { print \"$meansArray[\x27\",' . $_seq_2_text . ',\"\x27][\x27\",' . $_seq_1_text . ',\"\x27]++;\"}" ' . $this->dataFileName . ' >> ' . $tmp_file; + } else { + $command = 'awk -F"|" \'BEGIN {{OFS=""} {ORS="\n"}} ' . $status_filter . $additional_filter . (!empty($ucitelj_filter) ? $ucitelj_filter : $hierarhija_filter) . ' { print "$meansArray[\x27",' . $_seq_2_text . ',"\x27][\x27",' . $_seq_1_text . ',"\x27]++;"}\' ' . $this->dataFileName . ' >> ' . $tmp_file; + } + $out = shell_exec($command); + + } + + } + + // Na koncu datoteke dodamo zaključek php dokumenta + $file_handler = fopen($tmp_file, "a"); + fwrite($file_handler, '?>'); + fclose($file_handler); + + include($tmp_file); + + if (file_exists($tmp_file)) { + unlink($tmp_file); + } + + # izračunamo povprečja + $means = array(); + $max_vrednost = array(); + $min_vrednost = array(); + $sumMin = null; + $sumMax = null; + $sumStdDeviation = null; + $_tmp_sumaMeans = 0; + $sum_std_dev = array(); + if (is_array($meansArray) && count($meansArray) > 0) { + foreach ($meansArray AS $f_key => $first) { + $tmp_sum = 0; + $tmp_cnt = 0; + $min = null; + $max = null; + + //$s_key je vrednost odgovora in zato vzamemo min in max + foreach ($first AS $s_key => $second) { + # preverimo da je vse numeric + if (is_numeric($s_key) && is_numeric($second)) { + $tmp_sum = $tmp_sum + ($s_key * $second); + $tmp_cnt = $tmp_cnt + $second; + } + + if (is_null($min) || $min > $s_key) + $min = $s_key; + + if (is_null($max) || $max < $s_key) + $max = $s_key; + + if (is_null($sumMin) || $sumMin > $s_key) + $sumMin = $s_key; + + if (is_null($sumMax) || $sumMax < $s_key) + $sumMax = $s_key; + } + + + $_tmp_sumaMeans += $tmp_sum; + $key = $f_key; + if ($tmp_cnt != 0) { + $means[$key] = bcdiv($tmp_sum, $tmp_cnt, 3); + } else { + $means[$key] = bcdiv(0, 1, 3); + } + + //računamo še standardno deviacijo + $st_rezultatov = 0; + $std_dev = []; + $polje = []; + foreach ($first AS $s_key => $second) { + # preverimo da je vse numeric + if (is_numeric($s_key) && is_numeric($second)) { + $std_vmesna = pow(($s_key - $means[$key]), 2); + $std_dev[] = $std_vmesna * $second; + $st_rezultatov = $st_rezultatov + $second; + } + } + + //Prevzeto je standardna deviacija 0, ker pri učiteljih imamo samo 1 rezltat in ne moremo računati po njem + $std_deviacija[$key] = 0; + + //izračunamo standardno diviacio za učence + if (array_sum($std_dev) > 0) + $std_deviacija[$key] = sqrt((array_sum($std_dev) / ($st_rezultatov - 1))); + + + //Vpišemo min in max vrednost za sledeče vprašanje + $max_vrednost[$key] = $max; + $min_vrednost[$key] = $min; + + } + + } + + + # inicializacija + $_all_options = array(); + $sumaVrstica = array(); + $sumaSkupna = 0; + $sumaMeans = 0; + + # poiščemo pripadajočo spremenljivko + $var_options = $this->_HEADERS[$v_second['spr']]['options']; + + # najprej poiščemo (združimo) vse opcije ki so definirane kot opcije spremenljivke in vse ki so v meansih + if (count($var_options) > 0 && $spr_2_checkbox !== true) { + foreach ($var_options as $okey => $opt) { + $_all_options[$okey] = array('naslov' => $opt, 'type' => 'o'); + } + } + + # za checkboxe dodamo posebej vse opcije + if ($spr_2_checkbox == true) { + if ($spr2['tip'] == 2) { + $grid2 = $this->_HEADERS[$v_second['spr']]['grids']['0']; + } + + foreach ($grid2['variables'] As $vkey => $variable) { + if ($variable['other'] != 1) { + $_all_options[$variable['sequence']] = array('naslov' => $variable['naslov'], 'type' => 'o', 'vr_id' => $variable['variable']); + } + } + } + + # dodamo odgovore iz baze ki niso missingi + if (count($meansArray) > 0) { + foreach ($meansArray AS $_kvar1 => $_var1) { + # missingov ne dodajamo še zdaj, da ohranimo pravilen vrstni red + foreach ($_var1 AS $_kvar2 => $_var2) { + if (!isset($_allMissing_answers[$_kvar1]) || (isset($_allMissing_answers[$_kvar1]) && isset($_pageMissing_answers[$_kvar1]))) { + $sumaVrstica[$_kvar1] += $_var2; + } + } + # missingov ne dodajamo še zdaj, da ohranimo pravilen vrstni red + if (!isset($_allMissing_answers[$_kvar1]) && !isset($_all_options[$_kvar1])) { + $_all_options[$_kvar1] = array('naslov' => $_kvar1, 'type' => 't'); + } + + } + } + # dodamo še missinge, samo tiste ki so izbrani z profilom + foreach ($_allMissing_answers AS $miskey => $_missing) { + if (!isset($_pageMissing_answers[$miskey])) { + if ($spr_2_checkbox !== true) { + $_all_options[$miskey] = array('naslov' => $_missing, 'type' => 'm'); + } + } + } + $sumaSkupna = array_sum($sumaVrstica); + $sumaMeans = ($sumaSkupna > 0) ? $_tmp_sumaMeans / $sumaSkupna : 0;; + + # če lovimo po enotah, moramo skupne enote za vsako kolono(vrstico) izračunati posebej + if ($this->crossNavVsEno == 1) { + $sumaSkupna = 0; + $sumaVrstica = array(); + + # sestavimo filtre za posamezno variablo da ni missing + if (count($sekvences1) > 0) { + $spr1_addFilter = ''; + + foreach ($sekvences1 AS $sequence1) { + # dodamo še pogoj za missinge + foreach ($_pageMissing_answers AS $m_key1 => $missing1) { + $spr1_addFilter .= ' && ($' . $sequence1 . ' != ' . $m_key1 . ')'; + } + } + } + if (count($sekvences2) > 0) { + $spr2_addFilter = ''; + + foreach ($sekvences2 AS $sequence2) { + # dodamo še pogoj za missinge + foreach ($_pageMissing_answers AS $m_key2 => $missing2) { + $spr2_addFilter .= ' && ($' . $sequence2 . ' != ' . $m_key2 . ')'; + } + } + } + + # polovimo obe sequenci + $tmp_file = $folder . 'tmp_means_' . $this->anketa . '.TMP'; + + + $file_handler = fopen($tmp_file, "w"); + fwrite($file_handler, "dataFileName . ' >> ' . $tmp_file; + } else { + $command_all = 'awk -F"|" \'BEGIN {{OFS=""} {ORS="\n"}} ' . $status_filter . $spr1_addFilter . $spr2_addFilter . ' { print "$sumaSkupna++;"}\' ' . $this->dataFileName . ' >> ' . $tmp_file; + } + + $out_all = shell_exec($command_all); + + + #za vsako variablo polovimo število enot + #najprej za stolpce + if (count($sekvences1) > 0) { + foreach ($sekvences1 AS $sequence1) { + if ($spr_1_checkbox == true) { + $_seq_1_text = '' . $sequence1; + # pri checkboxih lovimo samo tiste ki so 1 + $chckbox_filter1 = ' && ($' . $sequence1 . ' == 1)'; + } else { + $_seq_1_text = '$' . $sequence1; + } + + if (IS_WINDOWS) { + $command_1 = 'awk -F"|" "BEGIN {{OFS=\"\"} {ORS=\"\n\"}} ' . $status_filter . $chckbox_filter1 . $spr2_addFilter . ' { print \"$sumaVrstica[\x27\",' . $_seq_1_text . ',\"\x27]++;\"}" ' . $this->dataFileName . ' >> ' . $tmp_file; + } else { + $command_1 = 'awk -F"|" \'BEGIN {{OFS=""} {ORS="\n"}} ' . $status_filter . $chckbox_filter1 . $spr2_addFilter . ' { print "$sumaVrstica[\x27",' . $_seq_1_text . ',"\x27]++;"}\' ' . $this->dataFileName . ' >> ' . $tmp_file; + } + $out = shell_exec($command_1); + } + } + } + + # skupna standardna deviacija + if (!is_null($meansArray)) { + $sum_std_dev = array(); + foreach ($meansArray AS $row) { + foreach ($row AS $value => $st) { + if (is_numeric($value) && is_numeric($st)) { + $sum_vmesna = pow(($value - $sumaMeans), 2); + $sum_std_dev[] = $sum_vmesna * $st; + } + } + } + + $sum_std_deviacija = 0; + // Izračunamo skupno standardno deviacijo + if (array_sum($sum_std_dev) > 0) + $sum_std_deviacija = sqrt((array_sum($sum_std_dev) / ($sumaSkupna - 1))); + } + + $meansArr['v1'] = $v_first; # prva variabla + $meansArr['v2'] = $v_second; # druga variabla + $meansArr['result'] = $means; # povprečja + $meansArr['options'] = $_all_options; # vse opcije za variablo 2 + $meansArr['max'] = $max_vrednost; #Max vrednost pri odgovorih + $meansArr['min'] = $min_vrednost; #Min vrednost pri odgovorih + $meansArr['stdDeviation'] = $std_deviacija; + $meansArr['sumaMin'] = $sumMin; #Min vrednost pri vseh odgovorih + $meansArr['sumaMax'] = $sumMax; #Max vrednost pri vseh odgovorih + $meansArr['sumaStdDeviation'] = $sum_std_deviacija; + $meansArr['sumaVrstica'] = $sumaVrstica; #št odgovorov glede na vrstice + $meansArr['sumaSkupna'] = $sumaSkupna; #skupno št. odgovorov + $meansArr['sumaMeans'] = $sumaMeans; #skupno povprečje + + return $meansArr; + } + } + + /** + * Standardna diviacija + * + * @param (array) $a + * @return integer + */ + private function stats_standard_deviation(array $a, $sample = false) + { + $n = count($a); + if ($n === 0) { + trigger_error("The array has zero elements", E_USER_WARNING); + return false; + } + if ($sample && $n === 1) { + trigger_error("The array has only 1 element", E_USER_WARNING); + return false; + } + $mean = array_sum($a) / $n; + $carry = 0.0; + foreach ($a as $val) { + $d = ((double)$val) - $mean; + $carry += $d * $d; + }; + if ($sample) { + --$n; + } + return sqrt($carry / $n); + } + + /** + * Filter po hierarhiji za filtriranje pdoatkov iz tekstovne datoteke + * + * @return null || string + */ + public function filterHierarhijeIzTekstovneDatoteke() + { + if (!is_array($this->sessionData['means']['filterHierarhija']) || empty($this->sessionData['means']['filterHierarhija'])) + return null; + + $hierarhija_filter = null; + + if (is_array($this->sessionData['means']['filterHierarhija'])) { + foreach ($this->sessionData['means']['filterHierarhija'] as $nivo_key => $polje) { + $hierarhija_filter .= ' && ('; + + if (!is_null($polje) && is_array($polje)) { + foreach ($polje as $key => $vrednost) { + $nivo = trim($nivo_key, 'nivo'); + + if (sizeof($polje) > 1) { + if ($key != 0) + $hierarhija_filter .= ' || '; //OR uporabimo, kadar iščemo po več spremenljivkah na istem nivoju + $hierarhija_filter .= '($1' . $nivo . ' == ' . $vrednost . ')'; + } else { + $hierarhija_filter .= '($1' . $nivo . ' == ' . $vrednost . ')'; + } + + } + } + + $hierarhija_filter .= ')'; + } + } + + return $hierarhija_filter; + } + + /** + * Filter hierarhije za specifičnega učitelja + * + * @return null || string + */ + public function filterHierarhijeZaSpecificnegaUciteljaIzDatoteke() + { + global $global_user_id; + +// $this->posodobiPodatkeZaUcitelja($global_user_id); + + if (!empty($this->struktura) || empty($this->sessionData['means']['strukturaUcitelj']) || sizeof($this->sessionData['means']['strukturaUcitelj']) == 0) + return null; + + + $ucitelj_filter = ' && ('; + + // Gremo po vsej strukturi, kjer se nahaja učitelj lahko je 1 ali pa jih je več + // Ključ je ID strukture - srv_hierarhija_struktura table + $oklepaj = false; + foreach ($this->sessionData['means']['strukturaUcitelj'] as $key => $struktura) { + // Vse nadalne poizvedbe vsebujejo OR - kje je treba pridobiti podatke iz vseh struktur + $ucitelj_filter .= ($oklepaj ? ' || (' : ' ('); + + foreach ($struktura as $nivo => $vrednost) { + $ucitelj_filter .= ($nivo != key($struktura) ? ' && ' : null); + $ucitelj_filter .= '($1' . $nivo . ' == ' . $vrednost['stevilka'] . ')'; + } + + $ucitelj_filter .= ')'; + $oklepaj = true; + } + + $ucitelj_filter .= ' )'; + + return $ucitelj_filter; + + } + + + /** + * Prikaže tabelo s povprečji, min, max in standardna deviacija + * + * @param $_means + * @return html + */ + function displayMeansTable($_means) + { + global $lang; + + #število vratic in število kolon + $cols = count($_means); + # preberemo kr iz prvega loopa + $rows = count($_means[0]['options']); + + + # ali prikazujemo vrednosti variable pri spremenljivkah + $show_variables_values = $this->doValues; + + $showSingleUnits = $this->sessionData['means']['meansJoinPercentage'] == true && $this->sessionData['means']['meansSeperateTables'] == false; + + # izrišemo tabelo + echo ''; + echo ''; + echo ''; + echo ''; + for ($i = 0; $i < $cols; $i++) { + echo ''; + if ($showSingleUnits == false) { + echo ''; + } + } + if ($showSingleUnits == true) { + echo ''; + } + echo ''; + + echo ''; + #echo ''; + # ime variable + # teksti labele: + $label2 = $this->getSpremenljivkaTitle($_means[0]['v2']); + if ($showSingleUnits == false) { + $span = ' colspan="5"'; + } + echo ''; + + for ($i = 0; $i < $cols; $i++) { + echo ''; + } + if ($showSingleUnits == true) { + echo ''; + } + echo ''; + echo ''; + + for ($i = 0; $i < $cols; $i++) { + #Povprečje + echo ''; + #enote + if ($showSingleUnits == false) { + echo ''; + } + + #Min + echo ''; + + #Max + echo ''; + + #Standardna deviacija + echo ''; + } + if ($showSingleUnits == true) { + echo ''; + } + + echo ''; + + if (count($_means[0]['options']) > 0) { + + foreach ($_means[0]['options'] as $ckey2 => $crossVariabla2) { + + $units_per_row = 0; + echo ''; + echo ''; + + # celice z vsebino + for ($i = 0; $i < $cols; $i++) { + echo ''; + if ($showSingleUnits == false) { + echo ''; + } else { + $units_per_row = max($units_per_row, (int)$_means[$i]['sumaVrstica'][$ckey2]); + } + + #Min - rezultati + echo ''; + + #Max - rezultati + echo ''; + + #Standardna deviacija - rezultati + echo ''; + + } + if ($showSingleUnits == true) { + echo ''; + } + echo ''; + $max_units += $units_per_row; + } + } + echo ''; + echo ''; + + for ($i = 0; $i < $cols; $i++) { + echo ''; + if ($showSingleUnits == false) { + echo ''; + } + + #Skupaj Min + echo ''; + + #Skupaj Max + echo ''; + + #Skupaj standardna deviacija + echo ''; + + } + if ($showSingleUnits == true) { + echo ''; + } + + echo ''; + echo '
xx '; + echo $label2; + echo ''; + $label1 = $this->getSpremenljivkaTitle($_means[$i]['v1']); + echo $label1; + echo ' 
'; + echo $lang['srv_means_label']; + echo '' . $lang['srv_hierarchy_label_st'] . ''; + echo $lang['srv_hierarchy_label_min']; + echo ''; + echo $lang['srv_hierarchy_label_max']; + echo ''; + echo $lang['srv_hierarchy_label_std_dev']; + echo '' . $lang['srv_hierarchy_label_st'] . '
'; + echo $crossVariabla2['naslov']; + # če ni tekstovni odgovor dodamo key + if ($crossVariabla2['type'] !== 't') { + if ($show_variables_values == true) { + if ($crossVariabla2['vr_id'] == null) { + echo ' ( ' . $ckey2 . ' )'; + } else { + echo ' ( ' . $crossVariabla2['vr_id'] . ' )'; + } + } + } + echo ''; + echo $this->formatNumber($_means[$i]['result'][$ckey2], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL')); + echo ''; + echo (int)$_means[$i]['sumaVrstica'][$ckey2]; + echo ''; + echo $this->formatNumber($_means[$i]['min'][$ckey2], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL')); + echo ''; + echo $this->formatNumber($_means[$i]['max'][$ckey2], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL')); + echo ''; + echo $this->formatNumber($_means[$i]['stdDeviation'][$ckey2], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL')); + echo ''; + echo $units_per_row; + echo '
' . $lang['srv_means_label3'] . ''; + echo $this->formatNumber($_means[$i]['sumaMeans'], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL')); + echo ''; + echo (int)$_means[$i]['sumaSkupna']; + echo ''; + echo $this->formatNumber($_means[$i]['sumaMin'], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL')); + echo ''; + echo $this->formatNumber($_means[$i]['sumaMax'], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL')); + echo ''; + echo $this->formatNumber($_means[$i]['sumaStdDeviation'], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL')); + echo ''; + echo $max_units; + echo '
'; + } + + /** Sestavi array nepravilnih odgovorov + * + */ + function getInvalidAnswers($type) + { + $result = array(); + $missingValuesForAnalysis = SurveyMissingProfiles:: GetMissingValuesForAnalysis($type); + + foreach ($missingValuesForAnalysis AS $k => $answer) { + $result[$k] = array('text' => $answer, 'cnt' => 0); + } + return $result; + } + + + /** Naredimo formatiran izpis + * + * @param $value + * @param $digit + * @param $sufix + */ + + static function formatNumber($value, $digit = 0, $sufix = "") + { + if ($value <> 0 && $value != null) + $result = round($value, $digit); + else + $result = "0"; + + # polovimo decimalna mesta in vejice za tisočice + + $decimal_point = SurveyDataSettingProfiles:: getSetting('decimal_point'); + $thousands = SurveyDataSettingProfiles:: getSetting('thousands'); + + $result = number_format($result, $digit, $decimal_point, $thousands) . $sufix; + + return $result; + } + + //Dodajamo novo variablo iz spustnega seznama, vendar bo v našem primeru tole zaprto + function addNewVariable() + { + global $lang; + $which = $_POST['which']; + $variables = $this->getVariableList($which); + $multiple = true; + + if ($which == '1') { + echo '
'; + echo ' '; + echo ''; + echo ''; + + } else { + # which = 2 + echo '
'; + echo ' '; + echo ''; + echo ''; + } + } + + function getSpremenljivkaTitle($v_first) + { + global $lang; + # podatki spremenljivk + $spremenljivka_id = $v_first['spr']; + $grid_id = $v_first['grd']; + $sekvenca = $v_first['seq']; + + $spremenljivka = $this->_HEADERS[$spremenljivka_id]; + $grid = $spremenljivka['grids'][$grid_id]; + + + # za multicheckboxe popravimo naslov, na podtip + $labela = null; + if ($spremenljivka['tip'] == '6' || $spremenljivka['tip'] == '7' || $spremenljivka['tip'] == '16' || $spremenljivka['tip'] == '17' || $spremenljivka['tip'] == '18' || $spremenljivka['tip'] == '19' || $spremenljivka['tip'] == '20' || $spremenljivka['tip'] == '21') { + foreach ($spremenljivka['grids'] AS $grids) { + foreach ($grids['variables'] AS $variable) { + if ($variable['sequence'] == $sekvenca) { + $labela .= ''; + $labela .= ''; + $labela .= strip_tags($spremenljivka['naslov']); + if ($show_variables_values == true) { + $labela .= ' (' . strip_tags($spremenljivka['variable']) . ')'; + } + $labela .= ''; + $labela .= ''; + + if ($spremenljivka['tip'] == '16') { + if (strip_tags($grid['naslov']) != $lang['srv_new_text']) { + $labela .= '
' . strip_tags($grid['naslov']); + } + $labela .= ' (' . strip_tags($grid['variable']) . ')'; + } else { + if (strip_tags($variable['naslov']) != $lang['srv_new_text']) { + $labela .= '
' . strip_tags($variable['naslov']); + } + if ($show_variables_values == true) { + $labela .= ' (' . strip_tags($variable['variable']) . ')'; + } + } + + } + } + } + } + if ($labela == null) { + $labela = ''; + $labela .= ''; + $labela .= strip_tags($spremenljivka['naslov']); + if ($show_variables_values == true) { + $labela .= ' (' . strip_tags($spremenljivka['variable']) . ')'; + } + $labela .= ''; + $labela .= '' . NEW_LINE; + } + return $labela; + } + + function changeMeansSubSetting() + { + $this->sessionData['means']['meansSeperateTables'] = ($_POST['chkMeansSeperate'] == 1); + $this->sessionData['means']['meansJoinPercentage'] = ($_POST['chkMeansJoinPercentage'] == 1); + + // Shranimo spremenjene nastavitve v bazo + SurveyUserSession::saveData($this->sessionData); + } + + function changeMeansShowChart() + { + $this->sessionData['mean_charts']['showChart'] = ($_POST['showChart'] == 'true'); + $this->sessionData['means']['meansSeperateTables'] = ($_POST['showChart'] == 'true') ? true : $this->sessionData['means']['meansSeperateTables']; + $this->sessionData['means']['meansJoinPercentage'] = ($_POST['showChart'] == 'true') ? true : $this->sessionData['means']['meansJoinPercentage']; + + // Shranimo spremenjene nastavitve v bazo + SurveyUserSession::saveData($this->sessionData); + } + + + function presetVariables() + { + # preberemo prednastavljene variable iz seje, če obstajajo + if (isset($this->sessionData['means']['means_variables']['variabla1']) && count($this->sessionData['means']['means_variables']['variabla1']) > 0) { + $this->variabla1 = $this->sessionData['means']['means_variables']['variabla1']; + } + + if (isset($this->sessionData['means']['means_variables']['variabla2']) && count($this->sessionData['means']['means_variables']['variabla2']) > 0) { + + $this->variabla2 = $this->sessionData['means']['means_variables']['variabla2']; + + } + } +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/HierarhijaClass.php b/admin/survey/modules/mod_hierarhija/class/HierarhijaClass.php new file mode 100644 index 0000000..37bf787 --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/HierarhijaClass.php @@ -0,0 +1,2261 @@ +anketa = $anketa; + $this->lang = $lang; + $this->hierarhija_type = HierarhijaHelper::preveriTipHierarhije($this->anketa); + $this->user = $global_user_id; + $this->admin_type = $admin_type; + $this->url = $site_url; + $this->modul = \SurveyInfo::getSurveyModules(); + } + + /** + * Inicializacija hierarhije + * + * @param + * + * @return + */ + public static function hierarhijaInit($anketa) + { + $new = new Hierarhija($anketa); + $new->DolociPraviceUporabniku(); + $new->izrisisSistemskoVprsanjeVloga(); + $new->hierarhijaSuperadminSifranti(); + } + + /** + * Uporabniku določimo pravice, če vključi anketo dobi type 1 - admin + * hierarhije + */ + public function dolociPraviceUporabniku() + { + if (is_null($this->hierarhija_type)) { + + // Preverimo, kdo je anketo ustvaril + $sql_dostop = sisplet_query("SELECT type FROM srv_hierarhija_users WHERE anketa_d='".$this->anketa."' AND user_id='".$this->user."'", "obj"); + + if(empty($sql_dostop)) + $user_query = sisplet_query("INSERT INTO srv_hierarhija_users (user_id, anketa_id, type) VALUES ('".$this->user."', '$this->anketa', 1)"); + + + if (!$user_query && $this->admin_type == 0) { + echo mysqli_error($GLOBALS['connect_db']); + } + } + } + + /** + * Ko se kativira anketa se določi prvo sistemsko vprašanje VLOGA (učenece, + * učitelj) to vprašanje samo 1 izrišemo in potem nikoli več + */ + public function izrisisSistemskoVprsanjeVloga() + { + //Preverimo, če je sistemsko vprašanje vloga že ustvarjeno + $grup_id = sisplet_query("SELECT id, vrstni_red FROM srv_grupa WHERE ank_id='" . $this->anketa . "' ORDER BY vrstni_red LIMIT 0,1", "obj"); + $sql_vpisane_spr = sisplet_query("SELECT id, gru_id, variable, vrstni_red FROM srv_spremenljivka WHERE gru_id='" . $grup_id->id . "' AND variable='vloga'"); + + //V kolikor je vloga že vnešena in ni postavljena na prvo mesto, potem jo moramo premakniti na prvo mesto + if (mysqli_num_rows($sql_vpisane_spr) == 0) { + + //preštevilčimo ostala vprašanja za 1 + (new HierarhijaAjax($this->anketa))->prestevilciBranching(0, TRUE); + + //vedno ustavimo vlogo (učenec - učitelj) + $vloga = [$grup_id->id, 'vloga', 'vloga', '2', '1']; + (new HierarhijaQuery())->insertSpremenljivkaBranching($vloga, NULL, $this->anketa, 1); + + } + } + + /** + * Prikaže nastavitve za dodajanje nivojev in šifrantov - SUPERADMIN + * HIERARHIJA + * + * @return html page + */ + public function hierarhijaSuperadminSifranti() + { + $aktivna = $this->preveriCeJeAktivirana(); + $this->preverimoCeJeVnesenaStruktura(); + + if ($_GET['e'] == 'null') { + echo '
' . $this->lang['srv_hierarchy_element_missing'] . '
'; + } + + if ($aktivna && (is_null($this->hierarhija_type) || $this->hierarhija_type < 4)) { + echo '
'; + + // meni na levi strani + echo '
'; + echo '
' . $this->lang['srv_hierarchy_save_list'] . '
'; + echo '
'; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
+
+ {{ shranjena.ime }} + ({{ shranjena.stEvalvirancev }}) +
+
'; + echo ' +
+ {{ shranjena.ime }} + ({{ shranjena.stEvalvirancev }}) +
+
'; + echo '
'; + echo '
'; + echo '
+ Urejanje +
+ + +
+
'; + echo '
+ Uvoz/Izvoz + + + + +
'; + echo '
'; + + // Uvodno besedilo, ko se aktivira modul hierarhija$anketa + echo '
'; + echo '

' . $this->lang['srv_hierarchy_wellcome_title'] . '

'; + echo $this->lang['srv_hierarchy_wellcome_text'] . '

'; + echo ''; + echo '
'; + + + // Omogočimo predogled hierarhije + echo ''; + + + // naslov hierarhije + echo '
'; + echo '
'; + echo '

Hierarhija + + {{ (imeHierarhije.shrani.length > 30 ? (imeHierarhije.shrani.substring(0,30)+\' ...\') }} + {{ (imeHierarhije.aktivna.length > 30 ? (imeHierarhije.aktivna.substring(0,30)+\' ...\') : imeHierarhije.aktivna) }} + +

'; + echo '
'; + echo ''; + echo ''; + + // V kolikor imamo že strukturo prikažemo tudi številke + echo '
Hierarhija ima {{ shranjenaHierarhija[imeHierarhije.index].stEvalvirancev }} evalvacij in {{ shranjenaHierarhija[imeHierarhije.index].stUporabnikov }} uporabnikov.
'; + + // Dodajanje nivojev in njihovih nazivov + echo '
'; + echo '

' . $this->lang['srv_hierarchy_create_code'] . '

'; + echo '
+ Ustvari novo hierarhijo +
'; + echo '
'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + // Vuejs dinamično kreiranje novih nivojev + echo ''; + echo ''; + echo ''; + echo ''; + + echo '
' . $this->lang['srv_hierarchy_table_header_nivo_1'] . '' . $this->lang['srv_hierarchy_table_header_nivo_2'] . '
'; + echo '{{ novaHierarhijaSt }}.'; + echo ''; + echo ''; + echo '
' . $this->lang['srv_hierarchy_input_name_nivo'] . '
'; + echo '
'; + echo '
'; + echo '
'; + echo '
'; + + + // Selectbox s šifranti za posamezen nivo, vpis šifrantov dovolimo šele ko imamo vpisano prvo raven + echo '
'; + echo '
'; + echo '
'; + echo '

' . $this->lang['srv_hierarchy_code_lists'] . '

'; + + echo '
+
+ + +
+
'; + echo ' ' . Help::display('srv_hierarchy_edit_elements') . ''; + + echo '
'; + + echo '
'; + + // izris primera šifrantov + echo '
'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + // Vuejs dinamično kreiranje novih nivojev + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + echo ''; + + echo '
' . $this->lang['srv_hierarchy_table_header_1'] . '' . $this->lang['srv_hierarchy_table_header_2'] . '' . $this->lang['srv_hierarchy_table_header_3'] . '' . $this->lang['srv_hierarchy_table_header_4'] . '
'; + echo ''; + echo ''; + + ## Vstavimo checkboc od kje naprej se lahko šifranti ponavljajo + echo ''; + echo ''; + echo ''; + echo '
' . $this->lang['srv_hierarchy_input_name_sifrant'] . '
'; + echo '
'; + echo '
'; + + // Naprej na naslednji korak + echo '
'; + // Shranjevanje hierarhije + echo '
'; + echo 'Shrani trenutno hierarhijo pod imenom: '; + echo ''; + echo '
'; + + echo '
+ Hierarhijo želim shraniti pod novim imenom. +
'; + + echo '
'; + echo ''; + echo ''; + echo '
'; + echo '
'; + + echo '
'; + + + echo ''; + echo '
'; + echo '
'; + + // popup za urejanje vrednosti + echo '
'; + echo '
'; + + // fade pri fullscreen urejanje spremenljivke + echo '
'; + echo '
'; + + } else { + echo '
'; + // Naslov + echo '
'; + echo '

Hierarhija: {{ imeHierarhije.aktivna }}

'; + echo ''; + echo ''; + echo '
'; + + echo '
'; + + // Podatki o aktivaciji hierarhije + $hierarhija_options = new HierarhijaQuery(); + $cas_aktivacije = $hierarhija_options->getDeleteHierarhijaOptions($this->anketa, 'cas_aktivacije_hierarhije', NULL, NULL, FALSE); + $uporabnik_aktivacije = $hierarhija_options->getDeleteHierarhijaOptions($this->anketa, 'uporabnik_aktiviral_hierarhijo', NULL, NULL, FALSE); + $uporabnik = HierarhijaQuery::getUserSurvey($uporabnik_aktivacije); + + echo '
'; + echo '

Čas aktivacije: ' . $cas_aktivacije . '

'; + echo '

Hierarhijo je aktiviral uporabnik: ' . $uporabnik->name . ' ' . $uporabnik->surname . ' (' . $uporabnik->email . ') Podrobnosti

'; + echo '
'; + + echo '
'; + + // Tabela nivojev in šifrantov + echo '
'; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + // Vuejs dinamično kreiranje novih nivojev + echo ''; + echo ''; + echo ''; + echo ''; + + echo '
' . $this->lang['srv_hierarchy_table_header_1'] . '' . $this->lang['srv_hierarchy_table_header_2'] . '
'; + echo '
'; + + echo '
'; + echo 'Izvoz šifrantov'; + echo '
'; + + echo '
'; + } + } + + /** + * V kolikor je hierarhija aktivirana potem jo ni mogoče več urejati + * + * @return boolean + */ + + private function preveriCeJeAktivirana() + { + + if ($this->modul['hierarhija'] == 2 && $this->hierarhija_type < 4) { + echo $this->lang['srv_hierarchy_active_text']; + return FALSE; + } + + return TRUE; + } + + /** + * Preverimo, če je bila struktura vnešena + * + * @return boolean + */ + + private function preverimoCeJeVnesenaStruktura() + { + + $hierarhija_opcije = (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, 'vpisana_struktura', NULL, NULL, FALSE); + + if (sizeof($hierarhija_opcije) > 0 && isset($hierarhija_opcije['vpisana_struktura']) && $hierarhija_opcije['vpisana_struktura'] == 1) { + $sql_str = sisplet_query("SELECT id FROM srv_hierarhija_struktura WHERE anketa_id='" . $this->anketa . "'"); + + if ($sql_str->num_rows == 0) { + (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, 'vpisana_struktura', $id = NULL, 1); + } + } + + } + + /** + * Ko se aktivira anketa se posreduje email učiteljem za reševanje ankete + */ + + public static function aktivacijaAnketePosljiEmail($anketa) + { + # Dobimo samo uporabnike na zadnjem nivoju + $users_upravicen_do_evalvacije = (new HierarhijaOnlyQuery())->queryStrukturaUsers($anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $anketa . ') GROUP BY users.id'); + + if ($users_upravicen_do_evalvacije->num_rows == 0) { + return FALSE; + } + + # Če imamo uporabnike potem gremo za vsak id uporabnika preverit kakšno ima strukturo + while ($uporabnik = $users_upravicen_do_evalvacije->fetch_object()) { + $vloga_poizvedba = self::spremenljivkaVloga('vloga', $anketa); + $url_hierarhija = self::hierarhijaUrl($anketa, $uporabnik->user_id); + + // generiramo kode za vse + foreach ($url_hierarhija as $struktura_id => $url) { + // generiranje kode + foreach ($vloga_poizvedba as $v) { + if ($v->variable == 1) { + $vloga = 'ucenec'; + } + + if ($v->variable == 2) { + $vloga = 'ucitelj'; + } + + // Url parametri hierarhije (nivoji in vloga) + $url_baza = 'vloga=' . $v->id . $url; + + // Url parametre vstavimo v tabelo in generiramo kodo, Pri kodi trenutno uporabimo brez šumnikov, kar zadošča za 60.466.176 različnih kod (36 unikatnih znakov), če bi primanjkovalo se doda šumnik in je nato 90.224.199 kod. + + $vpis_kode_loop = FALSE; + while (!$vpis_kode_loop) { + $vpis_kode_loop = sisplet_query("INSERT INTO + srv_hierarhija_koda + (koda, anketa_id, url, vloga, user_id, hierarhija_struktura_id, datetime) + VALUES + (CONCAT(SUBSTRING('abcdefghijklmnoprstuvzwxq0123456789', RAND()*34+1, 1), + SUBSTRING('abcdefghijklmnoprstuvzwxq0123456789', RAND()*34+1, 1), + SUBSTRING('abcdefghijklmnoprstuvzwxq0123456789', RAND()*34+1, 1), + SUBSTRING('abcdefghijklmnoprstuvzwxq0123456789', RAND()*34+1, 1), + SUBSTRING('abcdefghijklmnoprstuvzwxq0123456789', RAND()*34+1, 1) + ), '" . $anketa . "', '" . $url_baza . "', '" . $vloga . "', '" . $uporabnik->user_id . "', '" . $struktura_id . "', NOW())"); + + + } + } + } + } + + if (HierarhijaQuery::getOptionsPosljiKode($anketa) == 'nikomur') { + HierarhijaQuery::saveOptions($anketa, 'obvesti_samo_ucitelje', 0); + } else { + self::posljiEmailSkodamiUcencemAliSamoUciteljem($anketa); + } + + return TRUE; + } + + private static function spremenljivkaVloga($var, $anketa) + { + $spremenljivke = Cache::cache_all_srv_spremenljivka($anketa, TRUE); + + $spremenljivka_id = NULL; + foreach ($spremenljivke as $spr) { + if ($spr['variable'] == $var) { + $spremenljivka_id = $spr['id']; + } + } + + if (!is_null($spremenljivka_id)) { + return Cache::cache_all_srv_vrednost($spremenljivka_id); + } + + return NULL; + } + + private static function hierarhijaUrl($anketa, $user = NULL) + { + $hierarhija = (new HierarhijaQuery())->pridobiHierarhijoNavzgor($anketa, NULL, $user); + + // če hierarhija še ni narejena + if (is_null($hierarhija)) { + return []; + } + + $max_level = sisplet_query("SELECT MAX(level) AS level FROM srv_hierarhija_ravni WHERE anketa_id='" . $anketa . "'", "obj"); + + //najprej moramo priti do polja z ustreznimi nivjo + foreach ($hierarhija as $key => $array) { + + // če smo res na zadnjem nivoju + if ($max_level->level == sizeof($array)) { + //gremo po nivojih ter sestavimo URL naslov + $url_zacasni = NULL; + foreach ($array as $nivoji) { + $id = (new HierarhijaQuery())->getVrednostIdFromPivot($nivoji['id']); + $url_zacasni .= '&' . $nivoji['nivo'] . '=' . $id; + } + + //sestavljen url dodamo v polje, kot ključ uporabimo ID strukture hierarhije + $url[$key] = $url_zacasni; + } + } + + return $url; + } + + /** + * Funkcija za pošiljanja kode učiteljem pri hierarhiji + * + * @param (int) $anketa + * + * @return send email | error + */ + + public static function posljiEmailSkodamiUcencemAliSamoUciteljem($anketa) + { + global $site_url; + global $lang; + + $ucitelji = sisplet_query("SELECT user_id FROM srv_hierarhija_koda WHERE anketa_id='" . $anketa . "' AND vloga='ucitelj' GROUP BY user_id"); + $koda_za_resevanje_ankete = HierarhijaQuery::getOptionsPosljiKode($anketa); + + if (mysqli_num_rows($ucitelji) == 0) { + return 'Ni podatka o učiteljih'; + } + + + while ($ucitelj = $ucitelji->fetch_object()) { + $kode = sisplet_query("SELECT koda, hierarhija_struktura_id FROM srv_hierarhija_koda WHERE anketa_id='" . $anketa . "' AND vloga='ucitelj' AND user_id='" . $ucitelj->user_id . "'"); + + // Email naslov + $subject = 'Povezava do samooevalvacije za anketo: ' . SurveyInfo::getSurveyTitle(); + + // Email besedilo + $email = ' + + + + + '; + + $email .= $lang['srv_hierarchy_teacher_email_1']; + $email .= '

' . $lang['srv_hierarchy_teacher_email_2'] . '»' . SurveyInfo::getSurveyTitle() . '«' . $lang['srv_hierarchy_teacher_email_3'] . '' . $site_url . 'sa

'; + + $email .= '
'; + $email .= ''; + $email .= ' + '; + + if (SurveyInfo::getSurveyModules('hierarhija') == 2 || in_array($koda_za_resevanje_ankete, ['vsem', 'ucitelju'])) { + $email .= ''; + } + + // V kolikor nimamo nikakršne izbere potem posredujemo kodo tudi za učence + if (in_array($koda_za_resevanje_ankete, ['vsem', 'ucencem'])) { + $email .= ''; + } + + $email .= ''; + $email .= ''; + $email .= ''; + + // generiranje kode + while ($koda = mysqli_fetch_object($kode)) { + $email .= ''; + $email .= ''; + + if (SurveyInfo::getSurveyModules('hierarhija') == 2 || in_array($koda_za_resevanje_ankete, ['vsem', 'ucitelju'])) { + $email .= ''; + } + + // V kolikor prejme učitelj email tudi s kodami za učence + if (in_array($koda_za_resevanje_ankete, ['vsem', 'ucencem'])) { + $koda_ucenci = sisplet_query("SELECT koda FROM srv_hierarhija_koda WHERE anketa_id='" . $anketa . "' AND vloga='ucenec' AND user_id='" . $ucitelj->user_id . "' AND hierarhija_struktura_id='" . $koda->hierarhija_struktura_id . "'", "obj"); + $email .= ''; + } + + $email .= ''; + } + + $email .= ''; + $email .= '
HierarhijaKoda za učiteljaKoda za učence
' . HierarhijaHelper::hierarhijaPrikazNaslovovpriUrlju($anketa, $koda->hierarhija_struktura_id, TRUE) . '' . strtoupper($koda->koda) . '' . strtoupper($koda_ucenci->koda) . '
'; + + $user = sisplet_query("SELECT email FROM users WHERE id='" . $ucitelj->user_id . "'", "obj"); + + //Zaključek emaila + // V kolikor se emailpošlje samo učiteljem potem se skrije možnost za dostop učiteljem + $onemogocenDostopUcitelju = (new HierarhijaQuery())->getDeleteHierarhijaOptions($anketa, 'onemogoci_dostop_uciteljem', NULL, NULL, FALSE); + + + if (is_null($onemogocenDostopUcitelju) && is_null($koda_za_resevanje_ankete)) { + $email .= '

' . $lang['srv_hierarchy_teacher_email_4'] . '' . $site_url . '' . $lang['srv_hierarchy_teacher_email_5']; + $email .= '»' . $user->email . '«' . $lang['srv_hierarchy_teacher_email_6'] . '

'; + } + + // Podpis + $signature = Common::getEmailSignature(); + $email .= $signature; + + // Zaključek emaila + $email .= ''; + + + // Pošljemo email + try { + $MA = new MailAdapter($anketa, $type='invitation'); + $MA->addRecipients($user->email); + $MA->sendMail(stripslashes($email), $subject); + } catch (Exception $e) { + echo "Email za hierarhijo ni bil poslan: " . $e; + error_log("Email za hierarhijo ni bil poslan: " . $e); + } + + } + } + + /** + * Prikažemo podatke o hierarhiji pri izpolnjevanju + * + * @param array $get - pridobimo vse get parametre od respondenta + * + * @return eho html + */ + public static function displayPodatkeOhierarhijiZaRespondente($get = [], $only_hierarhija = FALSE) + { + global $lang; + $izpis = ''; + + if (!$only_hierarhija) { + $izpis .= '
'; + $izpis .= $lang['srv_hierarchy_main']; + } + + if (empty($get) || sizeof($get) == 0) { + return NULL; + } + + // Pridobimo ime glede na izbiro + $sifrant = []; + foreach ($get as $key => $param) { + if (preg_match('/nivo(\d+)/', $key, $match)) { + $sql = sisplet_query("SELECT naslov FROM srv_vrednost WHERE id='" . $param . "'", 'obj'); + $sifrant[$match[1]] = $sql->naslov; + } + } + + // Sortiramo po nivojih, da je vedno prvi najprej + ksort($sifrant); + $izpis .= ''; + foreach ($sifrant as $key => $sifra) { + $izpis .= ($key > 1 ? ' - ' : NULL) . $sifra; + } + $izpis .= ''; + + if (!$only_hierarhija) { + $izpis .= '
'; + } + + return $izpis; + } + + /** + * Iščemo v vrednost v 2 dimenzionalnem polju + * return $row/null + */ + public static function iskanjeArray($id, $array, $keyValue = 'id') + { + foreach ($array as $key => $value) { + if ($value[$keyValue] == $id) { + return $value; + } + } + + return NULL; + } + + + /********** SUPERADMIN HIERARHIJA END ***********/ + + /** + * Izvoz šifrantov iz trenutno aktivne hierahije + */ + public function izvozSifrantov() + { + $ravni = (new HierarhijaOnlyQuery())->getSifrantiRavni($this->anketa); + + // V kolikor nimamo šifrantov potem ne moremo nič izvažati + if (is_null($ravni)) { + return redirect('index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=uredi-sifrante'); + } + + + $csv_polje = NULL; + while ($row = $ravni->fetch_object()) { + $csv_polje[] = [$row->level, $row->raven, $row->sifranti]; + } + + return Export::init()->csv('Hierarhija_izvoz', $csv_polje); + } + + /** + * Možnost uvoza hierarhije šifrantov + * + * @return html page + */ + public function hierarhijaSuperadminUvoz() + { + $aktivna = $this->preveriCeJeAktivirana(); + + #Shranimo CSV datoteko in naredimo strukturo hierarhije + if ($_GET['t'] == 'hierarhija-uvoz' && $aktivna) { + //preverimo, če je CSV format + if (FALSE === array_search($_FILES['uvozi-hierarhijo']['type'], [ + 'csv' => 'text/csv', + ], TRUE)) { + // V kolikor datoteka za uvoz ni v pravem formatu samo vrnemo na prvotno stran + return redirect('index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=uredi-sifrante'); + } + + if (($datoteka = fopen($_FILES['uvozi-hierarhijo']['tmp_name'], "r")) !== FALSE) { + + //CSV preberemo in zapišemo v polje + while (($data = fgetcsv($datoteka, 10000, ",")) !== FALSE) { + $uvozi_hierarhijo[] = $data; + } + + $ravni = []; + $sifrant = []; + foreach ($uvozi_hierarhijo as $uvoz) { + //pridobimo samo unikatne nivoje in imena nivojev + if (!$this->in_mul_array($uvoz[1], $ravni)) { + $ravni[] = $uvoz; + } + + //Pridobimo vse šifrante samo vranostno preverimo, če bi se slučajno kak šifrant dvakrat ponovil + if (!$this->in_mul_array($uvoz[2], $sifrant)) { + $sifrant[] = $uvoz; + } + } + + // preden vnesemo novo hierarhijo izbrišemo že obstoječo + sisplet_query("DELETE FROM srv_hierarhija_ravni WHERE anketa_id='" . $this->anketa . "'"); + + //vpisemo vse ravni + foreach ($ravni as $raven) { + // Vpišem, samo če je prvi element polja številka, ker gre za številko ravni + if (!empty($raven[0]) && is_numeric($raven[0])) { + sisplet_query("INSERT INTO srv_hierarhija_ravni (anketa_id, user_id, level, ime) VALUES ('$this->anketa', '$this->user', '$raven[0]', '$raven[1]')"); + $raven_id = mysqli_insert_id($GLOBALS['connect_db']); + + //vpišemo vse šifre za sledečo raven + foreach ($sifrant as $sifra) { + if ($raven[0] == $sifra[0]) { + sisplet_query("INSERT INTO srv_hierarhija_sifranti (hierarhija_ravni_id, ime) VALUES ('" . $raven_id . "', '" . $sifra[2] . "')"); + } + } + } + } + + fclose($datoteka); + } + + return redirect('index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=uredi-sifrante'); + } + } + + /** + * Preveri, če se spremenljivka nahaja v večdimenzionalnem polju + * + * @param string $value + * @param array $array + * + * @return boolean + */ + + public function in_mul_array($value, $array) + { + foreach ($array as $row) { + if (in_array($value, $row)) { + return TRUE; + } + } + return FALSE; + } + + /** + * Možnost nalaganja datoteke, tudi ko je hierarhija aktivna + */ + public function hierarhijaSuperadminUploadLogo() + { + global $site_path; + + // tracking - beleženje sprememb + TrackingClass::update($this->anketa, '20'); + + $finfo = new finfo(FILEINFO_MIME_TYPE); + if (FALSE === $ext = array_search($finfo->file($_FILES['logo']['tmp_name']), [ + 'jpg' => 'image/jpeg', + 'png' => 'image/png', + 'gif' => 'image/gif', + ], TRUE)) { + throw new RuntimeException('Datoteka ni v pravem formatu.'); + } + + $shrani_id = (!empty($_POST['id']) ? $_POST['id'] : NULL); + $path = $site_path . 'admin/survey/modules/mod_hierarhija/porocila/logo/'; + + // Predhodno datoteko pobrišemo + self::brisiLogo($this->anketa, $shrani_id); + + + $logo_ime = time() . '_' . slug($_FILES['logo']['name'], '_'); + if (!move_uploaded_file($_FILES['logo']['tmp_name'], sprintf($path . $logo_ime, sha1_file($_FILES['logo']['tmp_name']), $ext))) { + throw new RuntimeException('Ne morem premakniti datoteke.'); + } + + + $shrani_id = (!empty($_POST['id']) ? $_POST['id'] : NULL); + + sisplet_query("UPDATE srv_hierarhija_shrani SET logo='" . $logo_ime . "' WHERE id='" . $shrani_id . "' AND anketa_id='" . $this->anketa . "'"); + + return redirect('index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=uredi-sifrante'); + } + + public static function brisiLogo($anketa, $id = NULL) + { + global $site_path; + + if (is_null($id)) { + $id = (!empty($_POST['id']) ? $_POST['id'] : NULL); + } + + $old_logo_name = sisplet_query("SELECT logo FROM srv_hierarhija_shrani WHERE id='" . $id . "' AND anketa_id='" . $anketa . "'", "obj")->logo; + + $datoteka_za_izbris = NULL; + + if (!empty($old_logo_name)) { + $datoteka_za_izbris = $site_path . 'admin/survey/modules/mod_hierarhija/porocila/logo/' . $old_logo_name; + } + + if (file_exists($datoteka_za_izbris)) { + unlink($datoteka_za_izbris); + } + + sisplet_query("UPDATE srv_hierarhija_shrani SET logo='' WHERE id='" . $id . "' AND anketa_id='" . $anketa . "'"); + } + + /** + * Uporabniko prikažemo opcijo za aktiviranje ankete in hierarhije + * + * V kolikor anketa še ni bila aktivirana potem ima uporabnik tudi možnost + * izklopiti hierarhijo + * + * @return + */ + public function aktivacijaHierarhijeInAnkete() + { + // Preveri če je kak uporabnik upravičen do evalvacije + $st_uporabnikov_upravicenih_do_evalvacije = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ') GROUP BY users.id'); + $st_uporabnikov_upravicenih_do_evalvacije = mysqli_num_rows($st_uporabnikov_upravicenih_do_evalvacije); + + if (SurveyInfo::getSurveyModules('hierarhija') == 1) { + // Aktivacija ankete, ki tudi aktivira hierarhij + echo '
'; + echo '

' . $this->lang['srv_hierarchy_activation_link']; + echo ' + + '; + echo '

'; + echo $this->lang['srv_hierarhy_activation_text']; + + if ($st_uporabnikov_upravicenih_do_evalvacije) { + echo '
'; + echo 'Ob aktiviciji ankete bodo upoštevane naslednje nastavitve:
'; + echo ''; + echo ''; + $nastavitve = [ + 'srv_hierarchy_code_for_teacher' => 'ne_poslji_kodo_ucitelju', + 'srv_hierarchy_code_for_students' => 'ne_poslji_kode_ucencem', + 'srv_hierarchy_code_teacher_has_access' => 'onemogoci_dostop_uciteljem', + ]; + foreach ($nastavitve as $prevod => $nastavitev) { + echo ''; + echo ''; + echo ''; + echo ''; + } + echo ''; + echo '
' . $this->lang[$prevod] . 'anketa, $nastavitev)) ? 'checked="checked"' : NULL) . '> + '; + echo 'anketa, $nastavitev) == 1 ? 'checked="checked"' : NULL) . '> +
'; + + echo '
'; + echo $this->lang['srv_hierarchy_code_text_bottom']; + echo '
'; + echo ''; + } else { + echo '
V bazi ni dodanega nobenega učitelja, zato aktivacija ni mogoča!
'; + } + + echo '
'; + + // izklop ankete + echo '
'; + echo '

' . $this->lang['srv_hierarchy_turnoff'] . '

'; + echo $this->lang['srv_hierarhy_turnoff_text']; + echo ''; + echo '
'; + + } else { + // Aktivirana anketa in hierarhija + echo '
'; + echo '

' . $this->lang['srv_hierarchy_active_hierarchy_and_survey'] . '

'; + echo $this->lang['srv_hierarchy_active_hierarchy_and_survey_text']; + + $row = SurveyInfo::getInstance()->getSurveyRow(); + echo ''; + echo '
'; + + // Podatki o aktivaciji hierarhije + $hierarhija_options = new HierarhijaQuery(); + $cas_aktivacije = $hierarhija_options->getDeleteHierarhijaOptions($this->anketa, 'cas_aktivacije_hierarhije', NULL, NULL, FALSE); + $uporabnik_aktivacije = $hierarhija_options->getDeleteHierarhijaOptions($this->anketa, 'uporabnik_aktiviral_hierarhijo', NULL, NULL, FALSE); + $uporabnik = HierarhijaQuery::getUserSurvey($uporabnik_aktivacije); + + echo '
'; + echo '

' . $this->lang['srv_hierarchy_active_information_user'] . '

'; + echo '

Čas aktivacije: ' . $cas_aktivacije . '

'; + echo '

Aktivnost evalvacije: od ' . date('d.m.Y', strtotime($row['starts'])) . ' do ' . date('d.m.Y', strtotime($row['expire'])) . '

'; + echo '

Hierarhijo je aktiviral uporabnik: ' . $uporabnik->name . ' ' . $uporabnik->surname . ' (' . $uporabnik->email . ')

'; + + if (HierarhijaQuery::getOptions($this->anketa, 'onemogoci_dostop_uciteljem') == 1) { + echo '

' . $this->lang['srv_hierarchy_teacher_can_not_access'] . '

'; + } + + echo '

' . HierarhijaHelper::textGledeNaOpcije($this->anketa, 'srv_hierarchy_email_code') . '

'; + + $users_upravicen_do_evalvacije = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ') GROUP BY users.id'); + echo '
    '; + while ($uporabnik = $users_upravicen_do_evalvacije->fetch_object()) { + echo '
  • ' . $uporabnik->email . '
  • '; + } + echo '
'; + + // Obvesti učitelje, če niso bili obveščeni + $obvesti_Samo_ucitelje = HierarhijaQuery::getOptions($this->anketa, 'obvesti_samo_ucitelje'); + if (!is_null($obvesti_Samo_ucitelje) && $obvesti_Samo_ucitelje == 0) { + echo '
'; + } + + echo '
'; + + // Obveščanje managerjev + $managerji_ankete = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level<(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ')'); + if (mysqli_num_rows($managerji_ankete) > 0) { + echo '
'; + echo '

' . $this->lang['srv_hierarchy_active_information_about_manager'] . '

'; + echo '

' . $this->lang['srv_hierarchy_active_information_about_manager_text'] . '

'; + + echo '
'; + echo ''; + echo ''; + + echo '
    '; + while ($manager = $managerji_ankete->fetch_object()) { + echo '
  • '; + } + echo '
'; + + echo ''; + echo '
'; + echo '
'; + } + } + + } + + /** + * Uporabniko prikažemo opcijo za kopiranje ankete s šifranti in strukturo + */ + public function kopiranjeHierarhijeInAnkete() + { + + echo '
'; + echo '

' . $this->lang['srv_hierarchy_copy_link'] . '

'; + echo $this->lang['srv_hierarhy_copy_text']; + echo ''; + echo '

'; + echo $this->lang['srv_hierarhy_copy_text_2']; + echo ''; + echo '
'; + + } + + /** + * Prikaz in urejanje hierarhije + * + * @return html page + */ + public function displayHierarhijaUporabniki() + { + SurveySetting::getInstance()->Init($this->anketa); + $row = SurveyInfo::getInstance() + ->getSurveyRow(); //("SELECT * FROM srv_anketa WHERE id='$this->anketa'") + + $max_st_nivojev = (new HierarhijaOnlyQuery())->getSifrantiRavni($this->anketa, ', MAX(level) AS max', NULL); + + //preverimo število nivojev v kolikor jih ni potem nimamo še podatka o vnesenih šifrantih + if (!empty($max_st_nivojev) && !is_null($max_st_nivojev = $max_st_nivojev->fetch_object()->max) && SurveyInfo::getSurveyModules('hierarhija') == 1) { + // Pridobimo ime hierarhije + $aktivna_hierarhija_ime = (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, 'aktivna_hierarhija_ime', NULL, NULL, FALSE); + + echo '

Izgradnja hierarhije ' . (!empty($aktivna_hierarhija_ime) ? $aktivna_hierarhija_ime : '') . ' za anketo: ' . $row['naslov'] . '

'; + echo 'Ob aktiviranju bodo uporabniki na najnižjem nivoju prejeli kodo/šifro'; + + //vnosni obrazec za izgradnjo hierarhije + echo '
'; + + //pravice za gradnjo hierarhije v kolikor uporabnik ni super admin (type 5 ali več) ima tyle manjši kot 5 + if ($this->hierarhija_type > 4) { + + $sql = HierarhijaOnlyQuery::queryStrukturaUsersLevel($this->anketa, $this->user, 'ASC'); + //pridobimo največji nivo uporabnika ter id-je strukture + while ($struktura = $sql->fetch_object()) { + ## pridobimo največji nivo uporabnika ter id-je strukture za posamezen vpis + if (!isset($level) || $struktura->level < $level) { + $level = $struktura->level; + } + + $struktura_nivo[] = $struktura->parent_id; + $struktura_nivo[] = $struktura->struktura_id; + } + + $struktura_parent = (new HierarhijaOnlyQuery())->queryStruktura($this->anketa, NULL, NULL, 'id DESC'); + while ($obj = $struktura_parent->fetch_object()) { + //v polje vnesemo samo id strukture, ki je višja od trenutnega nivoja uporabnika + if (isset($obj) && in_array($obj->id, $struktura_nivo)) { + $struktura_nivo[] = $obj->parent_id; //tu povnimo parent_id, da lahko potem poiščemo celotno strukturo + $struktura_sifrant_id[] = $obj->sifrant_id; // narredimo polje z vsemi ID, sifrantov, ki so že vpisani za hierarhijo + } + } + + } + $results = (new HierarhijaQuery())->getSifrantAdmin($this->anketa); + + if (!is_null($results)) { + if (isset($level)) { + $this->vpisHierarhijeAdmin($results, $level, $struktura_sifrant_id); + } else { + $this->vpisHierarhijeAdmin($results); + } + } + + echo '
'; + + //prikaži JS Tree s trenutno hierarhijo + $this->jsTreePrikazHierarhije(); + } elseif (!empty($max_st_nivojev) && SurveyInfo::getSurveyModules('hierarhija') == 2) { + echo '

' . $this->lang['srv_hierarchy_active_text'] . '

'; + $this->jsTreePrikazHierarhije(); + } else { + echo '

' . $this->lang['srv_hierarchy_nothing'] . '

'; + } + } + + /** + * Nariše drevesno strukturo hierarhi + * + * @return HTML view + */ + public function jsTreePrikazHierarhije() + { + + $hierarhija = (new HierarhijaOnlyQuery())->queryStruktura($this->anketa, NULL, ' AND parent_id IS NULL') + ->fetch_object(); + + echo '
'; + if (!is_null($hierarhija->ravni_ime)) { + echo '

Hierarhija

'; + echo '' . $hierarhija->ravni_ime; + if ($this->hierarhija_type > 4) { + echo ' - ' . $hierarhija->sifrant_ime; + } + echo ': '; + } + echo '
'; + + // LOAD jsTree na ta element + echo '
'; + + echo ''; + echo ''; + } + + /** + * Gradnja uporabnikov/hierarhije, kjer lahko uporabnik izbira kako želi + * imeti prikazana podatke + */ + public function izberiDodajanjeUporabnikovNaHierarhijo() + { + global $site_url; + + // za vse ostalo je ure uredi uporabnike - M_UREDI_UPORABNIKE + SurveySetting::getInstance()->Init($this->anketa); + $row = SurveyInfo::getInstance()->getSurveyRow(); + $hierarchy_status = SurveyInfo::getSurveyModules('hierarhija'); + + $max_st_nivojev = (new HierarhijaOnlyQuery())->getSifrantiRavni($this->anketa, ', MAX(level) AS max', NULL); + + //preverimo število nivojev v kolikor jih ni potem nimamo še podatka o vnesenih šifrantih + if (!empty($max_st_nivojev) && !is_null($max_st_nivojev = $max_st_nivojev->fetch_object()->max) && $hierarchy_status == 1) { + + // Preverimo, če so vpisani šifranti, drugače preusmerimo na vpis šifrantov + $sql = (new HierarhijaOnlyQuery())->getSifrantiRavni($this->anketa); // pridobimo vse nivoje in šifre za vpis uporabnikov + if ($sql->num_rows > 0) { + while ($obj = $sql->fetch_object()) { + if (empty($obj->sifranti)) { + return redirect($site_url . 'admin/survey/index.php?anketa=' . $this->anketa . '&a=' . A_HIERARHIJA_SUPERADMIN . '&m=' . M_ADMIN_UREDI_SIFRANTE . '&e=null'); + } + } + } + + // Preverimo na katerem nivoju se nahaja uporabnik + $uporabnik_level = HierarhijaOnlyQuery::queryStrukturaUsersLevel($this->anketa, $this->user, 'ASC') + ->fetch_object()->level; + + if ($this->hierarhija_type < 4 || $uporabnik_level != $max_st_nivojev) { + // Pridobimo ime hierarhije + $aktivna_hierarhija_ime = (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, 'aktivna_hierarhija_ime', NULL, NULL, FALSE); + + echo '

Izgradnja hierarhije ' . (!empty($aktivna_hierarhija_ime) ? $aktivna_hierarhija_ime : '') . ' za anketo: ' . $row['naslov'] . '

'; + echo '
'; + echo '
'; + echo $this->lang['srv_hierarchy_user_help_top_1']; + echo ' Vse uporabnike lahko uvozite tukaj '; + echo '

' . $this->lang['srv_hierarchy_user_help_top_2']; + echo '
'; + echo ''; + echo '
'; + + //vnosni obrazec za izgradnjo hierarhije + echo '
'; + + $results = (new HierarhijaQuery())->getSifrantAdmin($this->anketa); + + if (!is_null($results)) { + + // V kolikor je postavvljena spremenljivka $level, potem ni superadmin, ampak uporabnik na določenem nivoju + if ($this->hierarhija_type > 4) { + $this->vpisHierarhijeUporabnikTabela($results); + } else { + $this->vpisHierarhijeAdminTabela($results); + } + + } + + echo '
'; + } + + //prikaži JS Tree s trenutno hierarhijo + $this->jsTreePrikazHierarhije(); + } elseif (!empty($max_st_nivojev) && $hierarchy_status == 2) { + echo '

' . $this->lang['srv_hierarchy_active_text'] . '

'; + + if ($this->hierarhija_type < 5) { + $results = (new HierarhijaQuery())->getSifrantAdmin($this->anketa); + + // Prikažemo samo datatables + echo '
'; + echo '
'; + echo '

Prikaz zgrajene hierarhije:

'; + echo ''; + +// echo ''; +// echo ''; + echo ''; + echo ''; + echo ' '; + foreach ($results['nivoji'] as $key => $nivo) { + echo ''; + } + echo ''; + echo ''; + echo ''; + echo ''; + echo '
' . $nivo['level'] . '.nivo: ' . $nivo['ime'] . '
'; + echo '
'; + echo '
'; + } + + $this->jsTreePrikazHierarhije(); + } else { + echo '

' . $this->lang['srv_hierarchy_nothing'] . '

'; + } + } + + /** + * Izris forme za gradnjo hierarhije uporabnik na določenem nivoju + * + * @param array $results + * + * @return echo html + */ + private function vpisHierarhijeUporabnikTabela($results) + { + echo '
'; + + // Kadar nimamo vpisanih šifrantov + echo '
'; + echo $this->lang['srv_hierarchy_empty_drop_downs']; + echo '
'; + + echo '
'; + echo ''; + + echo ''; + echo ''; + foreach ($results['nivoji'] as $key => $nivo) { + $array_key = array_keys($results['nivoji']); + if ($key == end($array_key)) { + echo ''; + } else { + echo ''; + } + } + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + + // Če je uporabnik izbran na določen nivo, potem pred tem naredimo fiksna polja z input disabled + echo ''; + + echo ''; + echo ''; + echo ''; + echo ' + + '; + echo ''; + echo '
' . $nivo['level'] . '. nivo - ' . $nivo['ime'] . '' . $nivo['level'] . '. nivo - ' . $nivo['ime'] . 'Evalviranec
'; + echo '
{{ struktura.ime }}
'; + echo '
'; + // Prikažemo Select2, samo če je 1 nivo in celotne js oz. spletna stran naložena - v kolikor je počasna povezava potem nekaj časa potrebuje, da naloži tudi select2 + echo '
'; + echo '
+ +
'; + echo '
+ + +
'; + echo '
'; + + // Prikažemo že dodane uporabnike in tudi uporabnike samo dodane v virtual dom + echo '
'; + echo 'Uporabnik/i:'; + echo '
    '; + // Seznam uporabnikov, ki so že v bazi in jih samo prikličemo + echo '
  • {{ uporabnik.email }} + ({{ uporabnik.ime }} {{ uporabnik.priimek }}) + +
  • '; + // Seznam uporabnikov, ki jih še ni v bazi in so bili na novo dodani + echo '
  • {{ oseba[0] }} ({{ oseba[1] }} {{ oseba[2] }})
  • '; + echo '
'; + echo '
'; + echo '
'; + // Seznam uporabnikov, ki so že v bazi in jih samo prikličemo + echo '
{{ uporabnik.email }} + ({{ uporabnik.ime }} {{ uporabnik.priimek }}) +
'; + // Seznam uporabnikov, ki jih še ni v bazi in so bili na novo dodani + echo '
{{ oseba[0] }} ({{ oseba[1] }} {{ oseba[2] }})
'; + echo '
+ +
'; + echo '
'; + + // možnost vpisa osebe za določen nivo + echo '
'; + echo '
'; + echo '

Vnos oseb za {{ osebe.nivo }}. nivo:

'; + echo '
'; + echo $this->lang['srv_hierarchy_add_users'] . ' +
+ + +
+
*Polje email je obvezno polje za zadnji nivo.
+
  • Elektronski naslov {{ email.naslov }} v vrstici {{ email.vrstica }} ni pravilen.
+ '; + echo '
'; + echo ''; + echo '
'; + echo '
'; + + + // Prikažemo Datatables rezultate samo za zdanji nivo; + echo '
'; + echo '

Prikaz zgrajene hierarhije:

'; + echo ''; + echo ''; + echo ' '; + foreach ($results['nivoji'] as $key => $nivo) { + echo ''; + } + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
' . $nivo['level'] . '.nivo: ' . $nivo['ime'] . '
'; + echo '
'; + echo '
'; + } + + /** + * Izris forme za gradnjo hierarhije Superadmin + * + * @param array $results + * + * @return echo html + */ + private function vpisHierarhijeAdminTabela($results) + { + global $site_url; + + echo '
'; + // Kadar nimamo vpisanih šifrantov + echo '
'; + echo $this->lang['srv_hierarchy_empty_drop_downs']; + echo '
'; + + echo '
'; + echo ''; + echo ''; + foreach ($results['nivoji'] as $key => $nivo) { + $polje_kljuci = array_keys($results['nivoji']); + if ($key == end($polje_kljuci)) { + echo ''; + } else { + echo ''; + } + } + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ' + + '; + echo ''; + echo '
' . $nivo['level'] . '. nivo - ' . $nivo['ime'] . '' . $nivo['level'] . '. nivo - ' . $nivo['ime'] . 'Evalviranec
'; + // Prikažemo Select2, samo če je 1 nivo in celotne js oz. spletna stran naložena - v kolikor je počasna povezava potem nekaj časa potrebuje, da naloži tudi select2 + echo '
'; + + echo '
+ +
'; + + echo '
+ + +
'; + + echo '
+ +
'; + + echo '
'; + + + // Prikažemo že dodane uporabnike in tudi uporabnike samo dodane v virtual dom + echo '
'; + echo 'Uporabnik/i:'; + echo '
    '; + // Seznam uporabnikov, ki so že v bazi in jih samo prikličemo + echo '
  • {{ uporabnik.email }} + ({{ uporabnik.ime }} {{ uporabnik.priimek }}) + +
  • '; + // Seznam uporabnikov, ki jih še ni v bazi in so bili na novo dodani + echo '
  • {{ oseba[0] }} ({{ oseba[1] }} {{ oseba[2] }})
  • '; + echo '
'; + echo '
'; + echo '
'; + echo '
'; + // Seznam uporabnikov, ki so že v bazi in jih samo prikličemo + echo '
{{ uporabnik.email }} + ({{ uporabnik.ime }} {{ uporabnik.priimek }}) +
'; + // Seznam uporabnikov, ki jih še ni v bazi in so bili na novo dodani + echo '
{{ oseba[0] }} ({{ oseba[1] }} {{ oseba[2] }})
'; + echo '
'; + echo '
+ +
'; + echo ''; + echo '
'; + + // možnost vpisa osebe za določen nivo + echo '
'; + echo '
'; + echo '

Vnos oseb za {{ osebe.nivo }}. nivo ​– managerji z vpogledom v rezultate (?)

'; + echo '

​Vnos osebe na zadnjem nivoju - učitelj, ki bo evalviran (?)

'; + echo '
'; + echo '

' . $this->lang['srv_hierarchy_add_users'] . '

'; + echo '

' . $this->lang['srv_hierarchy_add_users_last'] . '

'; + echo '
'; + echo ' + +
+
*Polje email je obvezno polje za zadnji nivo.
+
  • Elektronski naslov {{ email.naslov }} v vrstici {{ email.vrstica }} ni pravilen.
'; + echo '
'; + echo ''; + echo '
'; + echo '
'; + + + // Prikažemo Datatables rezultate samo za zdanji nivo; + echo '
'; + echo '

Prikaz zgrajene hierarhije:

'; + // Vklopimo prikaz pomoči in števila vnoso uporabnikov + echo '
'; + $this->prikaziStUporabnikovNaZadnjemNivojuHelp(); + echo '
'; + + echo '
+
' . $this->lang['srv_hierarchy_btn_find_and_replace'] . '
+
'; + echo ''; + echo ''; + echo ''; + echo ' '; + foreach ($results['nivoji'] as $key => $nivo) { + echo ''; + } + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
' . $nivo['level'] . '.nivo: ' . $nivo['ime'] . '
'; + echo '
'; + echo ''; + echo '
'; + echo '
'; + echo '
'; + } + + /** + * Prikažemo število vseh uporabnikov na zadnjem nivoju, število unikatnih + * učiteljev in število predmetov + * + * @return html + */ + private function prikaziStUporabnikovNaZadnjemNivojuHelp() + { + + $id = (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, 'srv_hierarhija_shrani_id', NULL, NULL, FALSE); + // Če ne dobimo ID-ja + if (empty($id)) { + return NULL; + } + + $sql_st_uciteljev = sisplet_query("SELECT st_uciteljev FROM srv_hierarhija_shrani WHERE id='" . $id . "' AND anketa_id='" . $this->anketa . "'", "obj"); + + // Prešteje število unikatnih učiteljev + $unikatni_uporabniki = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ') GROUP BY users.id'); + $st_unikatnih_uporabnikov = mysqli_num_rows($unikatni_uporabniki); + + // Prešteje število unikatnih predmetov + $unikatni_predmeti = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa, ' AND hs.level=(SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id=' . $this->anketa . ') GROUP BY hs.hierarhija_sifranti_id'); + $st_unikatnih_predmetov = mysqli_num_rows($unikatni_predmeti); + + echo $this->lang['srv_hierarchy_user_help_1_1']; + echo ' ' . $sql_st_uciteljev->st_uciteljev . ' '; + echo $this->lang['srv_hierarchy_user_help_1_2']; + echo ' ' . $st_unikatnih_uporabnikov . ' ' . $this->lang['srv_hierarchy_user_help_1_3'] . ' ' . $st_unikatnih_predmetov . ' ' . $this->lang['srv_hierarchy_user_help_1_4']; + + } + + /** + * Prikaže tabelo za gradnjo hierarhije uporabnikov + */ + public function displayHierarhijaUporabnikiTabela() + { + SurveySetting::getInstance()->Init($this->anketa); + $row = SurveyInfo::getInstance() + ->getSurveyRow(); //("SELECT * FROM srv_anketa WHERE id='$this->anketa'") + + $max_st_nivojev = (new HierarhijaOnlyQuery())->getSifrantiRavni($this->anketa, ', MAX(level) AS max', NULL); + + + //preverimo število nivojev v kolikor jih ni potem nimamo še podatka o vnesenih šifrantih + if (!empty($max_st_nivojev) && !is_null($max_st_nivojev = $max_st_nivojev->fetch_object()->max) && SurveyInfo::getSurveyModules('hierarhija') == 1) { + // Pridobimo ime hierarhije + $aktivna_hierarhija_ime = (new HierarhijaQuery())->getDeleteHierarhijaOptions($this->anketa, 'aktivna_hierarhija_ime', NULL, NULL, FALSE); + + echo '

Izgradnja hierarhije ' . (!empty($aktivna_hierarhija_ime) ? $aktivna_hierarhija_ime : '') . ' za anketo: ' . $row['naslov'] . '

'; + + //vnosni obrazec za izgradnjo hierarhije + echo '
'; + + //pravice za gradnjo hierarhije v kolikor uporabnik ni super admin (type večji kot 5) + if ($this->hierarhija_type > 4) { + + $sql = HierarhijaOnlyQuery::queryStrukturaUsersLevel($this->anketa, $this->user, 'ASC'); + //pridobimo največji nivo uporabnika ter id-je strukture + while ($struktura = $sql->fetch_object()) { + ## pridobimo največji nivo uporabnika ter id-je strukture za posamezen vpis + if (!isset($level) || $struktura->level < $level) { + $level = $struktura->level; + } + + $struktura_nivo[] = $struktura->parent_id; + $struktura_nivo[] = $struktura->struktura_id; + } + + $struktura_parent = (new HierarhijaOnlyQuery())->queryStruktura($this->anketa, NULL, NULL, 'id DESC'); + while ($obj = $struktura_parent->fetch_object()) { + //v polje vnesemo samo id strukture, ki je višja od trenutnega nivoja uporabnika + if (isset($obj) && in_array($obj->id, $struktura_nivo)) { + $struktura_nivo[] = $obj->parent_id; //tu povnimo parent_id, da lahko potem poiščemo celotno strukturo + $struktura_sifrant_id[] = $obj->sifrant_id; // narredimo polje z vsemi ID, sifrantov, ki so že vpisani za hierarhijo + } + } + + } + $results = (new HierarhijaQuery())->getSifrantAdmin($this->anketa); + + if (!is_null($results)) { + // echo '
'; + // echo ''; + // + // if (isset($level)) { + // $this->vpisHierarhijeTabela($results, $level, $struktura_sifrant_id); + // } else { + // $this->vpisHierarhijeTabela($results, null, null, $max_st_nivojev); + // } + + // echo ''; + // echo ''; + // + // if (isset($level)) { + // $this->vpisHierarhijeAdmin($results, $level, $struktura_sifrant_id); + // } else { + // $this->vpisHierarhijeAdmin($results); + // } + // + // + // echo '
+ // + //
+ // + //
+ //
'; + // + // echo '
+ // + //
+ // + //
+ //
*Polje email je obvezno polje za zadnji nivo.
+ //
'; + // + // echo '
+ // + //
'; + // echo '
'; + + } + + + echo '
'; + + //prikaži JS Tree s trenutno hierarhijo + $this->jsTreePrikazHierarhije(); + } elseif (!empty($max_st_nivojev) && SurveyInfo::getSurveyModules('hierarhija') == 2) { + echo '

' . $this->lang['srv_hierarchy_active_text'] . '

'; + $this->jsTreePrikazHierarhije(); + } else { + echo '

' . $this->lang['srv_hierarchy_nothing'] . '

'; + } + + } + + public function statistikaHierjearhije() + { + if ($this->hierarhija_type < 5) { + return $this->statistikaAdminHierarhije(); + } + + if ($this->hierarhija_type == 10) { + return $this->statistikaUcitelj(); + } + + echo $this->lang['srv_hierarchy_only_teachers']; + } + + /** + * Prikaz statisti za vse ankete brez kod, ker administrator nima pravice do + * vpolgeda teh kod + */ + + public function statistikaAdminHierarhije() + { + echo '
'; + + if (SurveyInfo::getSurveyModules('hierarhija') == 2) { + echo '
'; + echo ''; + echo '
'; + } + + echo '
'; + echo ''; + echo ''; + echo ' + + + + + + '; + echo ''; + echo ' + '; + echo ' + + + + + + '; + echo ''; + echo ''; + + $body = HierarhijaIzvoz::getInstance($this->anketa)->getStatus(TRUE); + + if (is_null($body)) { + return ''; + } + + foreach ($body as $id_koda => $row) { + echo ''; + echo ''; + + // Izrišemo vse stolpce v omenjeni vrstici + foreach ($row as $key => $podatek) { + if ($key == 0 || $key == 1) { + + echo ''; + + } elseif ($key == 2 || $key == 8) { + + echo ''; + + } else { + + echo ''; + + } + + } + + echo ''; + } + + echo ''; + echo '
Izberi učitelja za generiranje super šifreHierarhijaEmail učiteljaKoda za učenceStatus učencevČasovni potek učencevKoda za učiteljaVnos učitelja (datum)
' . $this->lang['srv_userstatus_5ll'] . '' . $this->lang['srv_userstatus_5'] . '' . $this->lang['srv_userstatus_6'] . 'Prvi vnosZadnji vnos
+ + ' . $podatek . '' . $podatek . '' . $podatek . '
'; + echo '
'; + + echo '
+ + + + + + + + + +
'; + + echo '
'; + + // košarica s kodami + echo '
'; + echo ''; + + echo ''; + echo '
'; + } + + /** + * Prikaže tabelo s kodami za učitelja in učence skupaj s s statističnimi + * podatki + */ + + protected function statistikaUcitelj() + { + if (!$this->upravicenDoSamoevalvacije()) { + die(); + } + + echo ''; + echo ''; + echo ' + '; + echo ''; + + echo ' + + + + '; + echo ' + + + + + + + '; + echo ''; + echo ''; + + //v kolikor imamo več URL-jev se pravi za več predmetov potem moramo izpisati sklope za vse predmete + $url_hierarhija = self::hierarhijaUrl($this->anketa); + + // pridobimo podatke + + foreach ($url_hierarhija as $struktura_id => $url) { + // pridobimo podatke o rešenih anketah samo za to strukturo + $cas = $this->pridobiStatisticnePodatke($struktura_id, 'ucenec'); + $cas_ucitelj = $this->pridobiStatisticnePodatke($struktura_id, 'ucitelj'); + + $first_insert = NULL; + $last_insert = NULL; + $zacel_izpolnjevati = 0; + $delno_izpolnjena = 0; + $koncal_anketo = 0; + + if (!is_null($cas)) { + foreach ($cas as $key => $row) { + if ($row['cas'] < $first_insert || $key == 0) { + $first_insert = $row['cas']; + } + + if ($row['cas'] > $last_insert) { + $last_insert = $row['cas']; + } + + // Končal anketo + if ($row['status'] == 6 && $row['lurker'] == 0) { + $koncal_anketo++; + } + + // Delno izpolnjena + if ($row['status'] == 5 && $row['lurker'] == 0) { + $delno_izpolnjena++; + } + + if ($row['lurker'] == 1) { + $zacel_izpolnjevati++; + } + } + } + + echo ' + '; + + echo ''; + + echo ' + + + + + + '; + + // V kolikor je hierarhija aktivna potem prikažemo možnost pregleda analiz + if ($this->modul['hierarhija'] > 1) { + echo ''; + } + echo ''; + } + + echo ''; + echo '
HierarhijaKoda za učenceKoda za učiteljaStatus učencevČasovni potek učencevVnos učitelja (datum)
' . $this->lang['srv_userstatus_5ll'] . '' . $this->lang['srv_userstatus_5'] . '' . $this->lang['srv_userstatus_6'] . 'Prvi vnosZadnji vnos
' . HierarhijaHelper::hierarhijaPrikazNaslovovpriUrlju($this->anketa, $struktura_id) . '' . strtoupper(HierarhijaOnlyQuery::getKodaRow($this->anketa, $struktura_id)->koda) . '' . strtoupper(HierarhijaOnlyQuery::getKodaRow($this->anketa, $struktura_id, 'ucitelj')->koda) . '' . (!empty($zacel_izpolnjevati) ? $zacel_izpolnjevati : '/') . '' . (!empty($delno_izpolnjena) ? $delno_izpolnjena : '/') . '' . (!empty($koncal_anketo) ? $koncal_anketo : '/') . '' . (!is_null($first_insert) ? date('d.m.Y, H:i', $first_insert) : '/') . '' . (!is_null($last_insert) ? date('d.m.Y, H:i', $last_insert) : '/') . '' . ((!is_null($cas_ucitelj['cas']) && $cas_ucitelj['status'] == 6 && $cas_ucitelj['lurker'] == 0) ? date('d.m.Y, H:i', $cas_ucitelj['cas']) : '/') . 'Poglej analizo
'; + } + + /** + * Preverimo, če je uporabnik upravičen do samoevalvacije - je na zadnjem + * nivoju hierarhije + * + * @return boolean + */ + + public function upravicenDoSamoevalvacije() + { + + $max_level = (new HierarhijaOnlyQuery())->getSifrantiRavni($this->anketa, ', MAX(level) AS max', NULL); + $user_level = HierarhijaOnlyQuery::queryStrukturaUsersLevel($this->anketa, $this->user, 'DESC'); + + if (!empty($user_level) && !empty($user_level) && $user_level->fetch_object()->level == $max_level->fetch_object()->max) { + return TRUE; + } + + return FALSE; + } + + /********** Prikaz in urejanje hierarhije END **********/ + + private function pridobiStatisticnePodatke($struktura_id, $vloga) + { + + $url = sisplet_query("SELECT url FROM srv_hierarhija_koda WHERE anketa_id='" . $this->anketa . "' AND hierarhija_struktura_id='" . $struktura_id . "' AND vloga='" . $vloga . "'", "obj")->url; + + // V kolikor anketa še ni bila aktivirana potem vrnemo null, ker nimamo še podatkov o izpolnjevanju + if (is_null($url)) { + return NULL; + } + + parse_str($url, $nivoji); + + $polje_iskanja = NULL; + foreach ($nivoji as $key => $nivo) { + if ($key == 'vloga') { + $polje_iskanja = $nivo; + } else { + $polje_iskanja .= ', ' . $nivo; + } + } + + $db_table = (SurveyInfo::getInstance() + ->getSurveyColumn('db_table') == 1) ? '_active' : ''; + + // tukaj pridobimo podatke o anketi za določeno strukturo + // preverimov prvi in zadnji nivo + $sql_user = sisplet_query("SELECT time_insert, last_status, lurker FROM srv_data_vrednost" . $db_table . " as sa LEFT JOIN srv_user as us ON (sa.usr_id=us.id) WHERE vre_id IN (" . $polje_iskanja . ") GROUP BY usr_id HAVING COUNT(usr_id)=" . sizeof($nivoji)); + $cas = []; + + // V kolikor ni zapisov vrnemo prazno + if ($sql_user->num_rows == 0) { + return NULL; + } + + while ($row = mysqli_fetch_object($sql_user)) { + $cas[] = [ + 'cas' => strtotime($row->time_insert), + 'status' => $row->last_status, + 'lurker' => $row->lurker, + ]; + } + + if ($vloga == 'ucitelj') { + return $cas[0]; + } + + + return (sizeof($cas) > 0 ? $cas : NULL); + } + /********** Prikaz in urejanje hierarhije END **********/ + + /** + * Prikaže glavni meni za super admina - userja, ki je aktiviral hierarhijo + * + * @return html + */ + public function displayHierarhijaNavigationSuperAdmin() + { + if (is_null($this->hierarhija_type)) { + $this->hierarhija_type = HierarhijaHelper::preveriTipHierarhije($this->anketa); + } + + // V kolikor nima pravic običjanega uporabnika potem ne prikažemo nič + if ($this->admin_type > 0 && (is_null($this->hierarhija_type) || $this->hierarhija_type > 4)) { + die(); + } + + $url = NULL; + if (!empty($_GET['m'])) { + $url = $_GET['m']; + } + + // preverimo status hierarhije + $hierarchy_status = SurveyInfo::getSurveyModules('hierarhija'); + + echo '
'; + echo ''; + echo '
'; + + } + + /** + * Prikaže glavni meni vse uporabnike, ki imajo pravico za dostop do + * hierarhije + * + * @return html + */ + public function displayHierarhijaNavigation() + { + global $site_url; + // V kolikor nima pravic običjanega uporabnika potem ne prikažemo nič + if (is_null($this->hierarhija_type) || $this->hierarhija_type < 5) { + die(); + } + + $url = NULL; + if (!empty($_GET['m'])) { + $url = $_GET['m']; + } + + + $hierarchy_status = SurveyInfo::getSurveyModules('hierarhija'); + + echo '
'; + echo ''; + echo '
'; + + } + +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/HierarhijaHelper.php b/admin/survey/modules/mod_hierarhija/class/HierarhijaHelper.php new file mode 100644 index 0000000..3f283f6 --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/HierarhijaHelper.php @@ -0,0 +1,340 @@ +{'survey-'.$ank_id})) { + + $active = ''; + if (SurveyInfo::getInstance()->getSurveyColumn('db_table') == 1) { + $active = '_active'; + } + + // ID uporabnika, glede na njegov piškot + $srv_user = sisplet_query("SELECT id FROM srv_user WHERE cookie='".$get->{'survey-'.$ank_id}."'", "obj")->id; + + // Pridobimo vse odgovore - strukturo hierarhije + $vrednosti = sisplet_query("SELECT + v.naslov AS naslov, + ss.variable AS variable, + v.id AS spr_id + FROM + srv_data_vrednost".$active." AS sd + LEFT JOIN + srv_vrednost AS v + ON + sd.vre_id=v.id + LEFT JOIN + srv_spremenljivka AS ss + ON + v.spr_id=ss.id + WHERE sd.usr_id='".$srv_user."' ORDER BY ss.variable DESC", "obj"); + } + + // Zanka po vseh besedah v texstu, k so med lojtrama ( + foreach ($matches[0] as $key => $match) { + $iskanje = strtolower($matches[1][$key]); + + // Zamenjava nivojev (primer: nivo1, nivo2, ...) in vloge (učenec, učitelj) + if (! empty($get->{$iskanje})) { + $variabla = sisplet_query("SELECT naslov FROM srv_vrednost WHERE id='".$get->{$matches[1][$key]}."'", "obj"); + $text = str_ireplace($match, $variabla->naslov, $text); + } elseif ($iskanje === 'hierarhija') { + $hierarhija_pot = Hierarhija::displayPodatkeOhierarhijiZaRespondente($get, true); + $text = str_ireplace($match, $hierarhija_pot, $text); + } + + // Kadar nivoje menjamo na ostalih vprašanjih in nimamo več Get parametrov, potem pridobimo iz že shranjenih sistemskih odgovorov + if (! empty($vrednosti)) { + $url_variables = ''; + + foreach ($vrednosti as $vrednost) { + if ($vrednost->variable == $matches[1][$key]) { + $text = str_ireplace($match, $vrednost->naslov, $text); + } + + if (! empty($vrednost->variable)) { + $url_variables .= $vrednost->variable.'='.$vrednost->spr_id.'&'; + } + } + } + + // Ostranimo lojtro iz zadnjega nivoja, da lahko nato preverimo pa url naslovu v bazi + $url_variables = substr($url_variables, 0, strlen($url_variables) - 1); + + // zamenjava podatkov o učitelju/uporabniku - ime, priimek, email + if (in_array($iskanje, ['ime ucitelja', 'email ucitelja'])) { + // Pridobimo podatke u uporabniku za sledečo anketo + if (! empty($get->enc)) { + $url_variables = base64_decode($get->enc); + } + + $user = sisplet_query("SELECT u.email AS email, u.name AS name, u.surname AS surname FROM srv_hierarhija_koda AS h LEFT JOIN users AS u ON u.id=h.user_id WHERE h.anketa_id='".$ank_id."' AND h.url='".$url_variables."'", "obj"); + + $zamenjaj = $match; + + // email ne sme biti enak imenu ali priimku + if ($iskanje == 'ime ucitelja' && ! in_array($user->email, [$user->name, $user->surname])) { + $zamenjaj = $user->name." ".$user->surname; + } elseif ($iskanje == 'ime ucitelja') { + preg_match('/(\w+)((?:\.)(\w+))?/', $user->email, $ucitelj); + + $zamenjaj = self::velikaZacetnica($ucitelj[1]); + + if (! empty($ucitelj[3])) { + $zamenjaj .= " ".self::velikaZacetnica($ucitelj[3]); + } + } + + if ($iskanje == 'email ucitelja') { + $zamenjaj = $user->email; + } + + $text = str_ireplace($match, $zamenjaj, $text); + } + } + + return $text; + } + + /** + * Iz besedila najprej pretvorimo v male črke in nato veliko začetnico + * + * @param string $string + * + * @return string + */ + private static function velikaZacetnica($string) + { + return ucfirst(mb_strtolower($string, 'UTF-8')); + } + + /** + * Preverimo dostop določenega uporabnika do modula SA + * + * @param (int) $anketa + */ + public static function preveriDostop($anketa_id = 0) + { + global $admin_type; + + // Če ima dostop in je modul vključen + if (Common::checkModule('hierarhija') == '1') { + + //anketa še ni ustvarjena, potem mu je dostop omogočen + if ($anketa_id == 0 && self::aliImaDostopDoIzdelovanjaHierarhije()) { + return true; + } + + // Imamo anketa ID in smo znotraj ankete + if ($anketa_id > 0) { + + // Če je modul vključen potem lahko do hierarhije dostopajo samo (admini, oseba, ki je mod vključila in osebe, katerim je bil dodan dostop do urejanja hierarhije) + if (SurveyInfo::checkSurveyModule('hierarhija', $anketa_id) && ($admin_type == 1 || self::preveriTipHierarhije($anketa_id) < 5)) { + + return true; + + // Če modul še ni bil vključen imajo dostop samo uporabniki s predhodnimi pravicami + } elseif (! SurveyInfo::checkSurveyModule('hierarhija', $anketa_id) && self::aliImaDostopDoIzdelovanjaHierarhije()) { + + return true; + + } + } + } + + return false; + } + + /** + * Preverimo, če ima dostop do grajenja hierarhije, dostop omogočimo: + * AAI uporabnikom + * 1ka administrator + * Uporabniku, kateremu je bil dodeljen dostop do ankete + */ + public static function aliImaDostopDoIzdelovanjaHierarhije() + { + + global $site_url; + + $strani = [ + 'https://www.1ka.si/', + 'http://test.1ka.si/', + 'http://1ka.test/', + 'https://1ka.arnes.si/' + ]; + + // Če je domena prava in če je modul vključen na inštalaciji + $modul = Common::checkModule('hierarhija'); + if ($modul == '0' || $modul == '1' && ! in_array($site_url, $strani)) { + return false; + } + + // Ali je administrator + global $admin_type; + if ($admin_type == 0) { + return true; + } + + //AAI uporabnik + if (! empty($_COOKIE['aai']) && $_COOKIE['aai'] == 1) { + return true; + } + + // Ima dostop, ker je bil dodan v bazo uporabnikov za dostop do hierarhije + if (sizeof(sisplet_query("SHOW TABLES LIKE 'srv_hierarhija_dostop'", "array")) == 1) { + + global $global_user_id; + $dostop = sisplet_query("SELECT dostop FROM srv_hierarhija_dostop WHERE user_id='".$global_user_id."'", "obj"); + + if (! empty($dostop) && $dostop->dostop == 1) { + return true; + } + } + + return false; + } + + public static function preveriTipHierarhije($anketa) + { + global $global_user_id; + $type = null; + + if (is_null($anketa)) { + return null; + } + + if (! SurveyInfo::checkSurveyModule('hierarhija', $anketa)) { + return null; + } + + // V kolikor je tip hierarhije že v seji + if (! empty($_SESSION['hierarhija'][$anketa]['type']) && $_SESSION['hierarhija'][$anketa]['type'] > 5) { + return $_SESSION['hierarhija'][$anketa]['type']; + } + + $sql = sisplet_query("SELECT type FROM srv_hierarhija_users WHERE user_id='".$global_user_id."' AND anketa_id='".$anketa."'"); + + if (! empty($sql) && mysqli_num_rows($sql) > 0) { + $row = mysqli_fetch_object($sql); + $type = $row->type; + } + + $_SESSION['hierarhija'][$anketa]['type'] = $type; + + return $type; + } + + /** + * Preverimo, komu so bile poslane kode in vrnemo ustrezno besedilo + * + * @param int $anketa + * @param string $string + * + * @return text + */ + public static function textGledeNaOpcije($anketa, $string = null) + { + global $lang; + + if (is_null($string)) { + return null; + } + + $poslji_kode = HierarhijaQuery::getOptionsPosljiKode($anketa); + + return $lang[$string.'_'.$poslji_kode]; + } + + /** + * Izpišemo nivoje hierarhije za našega uporabnika za prikaz linkov + */ + public static function hierarhijaPrikazNaslovovpriUrlju( + $anketa, + $struktura_id, + $email = null + ) { + global $global_user_id; + + $predmet = (new HierarhijaOnlyQuery())->queryStruktura($anketa, null, ' AND str.id='.$struktura_id)->fetch_object(); + + // V kolikor pošiljamo email vabilo admin in je aktiviral ali je $email že user_id + if ($email && is_numeric($email)) { + $user_id = $email; + } elseif ($email) { + $user_id = sisplet_query("SELECT user_id FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='".$predmet->id."'")->fetch_object()->user_id; + } else { + $user_id = $global_user_id; + } + $veja_hierarhije = (new HierarhijaQuery())->pridobiHierarhijoNavzgor($anketa, null, $user_id); + + $ime_strukture = []; + foreach ($veja_hierarhije as $key_struktura => $value_sifranta) { + + ### Če ključ trenutnega predmeta ustreza ključi polja za to hierarhijo, potem izpišemo pot za ta predmet (ime, razred, itd...) + if ($key_struktura == $predmet->id) { + #### Sortiramo polje od nivoja 1 do 6, ker drugače imamo obratno + krsort($value_sifranta); + $st_vnosov = sizeof($value_sifranta); + + $nivo_ime = null; + foreach ($value_sifranta as $key => $element) { + + // Tukaj prikaže tudi najvišji nivo, če je potrebno, če želimo najviši nivo izpustu + if ($key < $st_vnosov) { + $zacas_ime = (new HierarhijaOnlyQuery())->getSamoSifrant($element['id'], true)->fetch_object(); + $nivo_ime .= $zacas_ime->ime; + if ($key != 0) { + $nivo_ime .= ' - '; + } + } + } + + // V kolikor nas zanima naslov samo za eno strukturo + if (! is_null($struktura_id)) { + return $nivo_ime; + } + + $ime_strukture[$key_struktura] = $nivo_ime; + } + } + + return $ime_strukture; + } +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/HierarhijaIzvoz.php b/admin/survey/modules/mod_hierarhija/class/HierarhijaIzvoz.php new file mode 100644 index 0000000..18bda68 --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/HierarhijaIzvoz.php @@ -0,0 +1,344 @@ +anketa = $anketa; + + global $global_user_id; + $this->user_id = $global_user_id; + + TrackingClass::update($anketa, '21'); + + if (!(new Dostop())->checkDostop($this->anketa)) { + return FALSE; + } + } + + public static function getInstance($anketa) + { + if (self::$_instance) { + return self::$_instance; + } + + return new HierarhijaIzvoz($anketa); + } + + /** + * Izvozimo vse uporabnike, do katerih imamo dostop + * + * @param bool $porocilo - v kolikor gre za poročilo vrnemo polje; + * @return response downlod CSV + */ + + public function csvIzvozVsehUporabnikov() + { + $hierarhija_type = (!empty($_SESSION['hierarhija'][$this->anketa]['type']) ? $_SESSION['hierarhija'][$this->anketa]['type'] : NULL); + + if ($hierarhija_type < 5) { + $podatki = (new HierarhijaQuery())->hierarhijaArrayDataTables($this->anketa, NULL, TRUE); + } else { + $hierarhija = (new HierarhijaQuery()); + $uporabnik = $hierarhija->preveriPravicoUporabnika($this->anketa); + $struktura = $hierarhija->poisciHierarhijoNavzgor($uporabnik->struktura_id); + + $podatki = (new HierarhijaQuery())->hierarhijaArrayDataTables($this->anketa, $struktura, TRUE); + } + + // pridobimo prvo vrstico za izvoz + $ravni = sisplet_query("SELECT level, ime FROM srv_hierarhija_ravni WHERE anketa_id='" . $this->anketa . "' ORDER BY level", "obj"); + foreach ($ravni as $raven) { + $header[] = $raven->level . '. ' . $raven->ime; + } + $izvoz[] = $header; + + foreach ($podatki as $key => $row) { + foreach ($row as $podatek) { + $izvoz[$key + 1][] = str_replace('
', '', $podatek['label']); + } + } + + return Export::init($this->anketa)->csv('Izvoz uporabnikov', $izvoz); + } + + /** + * Pripravimo izvoz strukture za R poročilo ali CSV izvoz + * + * @param bool $porocilo + * @param bool $stevilke + * + * @return array|bool|void + */ + public function csvIzvozStruktureZaObdelavo($porocilo = false, $stevilke = false) + { + $hierarhija_type = (!empty($_SESSION['hierarhija'][$this->anketa]['type']) ? $_SESSION['hierarhija'][$this->anketa]['type'] : NULL); + + if ($hierarhija_type > 4) { + return FALSE; + } + + //Pridobimo vso strukturo iz šifer + $strukture = sisplet_query("SELECT k.url AS url, u.name AS name, u.surname AS surname, u.email AS email FROM srv_hierarhija_koda AS k LEFT JOIN users AS u ON k.user_id=u.id WHERE anketa_id='" . $this->anketa . "'", "obj"); + + // pridobimo prvo vrstico za izvoz + $ravni = sisplet_query("SELECT level, ime FROM srv_hierarhija_ravni WHERE anketa_id='" . $this->anketa . "' ORDER BY level", "obj"); + $header[] = 'vloga'; + foreach ($ravni as $raven) { + $header[] = $raven->level . '. ' . $raven->ime; + } + //podatki o učitelju + $header[] = 'Ime in priimek'; + $header[] = 'Email'; + + $izvoz[] = $header; + + foreach ($strukture as $key => $struktura) { + parse_str($struktura->url, $url); + asort($url); + + // izvozimo strukturo za vsakega učitelja posebej + foreach ($url as $keySifrant => $row) { + if ($key == 0) { + $izvoz[$key + 1][] = $keySifrant; + } + + $podatek = sisplet_query("SELECT naslov, variable FROM srv_vrednost WHERE id='".$row."'", "obj"); + if($stevilke){ + $izvoz[$key + 2][] = $podatek->variable; + }else { +// $podatek = sisplet_query("SELECT naslov, variable FROM srv_vrednost WHERE id='".$row."'", "obj"); + $izvoz[$key + 2][] = $podatek->naslov; + } + } + + + // Dodamo še drugo vrstico ime in email + $izvoz[1][sizeof($url)] = 'ime'; + $izvoz[1][sizeof($url) + 1] = 'email'; + + //Podatki o učitelju + $izvoz[$key + 2][] = $struktura->name . ' ' . $struktura->surname; + $izvoz[$key + 2][] = $struktura->email; + + } + + if($porocilo) + return $izvoz; + + return Export::init($this->anketa) + ->csv('Izvoz strukture hierarhije', $izvoz); + } + + /** + * Izvoz tabele status z vsemi šiframi in časi reševanja + * + * @return CSV download response + */ + public function csvIzvozStatusa() + { + + $hierarhija_type = (!empty($_SESSION['hierarhija'][$this->anketa]['type']) ? $_SESSION['hierarhija'][$this->anketa]['type'] : NULL); + + if ($hierarhija_type > 4) { + return FALSE; + } + + $header[] = [ + 'Hierarhija', + 'Email učitelja', + 'Koda za učence', + 'Status učencev - začel izpolnjevati', + 'Status učencev - delno izpolnjene', + 'Status učencev - končal anketo', + 'Časovni potek - prvi vnos', + 'Časovni potek - zadnji vnos', + 'Koda za učitelja', + 'Vnos učitelja', + ]; + + $body = $this->getStatus(); + + if (!is_null($body)) { + $izvoz = array_merge($header, $body); + } else { + $izvoz = $header; + } + + return Export::init($this->anketa)->csv('Status_izvoz', $izvoz); + } + + /** + * Pridobimo večdimenzionalno polje, kjer posamezna vrstica ima podatke o + * enem predmetu njegovih respondentih + * + * @param (boolean) $array - v kolikor vrnemo polje + * + * @return array|null + */ + public function getStatus($array = FALSE) + { + $izvoz = []; + + //v kolikor imamo več URL-jev se pravi za več predmetov potem moramo izpisati sklope za vse predmete + $max_st_nivojev = sisplet_query("SELECT MAX(level) FROM srv_hierarhija_struktura WHERE anketa_id='" . $this->anketa . "'"); + + // V kolikor še ni nič vnosov + if ($max_st_nivojev->num_rows == 0) { + return NULL; + } + + $max_st_nivojev = $max_st_nivojev->fetch_row()[0]; + + // Pridobimo vse ID-je na zadnjem nivoju + $strukture = (new HierarhijaOnlyQuery())->queryStrukturaUsers($this->anketa); + + // Zanka po celotni strukturi za vsakega učitelja pridobimo vse response + foreach ($strukture as $struktura) { + + // Prikažemo samo vpise, ki imajo vpisanega učitelja na zadnjem nivoju + if ($struktura['level'] == $max_st_nivojev) { + + // pridobimo podatke o rešenih anketah samo za to strukturo + $cas = $this->pridobiStatisticnePodatke($struktura['id'], 'ucenec'); + $cas_ucitelj = $this->pridobiStatisticnePodatke($struktura['id'], 'ucitelj'); + + $first_insert = NULL; + $last_insert = NULL; + $zacel_izpolnjevati = 0; + $delno_izpolnjena = 0; + $koncal_anketo = 0; + + if (!is_null($cas)) { + foreach ($cas as $key => $row) { + if ($row['cas'] < $first_insert || $key == 0) { + $first_insert = $row['cas']; + } + + if ($row['cas'] > $last_insert) { + $last_insert = $row['cas']; + } + + // Končal anketo + if ($row['status'] == 6 && $row['lurker'] == 0) { + $koncal_anketo++; + } + + // Delno izpolnjena + if ($row['status'] == 5 && $row['lurker'] == 0) { + $delno_izpolnjena++; + } + + if ($row['lurker'] == 1) { + $zacel_izpolnjevati++; + } + } + } + + $vrstica = [ + HierarhijaHelper::hierarhijaPrikazNaslovovpriUrlju($this->anketa, $struktura['id'], $struktura['email']), + $struktura['email'], + strtoupper(HierarhijaOnlyQuery::getKodaRow($this->anketa, $struktura['id'])->koda), + (!empty($zacel_izpolnjevati) ? $zacel_izpolnjevati : '/'), + (!empty($delno_izpolnjena) ? $delno_izpolnjena : '/'), + (!empty($koncal_anketo) ? $koncal_anketo : '/'), + (!is_null($first_insert) ? date('d.m.Y, H:i', $first_insert) : '/'), + (!is_null($last_insert) ? date('d.m.Y, H:i', $last_insert) : '/'), + strtoupper(HierarhijaOnlyQuery::getKodaRow($this->anketa, $struktura['id'], 'ucitelj')->koda), + ((!is_null($cas_ucitelj['cas']) && $cas_ucitelj['status'] == 6 && $cas_ucitelj['lurker'] == 0) ? date('d.m.Y, H:i', $cas_ucitelj['cas']) : '/'), + ]; + + $id_kode = HierarhijaOnlyQuery::getKodaRow($this->anketa, $struktura['id'])->koda; + + if ($array && !is_null($id_kode)) { + $izvoz[$id_kode] = $vrstica; + } else { + $izvoz[] = $vrstica; + } + } + + } + + return $izvoz; + } + + /** + * Pridobimo podatke o izpolnjevanju posameznega respondenta + * + * @param $struktura_id + * @param $vloga + * + * @return array|mixed|null + */ + private function pridobiStatisticnePodatke($struktura_id, $vloga) + { + + $url = sisplet_query("SELECT url FROM srv_hierarhija_koda WHERE anketa_id='" . $this->anketa . "' AND hierarhija_struktura_id='" . $struktura_id . "' AND vloga='" . $vloga . "'", "obj")->url; + + // V kolikor anketa še ni bila aktivirana potem vrnemo null, ker nimamo še podatkov o izpolnjevanju + if (is_null($url)) { + return NULL; + } + + parse_str($url, $nivoji); + + $polje_iskanja = NULL; + foreach ($nivoji as $key => $nivo) { + if ($key == 'vloga') { + $polje_iskanja = $nivo; + } else { + $polje_iskanja .= ', ' . $nivo; + } + } + + $db_table = (SurveyInfo::getInstance() + ->getSurveyColumn('db_table') == 1) ? '_active' : ''; + + // tukaj pridobimo podatke o anketi za določeno strukturo + // preverimov prvi in zadnji nivo + $sql_user = sisplet_query("SELECT time_insert, last_status, lurker FROM srv_data_vrednost" . $db_table . " as sa LEFT JOIN srv_user as us ON (sa.usr_id=us.id) WHERE vre_id IN (" . $polje_iskanja . ") GROUP BY usr_id HAVING COUNT(usr_id)=" . sizeof($nivoji)); + $cas = []; + + // V kolikor ni zapisov vrnemo prazno + if ($sql_user->num_rows == 0) { + return NULL; + } + + while ($row = mysqli_fetch_object($sql_user)) { + $cas[] = [ + 'cas' => strtotime($row->time_insert), + 'status' => $row->last_status, + 'lurker' => $row->lurker, + ]; + } + + if ($vloga == 'ucitelj') { + return $cas[0]; + } + + + return (sizeof($cas) > 0 ? $cas : NULL); + } +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/HierarhijaIzvozAnalize.php b/admin/survey/modules/mod_hierarhija/class/HierarhijaIzvozAnalize.php new file mode 100644 index 0000000..b79b8ba --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/HierarhijaIzvozAnalize.php @@ -0,0 +1,470 @@ +false); // za shrambo parametrov in sporocil + var $pdf; + var $currentStyle; + var $db_table = ''; + + public $meansClass = null; //means class + + var $meanData1; + var $meanData2; + + var $sessionData; // podatki ki so bili prej v sessionu - za nastavitve, ki se prenasajo v izvoze... + + + /** + * @desc konstruktor + */ + function __construct ($anketa = null, $podstran = 'mean') + { + global $site_path; + global $global_user_id; + + // preverimo ali imamo stevilko ankete + if ( is_numeric($anketa) ) + { + $this->anketa['id'] = $anketa; + $this->anketa['podstran'] = $podstran; + // create new PDF document + $this->pdf = new enka_TCPDF('L', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); + } + else + { + $this->pi['msg'] = "Anketa ni izbrana!"; + $this->pi['canCreate'] = false; + return false; + } + $_GET['a'] = A_ANALYSIS; + + // preberemo nastavitve iz baze (prej v sessionu) + SurveyUserSession::Init($this->anketa['id']); + $this->sessionData = SurveyUserSession::getData(); + + // ustvarimo means objekt + $this->meansClass = new HierarhijaAnalysis($anketa); + + if ( SurveyInfo::getInstance()->SurveyInit($this->anketa['id']) && $this->init()) + { + $this->anketa['uid'] = $global_user_id; + SurveyUserSetting::getInstance()->Init($this->anketa['id'], $this->anketa['uid']); + } + else + return false; + // ce smo prisli do tu je vse ok + $this->pi['canCreate'] = true; + + return true; + } + + // SETTERS && GETTERS + + function checkCreate() + { + return $this->pi['canCreate']; + } + function getFile($fileName) + { + //Close and output PDF document + ob_end_clean(); + $this->pdf->Output($fileName, 'I'); + } + + + function init() + { + global $lang; + + // array used to define the language and charset of the pdf file to be generated + $language_meta = Array(); + $language_meta['a_meta_charset'] = 'UTF-8'; + $language_meta['a_meta_dir'] = 'ltr'; + $language_meta['a_meta_language'] = 'sl'; + $language_meta['w_page'] = $lang['page']; + + //set some language-dependent strings + $this->pdf->setLanguageArray($language_meta); + + //set margins + $this->pdf->setPrintHeaderFirstPage(true); + $this->pdf->setPrintFooterFirstPage(true); + $this->pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); + $this->pdf->SetHeaderMargin(PDF_MARGIN_HEADER); + $this->pdf->SetFooterMargin(PDF_MARGIN_FOOTER); + + // set header and footer fonts + $this->pdf->setHeaderFont(Array(FNT_HEADER_TEXT, "I", FNT_HEADER_SIZE)); + $this->pdf->setFooterFont(Array(FNT_HEADER_TEXT, 'I', FNT_HEADER_SIZE)); + + + // set document information + $this->pdf->SetAuthor('An Order Form'); + $this->pdf->SetTitle('An Order'); + $this->pdf->SetSubject('An Order'); + + // set default header data + $this->pdf->SetHeaderData(null, null, "www.1ka.si", $this->encodeText(SurveyInfo::getInstance()->getSurveyAkronim())); + + //set auto page breaks + $this->pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); + + $this->pdf->SetFont(FNT_MAIN_TEXT, '', FNT_MAIN_SIZE); + //set image scale factor + $this->pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); + return true; + } + + function encodeText($text) + { // popravimo sumnike ce je potrebno + $text = html_entity_decode($text, ENT_NOQUOTES, 'UTF-8'); + $text = str_replace(array("š","š","č"),array("š","š","č"),$text); + return strip_tags($text); + } + + function createPdf() + { + global $site_path; + global $lang; + + + // izpisemo prvo stran + //$this->createFrontPage(); + + $this->pdf->AddPage(); + + $this->pdf->setFont('','B','11'); + $this->pdf->MultiCell(150, 5, $lang['srv_hierarchy_analysis_export'], 0, 'L', 0, 1, 0 ,0, true); + + $this->pdf->setDrawColor(128, 128, 128); + $this->pdf->setFont('','','6'); + + # polovimo nastavtve missing profila + //SurveyConditionProfiles:: getConditionString(); + + + $this->meanData1 = $this->sessionData['means']['means_variables']['variabla1']; + $this->meanData2 = $this->sessionData['means']['means_variables']['variabla2']; + + $means = array(); + # če ne uporabljamo privzetega časovnega profila izpišemo opozorilo + //$doNewLine = SurveyTimeProfiles :: printIsDefaultProfile(false); + + # če imamo filter ifov ga izpišemo + //$doNewLine = SurveyConditionProfiles:: getConditionString($doNewLine ); + + # če imamo filter spremenljivk ga izpišemo + //$doNewLine = SurveyVariablesProfiles:: getProfileString($doNewLine , true) || $doNewLine; + + if ($this->meanData1 !== null && $this->meanData2 !== null) { + $variables1 = $this->meanData2; + $variables2 = $this->meanData1; + $c1=0; + $c2=0; + + if(is_array($variables2) && count($variables2) > 0){ + #prikazujemo ločeno + if ($this->sessionData['means']['meansSeperateTables'] == true || $this->sessionData['mean_charts']['showChart'] == '1') { + foreach ($variables2 AS $v_second) { + if (is_array($variables1) && count($variables1) > 0) { + foreach ($variables1 AS $v_first) { + $_means = $this->meansClass->createMeans($v_first, $v_second); + if ($_means != null) { + $means[$c1][0] = $_means; + } + $c1++; + } + } + } + } + #prikazujemo skupaj + else { + foreach ($variables2 AS $v_second) { + if (is_array($variables1) && count($variables1) > 0) { + foreach ($variables1 AS $v_first) { + $_means = $this->meansClass->createMeans($v_first, $v_second); + if ($_means != null) { + $means[$c1][$c2] = $_means; + } + $c2++; + } + } + $c1++; + $c2=0; + } + } + } + + + if (is_array($means) && count($means) > 0) { + + $count = 0; + foreach ($means AS $mean_sub_grup) { + + if($this->sessionData['mean_charts']['showChart'] == '1'){ + if($count > 0){ + $this->pdf->AddPage(); + } + + $this->pdf->ln(10); + + $this->displayMeansTable($mean_sub_grup); + $this->displayChart($count); + } + else{ + if($count%2 == 0 && $count > 0){ + $this->pdf->AddPage(); + } + + $this->pdf->ln(10); + $this->displayMeansTable($mean_sub_grup); + $this->pdf->ln(10); + } + + $count++; + } + } + } + } + + public function displayMeansTable($_means) { + global $lang; + + #število vratic in število kolon + $cols = count($_means); + # preberemo kr iz prvega loopa + $rows = count($_means[0]['options']); + + // sirina ene celice + $singleWidth = round( 180 / $cols / 5 ); + + // visina prve vrstice + $firstHeight = 0; + for ($i = 0; $i < $cols; $i++) { + + $label1 = $this->meansClass->getSpremenljivkaTitle($_means[$i]['v1']); + + /*$linecount = $this->pdf->getNumLines($this->encodeText($label1), $singleWidth*2); + $height = ( $linecount == 1 ? 4.7 : (4.7 + ($linecount-1)*3.3) ); + $firstHeight = ($height > $firstHeight) ? $height : $firstHeight;*/ + $firstHeight = ($firstHeight > $this->getCellHeight($this->encodeText($label1), $singleWidth*2)) ? $firstHeight : $this->getCellHeight($this->encodeText($label1), $singleWidth*2); + } + + + // prva vrstica + $this->pdf->setFont('','B','6'); + + $label2 = $this->meansClass->getSpremenljivkaTitle($_means[0]['v2']); + $this->pdf->MultiCell(80, $firstHeight, $this->encodeText($label2), 'TLR', 'C', 0, 0, 0 ,0, true); + + for ($i = 0; $i < $cols; $i++) { + + $label1 = $this->meansClass->getSpremenljivkaTitle($_means[$i]['v1']); + $this->pdf->MultiCell($singleWidth*5, $firstHeight, $this->encodeText($label1), 1, 'C', 0, 0, 0 ,0, true); + } + $this->pdf->MultiCell(1, $firstHeight, $this->encodeText(''), 0, 'C', 0, 1, 0 ,0, true); + + $this->pdf->setFont('','','6'); + + // druga vrstica + $this->pdf->MultiCell(80, 7, $this->encodeText(''), 'BLR', 'C', 0, 0, 0 ,0, true); + + for ($i = 0; $i < $cols; $i++) { + + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($lang['srv_means_label']), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($lang['srv_hierarchy_label_st']), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($lang['srv_hierarchy_label_min']), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($lang['srv_hierarchy_label_max']), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($lang['srv_hierarchy_label_std_dev']), 1, 'C', 0, 0, 0 ,0, true); + } + $this->pdf->MultiCell(1, 7, $this->encodeText(''), 0, 'C', 0, 1, 0 ,0, true); + + + // vrstice s podatki + if (count($_means[0]['options']) > 0) { + foreach ($_means[0]['options'] as $ckey2 =>$crossVariabla2) { + + $variabla = $crossVariabla2['naslov']; + # če ni tekstovni odgovor dodamo key + if ($crossVariabla2['type'] !== 't' ) { + if ($crossVariabla2['vr_id'] == null) { + $variabla .= ' ( '.$ckey2.' )'; + } else { + $variabla .= ' ( '.$crossVariabla2['vr_id'].' )'; + } + } + $this->pdf->MultiCell(80, 7, $this->encodeText($variabla), 1, 'C', 0, 0, 0 ,0, true); + + # celice z vsebino + for ($i = 0; $i < $cols; $i++) { + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($this->meansClass->formatNumber($_means[$i]['result'][$ckey2], SurveyDataSettingProfiles :: getSetting('NUM_DIGIT_RESIDUAL'))), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText((int)$_means[$i]['sumaVrstica'][$ckey2]), 1, 'C', 0, 0, 0 ,0, true); + + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($this->meansClass->formatNumber($_means[$i]['min'][$ckey2], SurveyDataSettingProfiles :: getSetting('NUM_DIGIT_RESIDUAL'))), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($this->meansClass->formatNumber($_means[$i]['max'][$ckey2], SurveyDataSettingProfiles :: getSetting('NUM_DIGIT_RESIDUAL'))), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($this->meansClass->formatNumber($_means[$i]['stdDeviation'][$ckey2], SurveyDataSettingProfiles :: getSetting('NUM_DIGIT_RESIDUAL'))), 1, 'C', 0, 0, 0 ,0, true); + + } + $this->pdf->MultiCell(1, 7, $this->encodeText(''), 0, 'C', 0, 1, 0 ,0, true); + } + } + + // SKUPAJ + $this->pdf->MultiCell(80, 7, $this->encodeText($lang['srv_means_label3']), 1, 'C', 0, 0, 0 ,0, true); + + for ($i = 0; $i < $cols; $i++) { + + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($this->meansClass->formatNumber($_means[$i]['sumaMeans'], SurveyDataSettingProfiles :: getSetting('NUM_DIGIT_RESIDUAL'))), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText((int)$_means[$i]['sumaSkupna']), 1, 'C', 0, 0, 0 ,0, true); + + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($this->meansClass->formatNumber($_means[$i]['sumaMin'], SurveyDataSettingProfiles :: getSetting('NUM_DIGIT_RESIDUAL'))), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($this->meansClass->formatNumber($_means[$i]['sumaMax'], SurveyDataSettingProfiles :: getSetting('NUM_DIGIT_RESIDUAL'))), 1, 'C', 0, 0, 0 ,0, true); + $this->pdf->MultiCell($singleWidth, 7, $this->encodeText($this->meansClass->formatNumber($_means[$i]['sumaStdDeviation'], SurveyDataSettingProfiles :: getSetting('NUM_DIGIT_RESIDUAL'))), 1, 'C', 0, 0, 0 ,0, true); + + } + $this->pdf->MultiCell(1, 7, $this->encodeText(''), 0, 'C', 0, 1, 0 ,0, true); + } + + function displayChart($counter){ + global $lang; + + $variables1 = $this->meanData1; + $variables2 = $this->meanData2; + + $pos1 = floor($counter / count($variables2)); + $pos2 = $counter % count($variables2); + + $chartID = implode('_', $variables1[$pos1]).'_'.implode('_', $variables2[$pos2]); + $chartID .= '_counter_'.$counter; + + + $settings = $this->sessionData['mean_charts'][$chartID]; + $imgName = $settings['name']; + + $size = getimagesize('pChart/Cache/'.$imgName); + $height = $size[1] / 4; + + if($this->pdf->getY() + $height > 250) + { + $this->pdf->AddPage(); + } + else + $this->pdf->setY($this->pdf->getY() + 15); + + + $this->pdf->Image('pChart/Cache/'.$imgName, $x='', $y='', $w=200, $h, $type='PNG', $link='', $align='N', $resize=true, $dpi=1600, $palign='C', $ismask=false, $imgmask=false, $border=0); + + + $this->pdf->setY($this->pdf->getY() + 5); + } + + /*Skrajsa tekst in doda '...' na koncu*/ + function snippet($text,$length=64,$tail="...") + { + $text = trim($text); + $txtl = strlen($text); + if($txtl > $length) + { + for($i=1;$text[$length-$i]!=" ";$i++) + { + if($i == $length) + { + return substr($text,0,$length) . $tail; + } + } + $text = substr($text,0,$length-$i+1) . $tail; + } + return $text; + } + + function drawLine() + { + $cy = $this->pdf->getY(); + $this->pdf->Line(15, $cy , 195, $cy , $this->currentStyle); + } + + function setUserId($usrId) {$this->anketa['uid'] = $usrId;} + function getUserId() {return ($this->anketa['uid'])?$this->anketa['uid']:false;} + + function formatNumber($value,$digit=0,$sufix="") + { + if ( $value <> 0 && $value != null ) + $result = round($value,$digit); + else + $result = "0"; + $result = number_format($result, $digit, ',', '.').$sufix; + + return $result; + } + + function getCellHeight($string, $width){ + + $this->pdf->startTransaction(); + // get the number of lines calling you method + $linecount = $this->pdf->MultiCell($width, 0, $string, 0, 'L', 0, 0, '', '', true, 0, false, true, 0); + // restore previous object + $this->pdf = $this->pdf->rollbackTransaction(); + + $height = ($linecount <= 1) ? 4.7 : $linecount * ($this->pdf->getFontSize() * $this->pdf->getCellHeightRatio()) + 2; + + return $height; + } + +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php b/admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php new file mode 100644 index 0000000..27dd880 --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php @@ -0,0 +1,418 @@ +anketa = $anketa; + + global $global_user_id; + $this->user_id = $global_user_id; + } + + public static function getInstance($anketa) + { + if (self::$_instance) + return self::$_instance; + + return new HierarhijaKopiranjeClass($anketa); + } + + /** + * Pridobimo celotno polje in tudi možnsz serialize v string za shranjevanje v bazo uporabimo + * + * @param (boolean) $seialize + * @return array | string + */ + public function get($serialize = false) + { + $struktura = $this->getStrukturaInUporabniki(); + + if ($serialize && !empty($struktura)) + return serialize($struktura); + + return $struktura; + } + + protected $polje_primerjava; + + /** + * Shranimo polje in uporabni + * + * @param (array) $struktura + * @return + */ + + public function save($struktura) + { + // Ustvarimo sistemsko vprašanje v kolikor kopiramo tudi strukturo k vlogi + (new Hierarhija($this->anketa))->izrisisSistemskoVprsanjeVloga(); + + // Shranimo strukturo + $this->insert($struktura, 0); + + } + + /** + * Vpišemo elemente v bazo + * + * @param (array) $polje - polje struktura, ki ga pridobimo iz baze + * @param (int) $parent_id - id parenta iz prejšnje strukture, po kateri iščemo + * @param (int) $new_parent_id - ID vpisa strukture, ki ga uporabimo za vpis parenta + */ + private function insert(array $polje, $parent_id, $new_parent_id = null) + { + if (isset($parent_id) && is_array($polje) && sizeof($polje) > 0) { + foreach ($polje as $raven) { + + if ($raven['parent_id'] == $parent_id) { + + // Pridobimo nove podatke s primerjavo s starimi ID-ji od prej, da shranimo strukturo + $hierarhija_ravni_id = (int)$this->primerjava['ravni'][$raven['ravni_id']]; + $hierarhija_sifrant_id = (int)$this->primerjava['sifranti'][$raven['sifrant_id']]; + $level = (int)$raven['level']; + + $sql_raven = sisplet_query(" + INSERT INTO srv_hierarhija_struktura + (hierarhija_ravni_id, parent_id, hierarhija_sifranti_id, level, anketa_id) + VALUES + ('" . $hierarhija_ravni_id . "', " . var_export($new_parent_id, true) . " , '" . $hierarhija_sifrant_id . "', '" . $level . "', '" . $this->anketa . "') + "); + $this->sqlError($sql_raven); + + // Pridobimo ID vpisa strukture + $id_strukture = mysqli_insert_id($GLOBALS['connect_db']); + + // Vpišemo uporabnike v kolikor jih imammo + if (isset($raven['uporabniki']) && sizeof($raven['uporabniki']) > 0) { + foreach ($raven['uporabniki'] as $uporabnik) { + $sql_user = sisplet_query("INSERT INTO srv_hierarhija_struktura_users (hierarhija_struktura_id, user_id) + VALUES ('" . $id_strukture . "', '" . $uporabnik . "')"); + $this->sqlError($sql_user); + + // Omogočimo tudi dostop uporabnikom do hierarhije s pravicami 10, najprej pa preverimo če je že vpisan, ker ne dovolimo duplikatov + $sql_uporabnik_obstaja = sisplet_query("SELECT type FROM srv_hierarhija_users WHERE anketa_id='".$this->anketa."' AND user_id='".$uporabnik."'"); + + if(mysqli_num_rows($sql_uporabnik_obstaja)) { + $sql_hierarhija_user = sisplet_query("INSERT INTO srv_hierarhija_users (user_id, anketa_id, type) VALUES ('" . $uporabnik . "', '" . $this->anketa . "', 10)"); + $this->sqlError($sql_hierarhija_user); + } + + // Omogočimo dostop omenjenim uporabnikom + HierarhijaQuery::dostopZaUporabnika($this->anketa, $uporabnik, 'insert'); + } + } + + // Vpišemo še vse child elemente, ki so v drevesni strukturi + $this->insert($polje, $raven['id'], $id_strukture); + + + } + } + + } + + } + + + /** + * Pridobimo vrednost za primerjavo; + * + * @param (array) $primerjava + * @return $this; + */ + private $primerjava; + + public function compare($primerjava) + { + $this->primerjava = $primerjava; + return $this; + } + + /** + * Pridobimo strukturo v obliki multi arraya in potem dodamo še uporabnike + * + * @return (array) + */ + protected function getStrukturaInUporabniki() + { + + $sql_vsa_hierarhija = (new HierarhijaOnlyQuery())->queryStruktura($this->anketa); + + // Izdelamo polje iz sql poizvedbe, da bomo v nadaljevanju izdelali vgnezdeno polje + $struktura = []; + while ($obj = $sql_vsa_hierarhija->fetch_object()) { + $struktura[] = [ + 'id' => $obj->id, + 'ravni_id' => $obj->ravni_id, + 'parent_id' => (is_null($obj->parent_id) ? 0 : $obj->parent_id), + 'sifrant_id' => $obj->sifrant_id, + 'level' => $obj->level, + 'uporabniki' => $this->getVseUporabnikeZaStrukturo($obj->id) + ]; + } + + return $struktura; + } + + + /** + * Pridobimo ID vseh uporabnikov, ki so na določeni strukturi + * + * @param (int) $id + * @return null | (array) + */ + + protected function getVseUporabnikeZaStrukturo($id) + { + $sql_uporabniki = sisplet_query("SELECT hierarhija_struktura_id, user_id FROM srv_hierarhija_struktura_users WHERE hierarhija_struktura_id='" . $id . "'"); + + if ($sql_uporabniki->num_rows == 0) + return null; + + $uporabniki = []; + while ($obj = $sql_uporabniki->fetch_object()) { + $uporabniki[] = $obj->user_id; + } + + return $uporabniki; + } + + /** + * Iz strukture hierarhije izdelamo vgnezdena polja kot je drevesna struktura + * + * @param (array) $elements + * @param (int) $parentId + * @return array + */ + protected function createTreeArray(array $elements, $parentId = 0) + { + $polje = []; + + foreach ($elements as $element) { + // Najprej poiščemoprvi nivo + if ($element['parent_id'] == $parentId) { + $naslednji = $this->createTreeArray($elements, $element['id']); + + // V kolikor imamo naslednji element polja, ga zapišemo + if ($naslednji) + $element['child'] = $naslednji; + + $polje[] = $element; + } + } + + return $polje; + } + + public function kopirajHierarhijo($hierarhija, $uporabniki = 0) + { + // preverimo, če je json + if ($this->isJson($hierarhija)) + $hierarhija = $this->isJson($hierarhija, 1); + + // v kolikor želimo kopirati tudi uporabnike/strukturo potem zbiramo stare in nove vrednosti + if ($uporabniki == 1) + $primerjava = [ + 'ravni' => [], + 'sifranti' => [], + ]; + + // vpisemo vse ravni in šifrante + if (!empty($hierarhija) && is_array($hierarhija) && sizeof($hierarhija) > 0) { + + foreach ($hierarhija as $ravni) { + $sql_ravni = sisplet_query("INSERT INTO srv_hierarhija_ravni (anketa_id, user_id, level, ime) VALUES ('$this->anketa', '" . $this->user_id . "', '" . $ravni['st'] . "', '" . $ravni['ime'] . "')"); + $this->sqlError($sql_ravni); + $id_ravni = mysqli_insert_id($GLOBALS['connect_db']); + + if ($uporabniki == 1 && isset($primerjava)) + $primerjava['ravni'][$ravni['id']] = $id_ravni; + + // V kolikor so tudi šifranti vpišemo še šifrante + if (!empty($ravni['sifranti']) && sizeof($ravni['sifranti']) > 0 && !empty($id_ravni)) { + foreach ($ravni['sifranti'] as $sifrant) { + if (!empty($sifrant['ime'])) { + $sql_hs = sisplet_query("INSERT INTO srv_hierarhija_sifranti (hierarhija_ravni_id, ime) VALUES ('" . $id_ravni . "', '" . $sifrant['ime'] . "')"); + $this->sqlError($sql_hs); + + if ($uporabniki == 1 && isset($primerjava['sifranti'])) { + $primerjava['sifranti'][$sifrant['id']] = mysqli_insert_id($GLOBALS['connect_db']); + } + + } + } + } + } + + } + + if ($uporabniki == 1 && isset($primerjava) && sizeof($primerjava['ravni']) > 0 && $id_shranjene_strukture > 0) { + $struktura = HierarhijaQuery::getHierarhijaShraniRow($id_shranjene_strukture, 'struktura'); + $struktura = unserialize($struktura); + + $this->compare($primerjava)->save($struktura); + } + + } + + /** + * Ustvarimo ravni in šifrante ter lahko tudi strukturo z uporabniki + * + * Funkcija omogoča kopiranje/ustvarjanje novih ravni in šifrantov, ki jih dobi preko večdimenzionalnega polja, + * lahko pa tudi kopira strukturo in uporabnike, tako da primerja nove ID-je ravni/sifrantov s starimi in gre postari strukturi ter + * zamenja stare ID-je z novimi ter zapiše tudi uporabnike + * + * @param (array) $hierarhija - multi array + * @param (int) $id_shranjene_strukture - pridobimo id vrstice iz tabele srv_hierarhija_shrani + * @param (int) $uporabniki - ali se kopirajo tudi uporabniki + * @return boolean + */ + public function ustvariRavniInSifranteLahkoTudiStrukturo($hierarhija, $id_shranjene_strukture = null, $uporabniki = 0) + { + // v kolikor želimo kopirati tudi uporabnike/strukturo potem zbiramo stare in nove vrednosti + if ($uporabniki == 1) + $primerjava = [ + 'ravni' => [], + 'sifranti' => [], + ]; + + // Nimamo hierarhije + if (empty($hierarhija)) + return false; + + // vpisemo vse ravni in šifrante + if (!empty($hierarhija) && is_array($hierarhija) && sizeof($hierarhija) > 0) { + + foreach ($hierarhija as $ravni) { + $ravni = (array)$ravni; + + $id_ravni = sisplet_query("INSERT INTO srv_hierarhija_ravni (anketa_id, user_id, level, ime) VALUES ('".$this->anketa."', '".$this->user_id."', '" . $ravni['st'] . "', '" . $ravni['ime'] . "')", "id"); + + if ($uporabniki == 1 && isset($primerjava)) + $primerjava['ravni'][$ravni['id']] = $id_ravni; + + // V kolikor so tudi šifranti vpišemo še šifrante + if (!empty($ravni['sifranti']) && sizeof($ravni['sifranti']) > 0 && !empty($id_ravni)) { + foreach ($ravni['sifranti'] as $sifrant) { + $sifrant = (array)$sifrant; + + if (!empty($sifrant['ime'])) { + $sql_hs = sisplet_query("INSERT INTO srv_hierarhija_sifranti (hierarhija_ravni_id, ime) VALUES ('" . $id_ravni . "', '" . $sifrant['ime'] . "')"); + $this->sqlError($sql_hs); + + if ($uporabniki == 1 && isset($primerjava['sifranti'])) { + $primerjava['sifranti'][$sifrant['id']] = mysqli_insert_id($GLOBALS['connect_db']); + } + + } + } + } + } + + } + + if ($uporabniki == 1 && isset($primerjava) && sizeof($primerjava['ravni']) > 0 && $id_shranjene_strukture > 0) { + $struktura = HierarhijaQuery::getHierarhijaShraniRow($id_shranjene_strukture, 'struktura'); + $struktura = unserialize($struktura); + + if (!empty($struktura) && sizeof($primerjava['ravni']) > 0) { + $this->compare($primerjava)->save($struktura); + } + } + + return true; + } + + /** + * Kopira celotrno strukturo iz stare ankete na novo anketo + * + * @param int $old_id + */ + public function kopirajCelotroStrukturoKNoviAnketi($old_id) + { + // pridobimo ID trenutne hierarhije še s tarim ID-jem ankete + // $old_id - ID trenutne ankete, preden jo skopiramo + $id_shranjene_strukture = (new HierarhijaQuery())->getDeleteHierarhijaOptions($old_id, 'srv_hierarhija_shrani_id', null, null, false); + $shranjeni_podatki_stare_ankete = sisplet_query("SELECT * FROM srv_hierarhija_shrani WHERE id='" . $id_shranjene_strukture . "'", "obj"); + + // Kopiramo podatke iz srv_hierarhija_shrani + $ime_strukture_pri_novi_anketi = $shranjeni_podatki_stare_ankete->ime . '_' . date('H:i:s'); + $id_stranjene_nove_ankete = sisplet_query("INSERT INTO + srv_hierarhija_shrani + (anketa_id, user_id, ime, hierarhija, struktura, st_uciteljev, st_vseh_uporabnikov, komentar) + VALUES + ( + $this->anketa, + $this->user_id, + '" . $ime_strukture_pri_novi_anketi . "', + '" . $shranjeni_podatki_stare_ankete->hierarhija . "', + '" . $shranjeni_podatki_stare_ankete->struktura . "', + '" . $shranjeni_podatki_stare_ankete->st_uciteljev . "', + '" . $shranjeni_podatki_stare_ankete->st_vseh_uporabnikov . "', + '" . $shranjeni_podatki_stare_ankete->komentar . "' + ) + ", "id"); + + // podatke shranimo še med opcije za specifično anketo + sisplet_query("INSERT INTO srv_hierarhija_options (anketa_id, option_name, option_value) VALUES ($this->anketa, 'srv_hierarhija_shrani_id', $id_stranjene_nove_ankete)"); + sisplet_query("INSERT INTO srv_hierarhija_options (anketa_id, option_name, option_value) VALUES ($this->anketa, 'aktivna_hierarhija_ime', '" . $ime_strukture_pri_novi_anketi . "')"); + + if ($this->isJson($shranjeni_podatki_stare_ankete->hierarhija)) { + $hierarhija = json_decode($shranjeni_podatki_stare_ankete->hierarhija); + } else { + $hierarhija = unserialize($shranjeni_podatki_stare_ankete->hierarhija); + } + + // $new_id je ID nove ankete, ki je bila skopirana + return $this->ustvariRavniInSifranteLahkoTudiStrukturo($hierarhija, $id_shranjene_strukture, 1); + + } + + /** + * Preverimo, če je JSON + * + * @param (string) $string + * @return return true ali error + */ + public function isJson($string, $polje = 0) + { + if (is_string($string)) { + $array = json_decode(stripslashes($string)); + + if (json_last_error() == JSON_ERROR_NONE) { + if ($polje) + return $array; + + return true; + } + } + + return false; + } + + public function sqlError($sql) + { + if (!$sql) { + echo mysqli_error($GLOBALS['connect_db']); + die(); + } + + } + +} \ No newline at end of file diff --git a/admin/survey/modules/mod_hierarhija/class/HierarhijaPorocilaClass.php b/admin/survey/modules/mod_hierarhija/class/HierarhijaPorocilaClass.php new file mode 100644 index 0000000..87745a2 --- /dev/null +++ b/admin/survey/modules/mod_hierarhija/class/HierarhijaPorocilaClass.php @@ -0,0 +1,321 @@ +anketa = $anketa; + + global $site_path; + $this->site_path = $site_path; + + } + + public function izvoz($vrsta = 'word') + { + if (!empty($_GET['t']) && in_array($_GET['t'], ['word', 'pdf'])) + $vrsta = $_GET['t']; + + // Samo za debug + if (false && $admin_type == 0) { + + // R parametri za PDF + if ($vrsta == 'pdf') { + $script = $this->site_path . self::scriptFolder . 'test_1ka_pdf.R'; + $content_type = 'text/x-csv; charset=utf-8'; + $file_name = 'test.pdf'; + }else{ + // R parametri, za DOC,DOCX + $script = $this->site_path . self::scriptFolder . 'test_1ka.R'; + $content_type = 'application/octet-stream'; + $file_name = 'test.docx'; + } + + $out = exec('Rscript ' . $script . ' 2>&1', $output, $return_var); + + // Testiranje - izpis errorjev + echo '
'; + echo 'Rscript ' . $script; + //echo '
'.$out.'
'; + var_dump($output); + echo '
'; + + + // Pripravimo file za download + if (file_exists($this->site_path . self::resultFolder . $file_name)) { + + $file = $this->site_path . self::resultFolder . $file_name; + + header('Content-Description: File Transfer'); + header('Content-Disposition: attachment; filename=' . basename($file_name)); + header('Content-Type: '.$content_type); + header("Content-Transfer-Encoding: Binary"); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + header('Content-Length: ' . filesize($file)); + + ob_clean(); + flush(); + + readfile($file); + } + + } + + // Pripravi CSV s podatki + $this->pripraviCSV(); + $this->pripraviCSVuciteljev(); + + // R parametri, za DOC,DOCX + $script = $this->site_path . self::scriptFolder . 'Hierarhija_1ka.R'; + $content_type = 'application/octet-stream'; + //Ime ankete + $ime = slug(SurveyInfo::getSurveyTitle(), '_'); + $file_name = 'SAMOEVALVACIJSKO_POROCILO__' . $ime . '.docx'; + + // R parametri za PDF + if ($vrsta == 'pdf') { + $script = $this->site_path . self::scriptFolder . 'Hierarhija_1ka_pdf.R'; + $content_type = 'text/x-csv; charset=utf-8'; + $file_name = 'SAMOEVALVACIJSKO_POROCILO_' . $ime . '.pdf'; + } + + $shrani_id = HierarhijaQuery::getOptions($this->anketa, 'srv_hierarhija_shrani_id'); + $logo = sisplet_query("SELECT logo FROM srv_hierarhija_shrani WHERE id='" . $shrani_id . "' AND anketa_id='" . $this->anketa . "'", "obj")->logo; + + // 1 - odgovori v anketami + // 2 - seznam uciteljev in predmetov + // 3 - ime datoteke v katero shranimo (pdf, docx) + // 4 - logo + $param = 'hierarhija_' . $this->anketa . '.csv hierarhija_ucitelji_' . $this->anketa . '.csv '. $file_name . ' ' . $logo; + + $out = exec('Rscript ' . $script . ' ' . $param . ' 2>&1', $output, $return_var); + + // Testiranje - izpis errorjev + if ($admin_type == 0) { + echo '
'; + echo 'Rscript ' . $script; + //echo '
'.$out.'
'; + var_dump($output); + echo '
'; + } + + // Pripravimo file za download + if (file_exists($this->site_path . self::resultFolder . $file_name)) { + + $file = $this->site_path . self::resultFolder . $file_name; + + header('Content-Description: File Transfer'); + header('Content-Disposition: attachment; filename=' . basename($file_name)); + header('Content-Type: '.$content_type); + header("Content-Transfer-Encoding: Binary"); + header('Expires: 0'); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + header('Content-Length: ' . filesize($file)); + + ob_clean(); + flush(); + + readfile($file); + } + + // Na koncu pobrisemo zacasne datoteke + $this->deleteTemp(); + + // Ugasnemo skripto:) + die(); + } + + /** + * Pripravimo CSV izvoz vseh podatkov + */ + private function pripraviCSV() + { + $temp_folder = $this->site_path . self::tempFolder; + + $SDF = SurveyDataFile::get_instance(); + $SDF->init($this->anketa); + $_headFileName = $SDF->getHeaderFileName(); + $_dataFileName = $SDF->getDataFileName(); + $_fileStatus = $SDF->getStatus(); + + if(count(file($_dataFileName)) < 3){ + global $site_url; + echo 'Premalo podatkov'; + redirect($site_url . 'admin/survey/index.php?anketa=' . $this->anketa . '&a=' . A_HIERARHIJA_SUPERADMIN . '&m=' . M_ANALIZE.'&error=invalid'); + die(); + } + + if ($_headFileName != null && $_headFileName != '') { + $_HEADERS = unserialize(file_get_contents($_headFileName)); + } else { + echo 'Error! Empty file name!'; + } + + // Zaenkrat dopuscamo samo status 6 in brez lurkerjev + $status_filter = '(' . STATUS_FIELD . ' ~ /6|5/)&&(' . LURKER_FIELD . '==0)'; + //$status_filter = '('.STATUS_FIELD.'==6)&&('.LURKER_FIELD.'==0)'; + + //$start_sequence = $_HEADERS['_settings']['dataSequence']; + $start_sequence = 2; + $end_sequence = $_HEADERS['_settings']['metaSequence'] - 1; + + $field_delimit = ';'; + + // Pridobi filtre +// $hierarhija_analize = (new \HierarhijaAnalysis($this->anketa)); +// $hierarhija_filter = $hierarhija_analize->filterHierarhijeIzTekstovneDatoteke(); +// $ucitelj_filter = $hierarhija_analize->filterHierarhijeZaSpecificnegaUciteljaIzDatoteke(); +// (!empty($ucitelj_filter) ? $ucitelj_filter : $hierarhija_filter) // preveri izpis conzole + + // Filtriramo podatke po statusu in jih zapisemo v temp folder + $out = shell_exec('awk -F"|" \'BEGIN {{OFS=","} {ORS="\n"}} ' . $status_filter . '\' ' . $_dataFileName . ' | cut -d \'|\' -f ' . $start_sequence . '-' . $end_sequence . ' >> ' . $temp_folder . 'temp_data_' . $this->anketa . '.dat'); +// dump('awk -F"|" \'BEGIN {{OFS=","} {ORS="\n"}} '.$status_filter.'\' '.$_dataFileName.' | cut -d \'|\' -f '.$start_sequence.'-'.$end_sequence.' >> '.$temp_folder.'temp_data_'.$this->anketa.'.dat'); + + + // Ustvarimo koncni CSV + if ($fd = fopen($temp_folder . 'temp_data_' . $this->anketa . '.dat', "r")) { + + $fd2 = fopen($temp_folder . 'hierarhija_' . $this->anketa . '.csv', "w+"); + + $convertType = 1; // kateri tip konvertiranja uporabimo + $convertTypes[1] = array('charSet' => 'windows-1250', + 'delimit' => ';', + 'newLine' => "\n", + 'BOMchar' => "\xEF\xBB\xBF"); + # dodamo boomchar za utf-8 + fwrite($fd2, $convertTypes[$convertType]['BOMchar']); + + # naredimo header row + foreach ($_HEADERS AS $spid => $spremenljivka) { + if (count($spremenljivka['grids']) > 0) { + foreach ($spremenljivka['grids'] AS $gid => $grid) { + foreach ($grid['variables'] AS $vid => $variable) { + if ($spremenljivka['tip'] !== 'sm' && !($variable['variable'] == 'uid' && $variable['naslov'] == 'User ID')) { + $output1 .= strip_tags($variable['variable']) . $field_delimit; + $output2 .= '"' . strip_tags($variable['naslov']) . '"' . $field_delimit; + } + } + } + } + } + + fwrite($fd2, $output1 . "\r\n"); + fwrite($fd2, $output2 . "\r\n"); + + while ($line = fgets($fd)) { + + $temp = array(); + $temp = explode('|', $line); + + // Zamenjamo številke z vrednostmi predmetov hierarhije + $grupaId = HierarhijaOnlyQuery::getGrupaId($this->anketa); + + // Pripravimo polje po katerem iščemo nivoje + $stRavni = sisplet_query("SELECT count('id') as st FROM srv_hierarhija_ravni WHERE anketa_id = '" . $this->anketa . "'", "obj")->st; + $isci_po_polju = "'nivo1'"; + for ($i = 2; $i <= $stRavni; $i++) { + $isci_po_polju .= ",'nivo" . $i . "'"; + } + + $elementi_hierarhije = sisplet_query("SELECT id, variable FROM srv_spremenljivka WHERE gru_id='" . $grupaId . "' AND variable IN (" . $isci_po_polju . ") ORDER BY vrstni_red", "obj"); + + // od 8 elementa v txt datoteki se začne naprej hierarhija + $line_explode = explode('|', $line); + // številka prvega elementa, ki ga bomo zamenjali - vloga + $st = 9; + foreach ($elementi_hierarhije as $element) { + $ime_strukture = sisplet_query("SELECT naslov FROM srv_vrednost WHERE spr_id='" . $element->id . "' AND variable='" . $line_explode[$st] . "'", "obj")->naslov; + $line_explode[$st] = $ime_strukture; + $st++; + } + + $line = join('|', $line_explode); + $line = '"' . str_replace(array("\r", "\n", "\"", "|"), array("", "", "", '";"'), $line) . '"'; + + + // Spremenimo encoding v windows-1250 + //$line = iconv("UTF-8","Windows-1250//TRANSLIT", $line); + + fwrite($fd2, $line); + fwrite($fd2, "\r\n"); + + } + + fclose($fd2); + } + fclose($fd); + + + // Na koncu pobrisemo temp datoteke + if (file_exists($temp_folder . '/temp_data_' . $this->anketa . '.dat')) { + unlink($temp_folder . '/temp_data_' . $this->anketa . '.dat'); + } + } + + /** + * Izvoz hierarhije učiteljev z imenomin priimkom ter elektronskim naslovom + */ + private function pripraviCSVuciteljev(){ + $ucitelji = HierarhijaIzvoz::getInstance($this->anketa)->csvIzvozStruktureZaObdelavo(true); + + $temp_folder = $this->site_path . self::tempFolder; + $file = fopen($temp_folder . 'hierarhija_ucitelji_' . $this->anketa . '.csv', "w+"); + + $convertType = 1; // kateri tip konvertiranja uporabimo + $convertTypes[1] = array('charSet' => 'windows-1250', + 'delimit' => ';', + 'newLine' => "\n", + 'BOMchar' => "\xEF\xBB\xBF"); + # dodamo boomchar za utf-8 + fwrite($file, $convertTypes[$convertType]['BOMchar']); + + foreach($ucitelji as $ucitelj){ + fputcsv($file, $ucitelj); + } + + fclose($file); + } + + private function deleteTemp() + { + $temp_folder = $this->site_path . self::tempFolder; + + // Pobriše CSV datoteko + if (file_exists($temp_folder . '/hierarhija' . $this->anketa . '.csv')) + unlink($temp_folder . '/hierarhija' . $this->anketa . '.csv'); + + // Pobriše CSV datoteko uciteljev + if (file_exists($temp_folder . '/hierarhija_ucitelji_' . $this->anketa . '.csv')) + unlink($temp_folder . '/hierarhija_ucitelji_' . $this->anketa . '.csv'); + + // Pobrisemo še vse v rezultatih + $files = glob($this->site_path . self::resultFolder . '*'); + foreach ($files as $file) { + if (is_file($file)) + unlink($file); + } + } +} \ No newline at end of file -- cgit v1.2.3