summaryrefslogtreecommitdiffstats
path: root/admin/survey/modules/mod_hierarhija/class
diff options
context:
space:
mode:
authorAnton Luka Šijanec <anton@sijanec.eu>2022-01-11 12:35:47 +0100
committerAnton Luka Šijanec <anton@sijanec.eu>2022-01-11 12:35:47 +0100
commit19985dbb8c0aa66dc4bf7905abc1148de909097d (patch)
tree2cd5a5d20d7e80fc2a51adf60d838d8a2c40999e /admin/survey/modules/mod_hierarhija/class
download1ka-19985dbb8c0aa66dc4bf7905abc1148de909097d.tar
1ka-19985dbb8c0aa66dc4bf7905abc1148de909097d.tar.gz
1ka-19985dbb8c0aa66dc4bf7905abc1148de909097d.tar.bz2
1ka-19985dbb8c0aa66dc4bf7905abc1148de909097d.tar.lz
1ka-19985dbb8c0aa66dc4bf7905abc1148de909097d.tar.xz
1ka-19985dbb8c0aa66dc4bf7905abc1148de909097d.tar.zst
1ka-19985dbb8c0aa66dc4bf7905abc1148de909097d.zip
Diffstat (limited to 'admin/survey/modules/mod_hierarhija/class')
-rw-r--r--admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaClass.php561
-rw-r--r--admin/survey/modules/mod_hierarhija/class/Ajax/AjaxHierarhijaDostopUporabnikovClass.php243
-rw-r--r--admin/survey/modules/mod_hierarhija/class/Ajax/AjaxSuperSifraClass.php69
-rw-r--r--admin/survey/modules/mod_hierarhija/class/Ajax/AjaxUporabnikiClass.php834
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaAjaxClass.php1063
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaAnalysisClass.php2617
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaClass.php2261
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaHelper.php340
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaIzvoz.php344
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaIzvozAnalize.php470
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaKopiranjeClass.php418
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaPorocilaClass.php321
12 files changed, 9541 insertions, 0 deletions
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 @@
+<?php
+/***************************************
+ * Description: Ajax requesti, ki se uporabljajo za kreiranje hierarhije, šifrantov in nivojev
+ * Autor: Robert Šmalc
+ * Created date: 03.02.2017
+ *****************************************/
+
+namespace Hierarhija\Ajax;
+
+
+use Hierarhija\HierarhijaKopiranjeClass;
+use Hierarhija\Model\HierarhijaQuery;
+use JsonSerializable;
+use TrackingClass;
+
+class AjaxHierarhija implements JsonSerializable
+{
+ private $anketa;
+ private $json;
+ private $lang;
+ private $user_id;
+
+ public function __construct($anketa)
+ {
+ $this->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 = '<div>';
+ $izrisi .= '<h2>' . $this->lang['srv_hierarchy_import_code'] . '</h2>';
+ $izrisi .= '<div>';
+ $izrisi .= '<a href="/uploadi/dokumenti/primer_csv_sifrantov_in_nivojev.csv" download><h5>' . $this->lang['srv_hierarchy_import_example'] . '</h5></a>';
+ $izrisi .= '
+ <form action="index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=uvoz-sifrantov&t=hierarhija-uvoz" method="POST" enctype="multipart/form-data">
+ <div style="display:block !important;width:52%;float:left; clear:both;">
+ <input type="file" name="uvozi-hierarhijo" class="upload-file" required="required"/>
+ </div>
+ <div style="display:block;float:left; padding-left: 20px;">
+ <button type="submit" class="btn btn-moder">Uvozi hierarhijo</button>
+ </div>
+ </form>
+ ';
+
+ $izrisi .= '</div>';
+ $izrisi .= '</div>';
+
+ // Gumb za zapret popup
+ $izrisi .= '<div class="buttonwrapper spaceRight floatLeft" style="clear: both;padding-top: 20px;">';
+ $izrisi .= '<a class="ovalbutton ovalbutton_gray" href="#" onclick="vrednost_cancel(); return false;"><span>' . $this->lang['srv_close_profile'] . '</span></a>' . "\n\r";
+ $izrisi .= '</div>';
+
+ 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 '<div>';
+ echo '<h2> Komentar k hierarhiji </h2>';
+ echo '<div>';
+
+ echo '<div style="padding:15px 0;">';
+ echo '<textarea data-id="' . $shrani_id . '" id="hierarhija-komentar" name="komentar" style="height:100px; width:100%;">' . $komentar . '</textarea>';
+ echo '</div>';
+
+ echo '</div>';
+ echo '</div>';
+
+ // Gumb za zapret popup in potrdit
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_orange" href="#" onclick="shraniKomentar()"; return false;"><span>' . $this->lang['srv_potrdi'] . '</span></a>' . "\n\r";
+ echo '</div>';
+
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_gray" href="#" onclick="vrednost_cancel(); return false;"><span>' . $this->lang['srv_close_profile'] . '</span></a>' . "\n\r";
+ echo '</div>';
+ }
+
+ /**
+ * 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 '<div style="clear: both;" id="hierarhija-container">';
+ echo '<h2> Logotip </h2>';
+ echo '<div>';
+ if (!empty($logo))
+ echo '<div id="hierarhija-logo" style="padding-bottom: 15px; display: block; float: left;">
+ <img src="' . $site_url . 'admin/survey/modules/mod_hierarhija/porocila/logo/' . $logo . '" style="max-height: 100px; max-width: 500px;display: block;float: left;">
+ <span style="display: block;float: left; color:#ffa608;cursor: pointer;padding: 10px;" onclick="izbrisiLogo(\'' . $shrani_id . '\')"><i class="fa fa-trash" aria-hidden="true"></i> Izbriši</span>
+ </div>';
+
+ echo '<div style="padding:15px 0;">';
+ echo '
+ <form action="index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=upload-logo" method="POST" enctype="multipart/form-data">
+ <input type="hidden" name="id" value="' . $shrani_id . '">
+ <div style="display:block !important;width:52%;float:left; clear:both;">
+ <input type="file" name="logo" class="upload-file" required="required"/>
+ </div>
+
+ <div style="clear: both; padding-top: 20px;">
+ <div class="buttonwrapper spaceRight floatLeft">
+ <button type="submit" class="btn btn-moder">Naloži</button>
+ </div>
+
+ <div class="buttonwrapper spaceRight floatLeft">
+ <button class="btn btn-moder" href="#" onclick="vrednost_cancel(); return false;"><span>' . $this->lang['srv_close_profile'] . '</span></button>
+ </div>
+ </div>
+
+ </form>
+ ';
+ echo '</div>';
+ echo '</div>';
+ echo '</div>';
+ }
+
+
+ /**
+ * 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 @@
+<?php
+/***************************************
+ * Description: Omogočanje dostopa za SA modul
+ * Autor: Robert Šmalc
+ * Created date: 28.09.2017
+ *****************************************/
+
+namespace Hierarhija\Ajax;
+
+
+class AjaxHierarhijaDostopUporabnikovClass {
+
+ public function __construct()
+ {
+ global $admin_type;
+
+ if($admin_type != 0)
+ return false;
+
+ if (!$this->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 '<div class="sa-modul">';
+
+ echo '<div>';
+ if(!empty($user)){
+ echo '<h2> Urejanje uporabnika <span class="red">'.$user->name.' ' .$user->surname.'</span> za dostop do SA modula</h2>';
+ }else {
+ echo '<h2> Vpiši uporabnika za dostop do SA modula</h2>';
+ }
+ echo '<div>';
+
+ // EMAIL
+ echo '<div style="width: 100%;">';
+ echo '<label>Elektronski naslov</label><br/>';
+ if(!empty($user)){
+ echo '<input type="email" value="'.$user->email .'" disabled="disabled" style="width: 80%; padding: 4px; margin: 2px 0;"/>';
+ }else{
+ echo '<input type="email"
+ value=""
+ placeholder="janez.novak@sola.si"
+ id="sa-email"
+ onblur="preveriVpisanEmailZaSAdostop()"
+ required="required"
+ style="width: 80%; padding: 4px; margin: 2px 0;"/>';
+ echo '<input type="hidden" value="" id="sa-id" "/>';
+ echo '<span id="sa-email-sporocilo"></span>';
+ }
+ echo '</div>';
+
+ // Organizzacija
+ echo '<div style="padding:15px 0;width: 100%;">';
+ echo '<label>Šola oz. javni zavod</label><br/>';
+ echo '<input type="text" value="'.(!empty($user) ? $user->ustanova : NULL).'" placeholder="Srednja šola" id="sa-ustanova" required="required" style="width: 80%; padding: 4px; margin: 2px 0;"/>';
+ echo '</div>';
+
+ // Email za AAI dostop
+ echo '<div style="padding-bottom:15px; width: 100%;">';
+ echo '<label>Elektronski naaslov za AAI dostop (v kolikor je primarni email drugačen od AAI dostopa)</label><br/>';
+ echo '<input type="email" value="'.(!empty($user) ? $user->aai_email : NULL).'" placeholder="janez.novak@guest.arnes.si" id="sa-aai" style="width: 80%; padding: 4px; margin: 2px 0;"/>';
+ echo '</div>';
+
+ echo '</div>';
+ echo '</div>';
+
+ // Gumb za zapret popup in potrdit
+ echo '<div class="sa-modul">';
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ if(!empty($user)) {
+ echo '<a class="ovalbutton ovalbutton_orange sa-potrdi" href="#" onclick="posodobiSAuporabnika(\'' . $user->id . '\')"; return false;"><span>' . $lang['srv_potrdi'] . '</span></a>' . "\n\r";
+ }else {
+ echo '<a class="ovalbutton ovalbutton_orange sa-potrdi" href="#" onclick="shraniSAuporabnika()"; return false;"><span>' . $lang['srv_potrdi'] . '</span></a>' . "\n\r";
+ }
+ echo '</div>';
+
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_gray" href="#" onclick="vrednost_cancel(); return false;"><span>' . $lang['srv_close_profile'] . '</span></a>' . "\n\r";
+ echo '</div>';
+ echo '</div>';
+
+ echo '</div>';
+
+ }
+
+ 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 '<div style="float: right; width: 250px; max-height: 345px; overflow-y: auto">';
+ echo '<h3><strong>'.$lang['srv_ankete'].'</strong></h3>';
+
+ echo '<ul>';
+ $sql = sisplet_query("SELECT srv_anketa.id, srv_anketa.naslov FROM srv_dostop, srv_anketa WHERE srv_dostop.uid='$user_id' AND srv_dostop.ank_id=srv_anketa.id ORDER BY srv_anketa.edit_time DESC");
+ while ($row = mysqli_fetch_array($sql)) {
+ echo '<li><a href="#" onclick="anketa_user_dostop(\''.$uid.'\', \''.$row['id'].'\'); return false;">'.$row['naslov'].'</a></li>';
+ }
+
+ echo '</ul>';
+ echo '</div>';
+
+ $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 '<div class="sa-modul">';
+ echo '<h3><strong>'.$lang['user2'].'</strong></h3>';
+ echo '<p><label for="type">'.$lang['admin_type'].':</label>';
+ 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 '</p>';
+ echo '<p><label for="status">'.$lang['status'].':</label>';
+ switch ($user->status){
+ case 0:
+ echo $lang['srv_user_banned'];
+ break;
+ case 1:
+ echo $lang['srv_user_notbanned'];
+ break;
+ }
+ echo '</p>';
+ echo '<p><label for="email">'.$lang['email'].':</label>'.$user->email.'</p>';
+ echo '<p><label for="name">'.$lang['name'].':</label>'.$user->name.'</p>';
+ echo '<p><label for="surname">'.$lang['surname'].':</label>'.$user->surname.'</p>';
+ echo '<p><label for="ustanova">'.$lang['srv_hierarchy_users_organization'].':</label>'.$user->ustanova.'</p>';
+ echo '<p><label for="aai_uporabnik">'.$lang['srv_hierarchy_users_aai'].':</label>'.$user->aai_email.'</p>';
+ echo '<p><label for="created">'.$lang['srv_hierarchy_users_created'].':</label>'.$user->created.'</p>';
+ echo '<p><label for="updatetd">'.$lang['srv_hierarchy_users_updated'].':</label>'.$user->updated.'</p>';
+
+ // Gumb za zapret popup in potrdit
+ echo '<div style=" display: block;">';
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_gray" href="#" onclick="vrednost_cancel(); return false;"><span>' . $lang['srv_close_profile'] . '</span></a>' . "\n\r";
+ echo '</div>';
+ echo '</div>';
+ echo '</div>';
+
+
+ }
+
+
+ /**
+ * 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 @@
+<?php
+/***************************************
+ * Description:
+ * Autor: Robert Šmalc
+ * Created date: 06.07.2017
+ *****************************************/
+
+namespace Hierarhija\Ajax;
+
+use Hierarhija\Model\HierarhijaQuery;
+use TrackingClass;
+
+class AjaxSuperSifra
+{
+
+ private $anketa;
+ private $lang;
+ private $user_id;
+
+ public function __construct($anketa)
+ {
+ $this->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 @@
+<?php
+/***************************************
+ * Description:
+ * Autor: Robert Šmalc
+ * Created date: 03.02.2017
+ *****************************************/
+
+namespace Hierarhija\Ajax;
+
+
+use Hierarhija\HierarhijaAjax;
+use Hierarhija\HierarhijaHelper;
+use Hierarhija\Model\HierarhijaOnlyQuery;
+use Hierarhija\Model\HierarhijaQuery;
+use SurveyInfo;
+use TrackingClass;
+
+class AjaxUporabniki
+{
+ private $anketa;
+ private $lang;
+ private $hierarhija_type;
+
+ public function __construct($anketa)
+ {
+ if (empty($anketa))
+ return null;
+
+ $this->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 '<div>';
+ echo '<h2>' . $this->lang['srv_hierarchy_import_user_title'] . '</h2>';
+ echo '<div>';
+ echo $this->lang['srv_hierarchy_import_user_text'];
+
+ echo '<div style="padding:15px 0;">';
+ echo '<textarea id="users-email-import" name="emails" style="height:300px; width:45%;float: left;" placeholder="jan.nov@sola.si, Janez, Novak"></textarea>';
+ echo '<div style="width:50%;display: block;float: left;height: 320px;clear: right;overflow: auto;padding-left: 18px;">';
+ echo '<b>Seznam učiteljev:</b>';
+
+ $vsi_ucitelji = $this->getAllUserInJson(true);
+
+ if(!empty($vsi_ucitelji)) {
+ echo '<div style="height: 269px;overflow: auto;"><ul>';
+ foreach($vsi_ucitelji as $ucitelj) {
+ echo '<li>'.$ucitelj['label'].'</li>';
+ }
+ echo '</ul></div>';
+ }
+ echo '</div>';
+ echo '</div>';
+
+ echo '</div>';
+ echo '</div>';
+
+ // Gumb za zapret popup in potrdit
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_orange" href="#" onclick="shraniVseVpisaneUporabnike(); return false;"><span>' . $this->lang['srv_potrdi'] . '</span></a>' . "\n\r";
+ echo '</div>';
+
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_gray" href="#" onclick="vrednost_cancel(); return false;"><span>' . $this->lang['srv_close_profile'] . '</span></a>' . "\n\r";
+ echo '</div>';
+ }
+
+ /**
+ * 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 '<div>';
+ echo '<h2>' . ($last ? $this->lang['srv_hierarchy_add_new_user_popup_last'] : $this->lang['srv_hierarchy_add_new_user_popup']) . '</h2>';
+ echo '<div>';
+ echo($last ? $this->lang['srv_hierarchy_edit_users_last'] : $this->lang['srv_hierarchy_edit_users']);
+ echo '<div style="padding:15px 0;">';
+ if ($last) {
+ echo '<input type="text" id="vpis-email-popup" name="emails" style="height: 16px; width:100%;" />';
+ } else {
+ echo '<textarea id="vpis-email-popup" name="emails" style="height:100px; width:100%;"></textarea>';
+ }
+ echo '</div>';
+
+ echo '</div>';
+ echo '</div>';
+
+ // Gumb za zapret popup in potrdit
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_orange" href="#" onclick="shrani_email(' . $struktura_id . ', ' . $last . '); return false;"><span>' . $this->lang['srv_potrdi'] . '</span></a>' . "\n\r";
+ echo '</div>';
+
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_gray" href="#" onclick="vrednost_cancel(); return false;"><span>' . $this->lang['srv_close_profile'] . '</span></a>' . "\n\r";
+ echo '</div>';
+ }
+
+ /**
+ * 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 '<div class="zamenjava-uporabnika-v-strukturi">';
+ echo '<div>';
+ echo '<h2>' . $this->lang['srv_hierarchy_title_find_and_replace_user'] . '</h2>';
+
+ echo '<div>';
+ echo $this->lang['srv_hierarchy_text_find_and_replace_user'];
+
+ echo '<div style="padding:15px 0;">';
+ echo '<label style="font-weight: bold;padding-right: 10px;">' . $this->lang['srv_hierarchy_label_find_email'] . '</label>';
+ echo '<input type="text" id="find-email" name="emails" style="height: 16px; width:60%;float: right;margin-right: 10px;" />';
+ echo '<span class="error-label">' . $this->lang['srv_hierarchy_error_wrong_email_format'] . '</span>';
+ echo '</div>';
+
+ echo '<div style="padding:15px 0;">';
+ echo '<label style="font-weight: bold;padding-right: 10px;">' . $this->lang['srv_hierarchy_label_replace_email'] . '</label>';
+ echo '<input type="text" id="replace-email" name="emails" style="height: 16px; width:60%;float: right;margin-right: 10px;" />';
+ echo '<span class="error-label">' . $this->lang['srv_hierarchy_error_wrong_email_format'] . '</span>';
+ echo '</div>';
+
+ echo '</div>';
+
+ echo '</div>';
+
+ echo '<div id="st_zamenjav_uporabnikov"></div>';
+
+ // Gumb za zapret popup in potrdit
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_orange" href="#" onclick="potriZamenjavoUporabnika(); return false;"><span>' . $this->lang['srv_potrdi'] . '</span></a>' . "\n\r";
+ echo '</div>';
+
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_gray" href="#" onclick="testnoPreveriKolikoUporabnikovBoZamnjenihVStrukturi(); return false;"><span>' . $this->lang['srv_hierarchy_button_count_user_emails'] . '</span></a>' . "\n\r";
+ echo '</div>';
+
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_gray" href="#" onclick="vrednost_cancel(); return false;"><span>' . $this->lang['srv_close_profile'] . '</span></a>' . "\n\r";
+ echo '</div>';
+ echo '</div>';
+ }
+
+ /**
+ * 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 @@
+<?php
+
+/**
+ * Ime: Samoocena hierarhija vsi AJAX requesti
+ * Avtor: Robert Šmalc
+ */
+
+namespace Hierarhija;
+
+use Branching;
+use Dostop;
+use Common;
+use Hierarhija\Ajax\AjaxHierarhija;
+use Hierarhija\Ajax\AjaxHierarhijaClass;
+use Hierarhija\Ajax\AjaxUporabniki;
+use Hierarhija\Ajax\AjaxSuperSifra;
+use Hierarhija\Model\HierarhijaOnlyQuery;
+use Hierarhija\Model\HierarhijaQuery;
+use MailAdapter;
+use SurveyInfo;
+use TrackingClass;
+
+
+class HierarhijaAjax
+{
+ protected $anketa;
+ protected $lang;
+ protected $user_id;
+ protected $hierarhija_type;
+ protected $site_url;
+
+ public function __construct($anketa)
+ {
+ $this->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 '<h2>Hierarhija</h2>';
+ echo '<b>' . $hierarhija->ravni_ime;
+ if ($this->hierarhija_type > 4)
+ echo ' - ' . $hierarhija->sifrant_ime;
+ echo ': </b>';
+ }
+
+ /**
+ * 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 .= '<p>' . $this->lang['srv_hierarchy_manager_email_2'] . '»<b>' . SurveyInfo::getInstance()->getSurveyColumn('naslov') . '</b>«' . $this->lang['srv_hierarchy_manager_email_3'] . '<a href="' . $this->site_url . '" target="_blank">' . $this->site_url . '</a></p>';
+
+ //Zaključek emaila
+ $content .= '<p>' . $this->lang['srv_hierarchy_manager_email_4'] . '<a href="' . $this->site_url . '" target="_blank">' . $this->site_url . '</a>.' . $this->lang['srv_hierarchy_manager_email_5'];
+ $content .= '»' . $email . '«' . $this->lang['srv_hierarchy_manager_email_6'] . '</p>';
+
+ // 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 '<div style="padding: 50px 20px;">' . $this->lang['srv_hierarchy_preview_none'] . '</div>';
+
+ } else {
+
+ $vrsta = $_POST['vrsta'];
+
+ echo '<div style="padding-bottom: 20px;">';
+ echo '<h2>' . ($vrsta == 1 ? $this->lang['srv_hierarchy_preview_email_teacher_header'] : $this->lang['srv_hierarchy_preview_email_manager_header']) . '</h2>';
+ echo '<div>';
+
+ // email učitelji
+ if ($vrsta == 1) {
+ $koda_za_resevanje_ankete = HierarhijaQuery::getOptionsPosljiKode($this->anketa);
+
+ echo $this->lang['srv_hierarchy_teacher_email_1'];
+ echo '<p>' . $this->lang['srv_hierarchy_teacher_email_2'] . '»<b>' . SurveyInfo::getSurveyTitle() . '</b>«' . $this->lang['srv_hierarchy_teacher_email_3'] . '<a href="' . $this->site_url . 'sa" target="_blank">' . $this->site_url . 'sa</a></p>';
+
+ echo '<br /><table style="border-spacing: 0;">';
+ echo '<thead>';
+ echo '<tr>
+ <th style="border: 1px solid #ddd; padding: 8px 10px; text-align: left; background-color: #EFF2F7;">Hierarhija</th>';
+
+ // Koda samo za ucence
+ if (SurveyInfo::getSurveyModules('hierarhija') == 2 || in_array($koda_za_resevanje_ankete, ['vsem', 'ucitelju']))
+ echo '<th style="border: 1px solid #ddd; padding: 8px 10px; text-align: center; background-color: #EFF2F7;">Koda za učitelja</th>';
+
+ // V kolikor nimamo nikakršne izbere potem posredujemo kodo tudi za učence
+ if (in_array($koda_za_resevanje_ankete, ['vsem', 'ucencem']))
+ echo '<th style="border: 1px solid #ddd; padding: 8px 10px; text-align: center; background-color: #EFF2F7;">Koda za učence</th>';
+
+ echo '<tr>';
+ echo '</thead>';
+ echo '<tbody>';
+
+ echo '<tr>';
+ echo '<td style="border: 1px solid #ddd; padding: 8px 10px; text-align: left;">Struktura hierarhije</td>';
+
+ if (SurveyInfo::getSurveyModules('hierarhija') == 2 || in_array($koda_za_resevanje_ankete, ['vsem', 'ucitelju']))
+ echo '<td style="border: 1px solid #ddd; padding: 8px 10px; text-align: center;"><span style="letter-spacing: 1px; font-size:16px; font-weight: bold;"> # # # # # </span></td>';
+
+ if (in_array($koda_za_resevanje_ankete, ['vsem', 'ucencem']))
+ echo '<td style="border: 1px solid #ddd; padding: 8px 10px; text-align: center;color:#ffa608;"><span style="letter-spacing: 1px; font-size:16px; font-weight: bold;"> # # # # # </span></td>';
+ echo '</tr>';
+
+ echo '</tbody>';
+ echo '<table><br />';
+
+ //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 '<p>' . $this->lang['srv_hierarchy_teacher_email_4'] . '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>' . $this->lang['srv_hierarchy_teacher_email_5'];
+ echo '»' . $uporabnik->email . '«' . $this->lang['srv_hierarchy_teacher_email_6'] . '</p>';
+ }
+
+ }
+
+
+ // email managerji
+ if ($vrsta == 2) {
+ echo $this->lang['srv_hierarchy_manager_email_1'];
+ echo '<p>' . $this->lang['srv_hierarchy_manager_email_2'] . '»<b>' . SurveyInfo::getInstance()->getSurveyColumn('naslov') . '</b>«' . $this->lang['srv_hierarchy_manager_email_3'] . '<a href="' . $this->site_url . '" target="_blank">' . $this->site_url . '</a></p>';
+
+ //Zaključek emaila
+ echo '<p>' . $this->lang['srv_hierarchy_manager_email_4'] . '<a href="' . $this->site_url . '" target="_blank">' . $this->site_url . '</a>.' . $this->lang['srv_hierarchy_manager_email_5'];
+ echo '»<i>#elektronski naslov uporabnika#</i>«' . $this->lang['srv_hierarchy_manager_email_6'] . '</p>';
+ }
+
+ // Podpis
+ $signature = Common::getEmailSignature();
+ echo $signature . '<br /><br />';
+
+ echo '</div>';
+ echo '</div>';
+ }
+
+ // Gumb za zapret popup in potrdit
+ echo '<div class="buttonwrapper spaceRight floatLeft">';
+ echo '<a class="ovalbutton ovalbutton_gray" href="#" onclick="vrednost_cancel(); return false;"><span>' . $this->lang['srv_close_profile'] . '</span></a>' . "\n\r";
+ echo '</div>';
+
+ }
+
+ /**
+ * 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 '<h4>' . $ime_mape . '</h4>';
+ echo '<ul style="list-style: none;">';
+
+ 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 '<li>';
+ echo '<input type="radio" name="knjiznica_izbira" id="ank_'.$anketa->ank_id.'" value="'.$anketa->ank_id.'" /> ';
+ echo '<span class="enka-checkbox-radio"></span>';
+ echo '<span>
+ <a href="'.$this->site_url.'/main/survey/index.php?anketa='.$anketa->ank_id.'&amp;preview=on" target="_blank" title="Predogled ankete">
+ <span class="faicon preview"></span>
+ </a>
+ </span>';
+ echo '<label for="ank_'.$anketa->ank_id.'">'.$srv_anketa->naslov.'</label>';
+ echo '</li>';
+ }
+ }
+ } 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 '<li>';
+ echo '<input type="radio" name="knjiznica_izbira" id="ank_'.$ankete_v_knjiznici->ank_id.'" value="'.$ankete_v_knjiznici->ank_id.'" /> ';
+ echo '<span>
+ <a href="'.$this->site_url.'main/survey/index.php?anketa='.$ankete_v_knjiznici->ank_id.'&amp;preview=on" target="_blank" title="Predogled ankete">
+ <span class="faicon preview"></span>
+ </a>
+ </span>';
+ echo '<label for="ank_'.$ankete_v_knjiznici->ank_id.'">'.$srv_anketa->naslov.'</label>';
+ echo '</li>';
+ }
+ }
+
+ echo '</ul>';
+
+ }
+
+ /**
+ * 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 @@
+<?php
+/** Kopija razreda class.SurveyMeans povprečja - meanse
+ *
+ *
+ */
+
+define("EXPORT_FOLDER", "admin/survey/SurveyData");
+
+class HierarhijaAnalysis
+{
+ private $anketa; # id ankete
+ private $db_table; # katere tabele uporabljamo
+ private $_HEADERS = array(); # shranimo podatke vseh variabel
+ private $struktura = null; # ID strukture hierarhije, če želimo prikazati specifične rezultate za posameznega učitelja
+ private $struktura_ucitelj = []; # Pridobimo vse strukture za posameznega učitelja
+
+ private $headFileName = null; # pot do header fajla
+ private $dataFileName = null; # pot do data fajla
+ private $dataFileStatus = null; # status data datoteke
+ private $SDF = null; # class za inkrementalno dodajanje fajlov
+
+ public $variabla1 = array('0' => 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 '<script>
+ window.onload = function () {
+ change_hierarhy_means();
+ };
+ </script>';
+ }
+
+
+ # nastavimo vse filtre
+// $this->setUpFilter();
+
+ # nastavimo uporabniške nastavitve
+ $this->readUserSettings();
+
+ if (!empty($this->struktura)) {
+ // posodobimo vse filtre, ki so bili izbrani
+ echo '<script>
+ window.onload = function () {
+ posodobil_filter_analiz();
+ };
+ </script>';
+ }
+
+ }
+
+
+ /**
+ * 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("<pre>");
+ 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 '<input type="hidden" id="id-strukture" value="' . $this->struktura . '" />';
+
+
+// $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 '<div id="ucitelji" style="display:' . (($prikazi_fitre && !$prikazi_rezultate) ? 'block' : 'none') . ';">';
+ // Prikažemo seznam učiteljev za agregirane analize
+ $this->displayDropdownSeznamUciteljev();
+ echo '</div>';
+
+ echo '<div id="predmeti-in-ucitelji" style="display:' . (($prikazi_fitre && $prikazi_rezultate) ? 'block' : 'none') . ';">';
+ $this->displayDropdownSeznamUciteljevZaSpecificniPredmet();
+ echo '</div>';
+ }
+
+
+ echo '<div id="div_means_show_filter">';
+// echo '<div class="znak plus"><i class="fa fa-lg fa-plus-circle" aria-hidden="true"></i> Prikaži filtre</div>';
+// echo '<div class="znak minus"><i class="fa fa-lg fa-minus-circle" aria-hidden="true"></i> Skrij filtre</div>';
+ echo '<div id="div_means_dropdowns">';
+ $this->displayDropdowns();
+ echo '</div>';
+
+ // 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 '<div class="izvozi ucitelj">';
+ echo '<a href="#" onClick="printElement(\'Analize\'); return false;" title="' . $lang['PRN_Izpis'] . '" class="ikone"><span class="hover_export_icon"><span class="faicon print icon-grey_dark_link"></span></span>' . $lang['srv_export_hover_print'] . '</a>';
+ echo '<a href="'.$href_pdf.'" id="meansDoPdf" target="_blank" class="ikone"><span class="hover_export_icon"><span class="sprites pdf_large"></span></span>' . $lang['srv_export_hover_pdf'] . '</a>';
+ echo '<a href="'.$href_rtf.'" id="meansDoRtf" target="_blank" class="ikone"><span class="hover_export_icon"><span class="sprites rtf_large"></span></span>' . $lang['srv_export_hover_rtf'] . '</a>';
+ echo '</div>';
+
+ }
+ echo '</div>';
+
+ echo '<div id="div_means_data">';
+ $this->displayData();
+ echo '</div>'; #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 '<div id="hierarhija-specificni-ucitelj"><h2>';
+ $seja = SurveyUserSession::getData(['means']['imeHierarhije']);
+ if(!empty($this->sessionData['means']['imeHierarhije']))
+ echo $this->sessionData['means']['imeHierarhije'];
+ echo '</h2></div>';
+
+
+ // V kolikor gre za filtre po hierarhiji ali za filtre samo po učiteljih
+ echo '<div id="analize-nastavitve">';
+ echo '<div class="filtri">';
+ echo '<b>Filtriranje po: </b>';
+ echo '<input type="radio" name="hierarhija-ucitelj" id="hierarhija-radio-filter" value="filtri" onclick="posodobiPrikazHierarhije(\'filtri\')" ' . (!isset($this->sessionData['means']['strukturaUcitelj']) ? 'checked="checked"' : null) . '/> <label for="hierarhija-radio-filter">hierarhiji</label>';
+ echo '<input type="radio" name="hierarhija-ucitelj" id="hierarhija-radio-ucitelj" value="ucitelji" onclick="posodobiPrikazHierarhije(\'ucitelji\')" ' . (is_array($this->sessionData['means']['strukturaUcitelj']) ? 'checked="checked"' : null) . '/> <label for="hierarhija-radio-ucitelj">učiteljih</label>';
+
+ echo '<div class="filtri-ucitelji" style="display:' . (is_array($this->sessionData['means']['strukturaUcitelj']) ? 'block' : 'none') . ';">';
+ echo '<b>Rezultati bodo prikazani: </b>';
+ echo '<input type="radio" name="ucitelj-filter" id="ucitelj-filter-agregirano" value="agregirano" onclick="posodobiPrikazFiltraPoUciteljih(\'agregirano\')" ' . (!isset($this->sessionData['means']['uciteljFilter']) || $this->sessionData['means']['uciteljFilter'] == 'agregirano' ? 'checked="checked"' : null) . '/> <label for="ucitelj-filter-agregirano">agregirano</label>';
+ echo '<input type="radio" name="ucitelj-filter" id="ucitelj-filter-predmeti" value="predmeti" onclick="posodobiPrikazFiltraPoUciteljih(\'predmeti\')" ' . ($this->sessionData['means']['uciteljFilter'] == 'predmeti' ? 'checked="checked"' : null) . '/> <label for="ucitelj-filter-predmeti">po predmetih</label>';
+ echo '</div>';
+
+ echo '</div>';
+
+ echo '<div class="izvoz">';
+ echo '<b>Poročila po meri: </b>';
+ echo '<a href="index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=analize&r=custom&t=pdf" class="link-ikona pdf"><span class="faicon pdf black very_large" aria-hidden="true"></span></a>';
+ echo '<a href="index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=analize&r=custom&t=word" class="link-ikona word"><span class="faicon rtf black very_large" aria-hidden="true"></span></a>';
+ if($_GET['error'] == 'invalid') {
+ echo '<div class="error-display">'.$lang['srv_hierarchy_analysis_error_invalid_data'].'</div>';
+ }
+ echo '</div>';
+ echo '</div>';
+ }
+
+ /**
+ * 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 '<label>Izberite ustreznega učitelja:</label>';
+ echo '<select name="filter-po-ucitelju"
+ id="filter-po-ucitelju"
+ class="filter-ucitelji"
+ data-placeholder="' . $lang['srv_hierarchy_label_filter_teacher'] . '"
+ onchange="posodobi_izbranega_ucitelja()"
+ >';
+ echo '<option value="" selected="selected">---</option>';
+ while ($uporabnik = $vsi_uporabniki_upraviceni_do_evalvacije->fetch_object()) {
+
+ $izpis = $uporabnik->email;
+ if (!empty($uporabnik->name) && $uporabnik->name != $uporabnik->email || !empty($uporabnik->surname) && $uporabnik->surname != $uporabnik->email)
+ $izpis .= ' (' . $uporabnik->name . ' ' . $uporabnik->surname . ')';
+
+ echo '<option value="' . $uporabnik->user_id . '">' . $izpis . '</option>';
+ }
+ echo '</select>';
+ }
+
+ /**
+ * 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 '<label>Izberite ustrezen predmet:</label>';
+ echo '<select name="filter-po-ucitelju-in-predmetu"
+ id="filter-po-ucitelju-in-predmetu"
+ class="filter-ucitelji"
+ data-placeholder="' . $lang['srv_hierarchy_label_filter_teacher'] . '"
+ onchange="posodobi_izbran_predmet()"
+ >';
+ echo '<option value="" selected="selected">---</option>';
+ while ($uporabnik = $struktura_uporabnikov->fetch_object()) {
+
+ $izpis = \Hierarhija\HierarhijaHelper::hierarhijaPrikazNaslovovpriUrlju($this->anketa, $uporabnik->id, $uporabnik->user_id);
+ $izpis .= '&nbsp; &nbsp; &nbsp; ('.$uporabnik->email.')';
+
+ echo '<option value="' . $uporabnik->id . '">' . $izpis . '</option>';
+ }
+ echo '</select>';
+ }
+
+ 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 '<div id="meansLeftDropdowns" style="display:none;">';
+ if ((int)$this->variabla1['0']['seq'] > 0) {
+ echo '<span class="pointer space_means_new" >&nbsp;</span>';
+ }
+ echo $lang['srv_means_label1'];
+ echo '<br />';
+
+ #iz header datoteke preberemo spremenljivke
+ #js: $("#means_variable_1, #means_variable_2").live('click', function() {})
+ if (count($this->variabla1) > 0) {
+ $br = null;
+
+ foreach ($this->variabla1 AS $_key => $variabla1) {
+ echo $_br;
+ echo '<span id="v1_' . $_key . '">';
+
+ echo '<select name="means_variable_1" id="means_variable_1" onchange="change_hierarhy_means(); return false;" autocomplete="off">';
+//
+// # Tukaj vedno izberemo variablo vloga
+ if ($variabla1['seq'] == null || $variabla1['seq'] == 0) {
+ echo '<option value="0" selected="selected" >' . $lang['srv_means_izberi_prvo'] . '</option>';
+ }
+ foreach ($variables1 as $variable) {
+ echo '<option value="' . $variable['sequence'] . '" spr_id="' . $variable['spr_id'] . '" '
+ . (isset($variable['grd_id']) ? ' grd_id="' . $variable['grd_id'] . '" ' : '')
+ . ' selected="selected"> '
+ . ((int)$variable['sub'] == 0 ? '' : ((int)$variable['sub'] == 1 ? '&nbsp;&nbsp;' : '&nbsp;&nbsp;&nbsp;&nbsp;'))
+ . $variable['variableNaslov'] . '</option>';
+
+ }
+
+ echo '</select>';
+ if (count($this->variabla1) > 1) {
+ echo '<span class="pointer" id="means_remove" onclick="hierarhy_means_remove_variable(this);"><span class="faicon delete_circle icon-orange_link" title=""></span></span>';
+ } else {
+ #echo '<span class="space_means_new">&nbsp;</span>';
+ }
+
+ $_br = '<br/><span class="space_means_new">&nbsp;</span>';
+ echo '</span>';
+ }
+ $_br = null;
+ }
+
+ echo '</div>';
+
+ ### Prikaz elementov hierarhije in nivojev, ki so že zaklenjeni
+ echo '<div id="meansLeftDropdowns" class="hierarhija-filtri-levi" ' . ((!empty($this->struktura) || is_array($this->sessionData['means']['struktura']) || isset($this->sessionData['means']['strukturaUcitelj'])) ? ' style="display:none;"' : '') . '>';
+ echo $lang['srv_hierarchy_label_analyse'];
+ echo '<br />';
+
+ #### 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 '<div class="hierarhija-filter">';
+ echo '<label>';
+ echo $header['naslov'] . ': ';
+ echo '</label>';
+ echo '</div>';
+
+ // Prikaz chosen za vse šifrante, ki jih imamo
+ echo '<select name="' . $header['variable'] . '"
+ id="' . $header['variable'] . '"
+ class="filter-analize"
+ data-placeholder="' . $lang['srv_hierarchy_label_filter'] . '"
+ onchange="posodobil_filter_analiz()"
+ ' . ((false && $struktura_hierarhije != 'admin' && $match[1] == 1) ? null : "multiple") . '
+ >';
+
+ foreach ($header['options'] as $v_key => $value) {
+ $select = null;
+
+ // Označi chosen "select" za spremenljivke, ki smo jih izbrali iz filtrov
+ if (
+ !empty($this->sessionData['means']['filterHierarhija'][$header['variable']]) &&
+ sizeof($this->sessionData['means']['filterHierarhija'][$header['variable']]) > 0 &&
+ in_array($v_key, $this->sessionData['means']['filterHierarhija'][$header['variable']])
+ ) {
+ $select = 'selected="selected"';
+ }
+
+
+ // Če je izbrana struktura
+ if (!is_null($this->struktura) && sizeof($imena_sifrantov_ucitelja) > 0 && in_array($value, $imena_sifrantov_ucitelja)) {
+ $this->sessionData['means']['filterHierarhija'][$header['variable']][] = $v_key;
+ $select = 'selected="selected"';
+ }
+
+ #### V Kolikor ni admin, potem prikažemo samo te stvari, ki jih lahk on izbere
+ $st_nivoja = substr($header['variable'], 4);
+ $polje_uporabnikove_hierarhije = $struktura_hierarhije[$st_nivoja];
+
+ #### Če gre za administratorja, potem prikažemo vse šifrante
+ if ($struktura_hierarhije == 'admin') {
+ echo '<option value="' . $v_key . '" ' . $select . '>' . $value . '</option>';
+
+ #### Za 1. in 2. nivo ter zadnji nivo prikažemo samo šifrante na katerih je izbran sledeči uporabnik
+ } elseif (
+ $struktura_hierarhije != 'admin' &&
+ !empty($polje_uporabnikove_hierarhije) &&
+ in_array($v_key, $polje_uporabnikove_hierarhije) &&
+ ($st_nivoja < 3 || $max_st_nivojev == $st_nivoja)
+ ) {
+ ##### Če imam samo en podatek v polju potem tega že privzeto izberemo
+ if (sizeof($polje_uporabnikove_hierarhije) == 1) {
+
+ // V kolikor smo zbrisali zadnji nivo potem ga ponovno dodamo in shranimo sejo
+ if (!in_array($v_key, $this->sessionData['means']['filterHierarhija'][$header['variable']])) {
+ $this->sessionData['means']['filterHierarhija'][$header['variable']] = [$v_key];
+ SurveyUserSession::saveData($this->sessionData);
+ }
+
+ $select = 'selected="selected"';
+ }
+
+ if (empty($this->sessionData['means']['filterHierarhija'][$header['variable']]) || in_array($v_key, $this->sessionData['means']['filterHierarhija'][$header['variable']]))
+ echo '<option value="' . $v_key . '" ' . $select . '>' . $value . '</option>';
+
+ #### Vse umesne šifrante prikažemo vse
+ } elseif ($st_nivoja > 2 && $max_st_nivojev != $st_nivoja) {
+
+ if (in_array($v_key, $struktura_hierarhije[$match[1]]))
+ echo '<option value="' . $v_key . '" ' . $select . '>' . $value . '</option>';
+ }
+ }
+ echo '</select>';
+ echo '<br />';
+ }
+ }
+
+ echo '<script>';
+ echo '$(".filter-analize").chosen();';
+ echo '</script>';
+
+ echo '</div>';
+
+
+# echo '<div id="meansImgHolder">';
+# if ($this->isSelectedBothVariables()) {
+# echo '<img src="../images/rotate.png" alt="rotate" onclick="change_means(\'rotate\');return false;" />';
+# } else {
+# echo '<img src="../images/rotate_dis.png" alt="rotate" />';
+# }
+# echo '</div>';
+
+ echo '<div id="meansRightDropdowns" ' . (!empty($this->struktura) ? ' style="display:none;"' : '') . '>';
+ if ((int)$this->variabla1['0']['seq'] > 0) {
+ echo '<span class="pointer space_means_new" >&nbsp;</span>';
+ }
+ echo $lang['srv_means_label2'];
+ echo '<br />';
+
+
+ # za vsako novo spremenljivko 2 nardimo svoj select
+ if (count($this->variabla2) > 0) {
+ if ((int)$this->variabla1['0']['seq'] > 0) {
+ echo '<span class="pointer" id="means_add_new" onclick="hierarhy_means_add_new_variable(\'2\');"><span class="faicon add small icon-as_link" title="' . '"></span></span>';
+ }
+
+ foreach ($this->variabla2 AS $_key => $variabla2) {
+ echo $_br;
+ echo '<span id="v2_' . $_key . '">';
+ echo '<select name="means_variable_2" id="means_variable_2" onchange="change_hierarhy_means(); return false;" autocomplete="off">';
+
+ # ce prva variabla ni izbrana, dodamo tekst za izbiro prve variable
+ if ((int)$this->variabla1['0']['seq'] == 0) {
+ echo '<option value="0" selected="selected" >' . $lang['srv_means_najprej_prvo'] . '</option>';
+ } else {
+ # če druga variabla ni izbrana dodamo tekst za izbiro druge variable
+ if ($variabla2['seq'] == null || $variabla2['seq'] == 0) {
+ echo '<option value="0" selected="selected" >' . $lang['srv_means_izberi_drugo'] . '</option>';
+ }
+ }
+
+ foreach ($variables2 as $variable) {
+ echo '<option value="' . $variable['sequence'] . '" spr_id="' . $variable['spr_id'] . '" '
+ . (isset($variable['grd_id']) ? ' grd_id="' . $variable['grd_id'] . '" ' : '')
+ . (((int)$variable['canChoose'] == 1) ? '' : ' disabled="disabled" ')
+ . ($variabla2['seq'] > 0 && $variabla2['seq'] == $variable['sequence'] ? ' selected="selected" ' : '')
+ . '> '
+ . ((int)$variable['sub'] == 0 ? '' : ((int)$variable['sub'] == 1 ? '&nbsp;&nbsp;' : '&nbsp;&nbsp;&nbsp;&nbsp;'))
+ . $variable['variableNaslov'] . '</option>';
+
+ }
+ echo '</select>';
+ if (count($this->variabla2) > 1) {
+ echo '<span class="pointer" id="means_remove" onclick="hierarhy_means_remove_variable(this);"><span class="faicon delete_circle icon-orange_link" title=""></span></span>';
+ } else {
+ echo '<span class="space_means_new">&nbsp;</span>';
+ }
+
+ $_br = '<br/><span class="space_means_new">&nbsp;</span>';
+ echo '</span>';
+ }
+ }
+ echo '</div>';
+
+ echo '<span id="meansSubSetting" class="floatLeft spaceLeft">';
+ if (count($this->variabla2) > 1) {
+ ### Skrijemo možnost preklopa odgovorov v skupno tabelo
+ echo '<div style="display:none;">';
+ echo '<label><input id="chkMeansSeperate" type="checkbox" onchange="changeHierarhyMeansSubSetting();" ' . ($this->sessionData['means']['meansSeperateTables'] == true ? ' checked="checked"' : '') . '> ' . $lang['srv_means_setting_1'] . '</label>';
+ echo '</div>';
+ echo '<div class="vprasanja prikazi" onclick="tooglePrikazVprasanja(1)"><i class="fa fa-lg fa-plus-circle" aria-hidden="true"></i> ' . $lang['srv_hierarchy_analysis_show_questions'] . '</div>';
+ echo '<div class="vprasanja skrij" onclick="tooglePrikazVprasanja(0)" style="display: none;"><i class="fa fa-lg fa-minus-circle" aria-hidden="true"></i> ' . $lang['srv_hierarchy_analysis_hide_questions'] . '</div>';
+// echo '<br /><span id="spanMeansJoinPercentage"' . ($this->sessionData['means']['meansSeperateTables'] != true ? '' : ' class="displayNone"') . '><label><input id="chkMeansJoinPercentage" type="checkbox" onchange="changeHierarhyMeansSubSetting();" ' . ($this->sessionData['means']['meansJoinPercentage'] == true ? ' checked="checked"' : '') . '> ' . $lang['srv_means_setting_2'] . '</label></span>';
+ }
+ echo '<div class="prikazi-graf"><input id="showChart" type="checkbox" onchange="showTableChart(\'hierarhy_mean\');" ' . ($this->sessionData['mean_charts']['showChart'] == true ? ' checked="checked"' : '') . '> <label for="showChart">' . $lang['srv_show_charts'] . '</label></div>';
+ echo '</span>';
+ echo '</span>';
+
+ echo '<br class="clr"/>';
+
+
+ // 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 = '<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 '<div id="div_odprto_vprasanje">';
+
+ 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 '</div>';
+ }
+ }
+
+ /**
+ * 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 <?php
+ $file_handler = fopen($tmp_file, "w+");
+ fwrite($file_handler, "<?php\n");
+ fclose($file_handler);
+
+ $commandHierarhija = 'awk -F"|" \'BEGIN {{OFS=""} {ORS="\n"}} 1 ' . $ucitelj_filter . ' { print "$odprtiOdgovori[\x27",' . $variable . ',"\x27][]=\x27",' . $polje_v_datoteki . ',"\x27;"}\' ' . $this->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 '<table class="anl_tbl anl_bt anl_br tbl_clps">
+ <tbody>
+ <tr>
+ <td class="anl_bl anl_br anl_bb anl_ac anl_bck_freq_1 anl_w110">
+ <span class="spaceLeft anl_variabla">' . $vprasanje['variable'] . '</span>
+ </td>
+ <td class="anl_br anl_bb anl_al anl_bck_freq_1" colspan="3">
+ <span class="anl_variabla_label">' . $vprasanje['naslov'] . '</span>
+ </td>
+ </tr>
+ <tr>
+ <td class="anl_bl anl_br anl_bb anl_ac anl_bck anl_w110"></td>
+ <td class="anl_br anl_bb anl_ac anl_bck anl_variabla_line">Odgovori</td>
+ <td class="anl_br anl_bb anl_ac anl_bck anl_w70 anl_variabla_line">Frekvenca</td>
+ </tr>';
+ $st = 0;
+ foreach ($tabela as $keyOdgovor => $odgovori) {
+ if (!is_numeric($odgovori) && is_string($odgovori)) {
+ $st++;
+ echo '<tr id="' . $keyVprasanja . '_0_20_' . $keyOdgovor . '" name="valid_row_20">
+ <td class="anl_bl anl_ac anl_br gray">&nbsp;</td>
+ <td class="anl_br anl_bck_0_0">
+ <div class="anl_user_text_more">' . $odgovori . '</div>
+ </td>
+ <td class="anl_ac anl_br anl_bck_0_0">1</td>
+ </tr>';
+ }
+ }
+ echo '<tr id="anl_click_missing_tr_15" class="anl_bb">
+ <td class="anl_bl anl_br anl_al gray anl_ti_20 anl_bck_text_1">
+ </td>
+ <td class="anl_br anl_al anl_ita red anl_bck_text_1">Skupaj</td>
+ <td class="anl_ita red anl_br anl_ac anl_bck_text_1">' . $st . '</td>
+ </tr>';
+ echo '</tbody>
+ </table>';
+ }
+ }
+
+
+ /** 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 '<div id="sum_'.$spid.'" loop="'.self::$_CURRENT_LOOP['cnt'].'" class="div_sum_variable div_analiza_holder">';
+// self::displaySpremenljivkaIcons($spid);
+// }
+ # tekst vprašanja
+ echo '<table class="anl_tbl anl_bt anl_br tbl_clps">';
+
+ // naslovna vrstica tabele
+ echo '<tr>';
+ #variabla
+ echo '<td class="anl_bl anl_br anl_bb anl_ac anl_bck_freq_1 anl_w110">';
+ echo '<span class="spaceLeft anl_variabla">';
+ echo $spremenljivka['variable'];
+ echo '</span>';
+ echo '</td>';
+
+ #odgovori
+ echo '<td class="anl_br anl_bb anl_al anl_bck_freq_1" colspan="5"><span class="anl_variabla_label">';
+ echo $spremenljivka['naslov'] . '</span>';
+ echo '</td>';
+ echo '</tr>';
+
+ // Druga vrstica glave pri odprtih odgovorih
+ echo '<tr>';
+ #variabla
+ echo '<td class="anl_bl anl_br anl_bb anl_ac anl_bck anl_w110">';
+ // echo self::showIcons($spid,$spremenljivka,$_from);
+ echo '</td>';
+
+ #odgovori
+ echo '<td class="anl_br anl_bb anl_ac anl_bck anl_variabla_line">' . $lang['srv_analiza_frekvence_titleAnswers'] . '</td>';
+ // if (self::$_SHOW_LEGENDA && $inline_legenda){
+ // echo '<td class="anl_br anl_bb anl_ac anl_bck anl_w70 anl_legend anl_variabla_line">'.$lang['srv_analiza_opisne_variable_expression'].'</td>';
+ // echo '<td class="anl_br anl_bb anl_ac anl_bck anl_w70 anl_legend anl_variabla_line">'.$lang['srv_analiza_opisne_variable_skala'].'</td>';
+ // }
+ echo '<td class="anl_br anl_bb anl_ac anl_bck anl_w70 anl_variabla_line">' . $lang['srv_analiza_frekvence_titleFrekvenca'] . '</td>';
+ echo '<td class="anl_br anl_bb anl_ac anl_bck anl_w70 anl_variabla_line">' . $lang['srv_analiza_frekvence_titleOdstotek'] . '</td>';
+ if ($this->_HEADERS[$spid]['show_valid_percent'] == true) {
+ echo '<td class="anl_br anl_bb anl_ac anl_bck anl_w70 anl_variabla_line">' . $lang['srv_analiza_frekvence_titleVeljavni'] . '</td>';
+ }
+ echo '<td class="anl_br anl_bb anl_ac anl_bck anl_w70 anl_variabla_line">' . $lang['srv_analiza_frekvence_titleKumulativa'] . '</td>';
+ echo '</tr>';
+ // 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 '</table>';
+ # izpišemo še tekstovne odgovore za polja drugo
+ if (count($_answersOther) > 0 && self::$_FILTRED_OTHER) {
+ foreach ($_answersOther AS $oAnswers) {
+ echo '<div class="div_other_text">';
+ SurveyAnalysis::outputOtherAnswers($oAnswers);
+ echo '</div>';
+ }
+ }
+
+// if (self :: $show_spid_div == true) {
+// echo '</div>';
+// echo '<br/>';
+// }
+
+ }
+
+ 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 '<tr id="' . $spid . '_' . $_sequence . '_' . $counter . '" name="valid_row_' . $_sequence . '"' . (self::$enableInspect == true && (int)$vAnswer['cnt'] > 0 ? ' vkey="' . $vkey . '"' : '') . $cssHide . '>';
+ echo '<td class="anl_bl anl_ac anl_br gray">&nbsp;</td>';
+ echo '<td class="anl_br' . $cssBck . '">';
+ echo '<div class="anl_user_text_more">' . $vkey . '</div>';
+ 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 '<div id="valid_row_togle_more_'.$_sequence.'" class="floatRight blue pointer anl_more" onclick="showHidenTextTable(\''.$spid.'\', \''.$options['num_show_records'].'\', \''.self::$_CURRENT_LOOP['cnt'].'\');return false;">'.$lang['srv_anl_more'].'</div>';
+ # }
+ echo '</td>';
+ if (self::$_SHOW_LEGENDA && $options['isOtherAnswer'] == false && $options['inline_legenda'] == true) {
+ echo '<td class="anl_ac anl_br' . $cssBck . '">&nbsp;</td>';
+ echo '<td class="anl_ac anl_br' . $cssBck . '">&nbsp;</td>';
+ }
+
+ echo '<td class="anl_ac anl_br' . $cssBck . (self::$enableInspect == true && $options['isOtherAnswer'] == false && (int)$vAnswer['cnt'] > 0 ? ' fr_inspect' : '') . '">';
+ echo (int)$vAnswer['cnt'];
+ echo '</td>';
+ echo '<td class="anl_ar anl_br' . $cssBck . ' anl_pr10">';
+ echo self::formatNumber($_percent, SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_PERCENT'), '%');
+ echo '</td>';
+ if (self::$_HEADERS[$spid]['show_valid_percent']) {
+ echo '<td class="anl_ar anl_br' . $cssBck . ' anl_pr10">';
+ echo self::formatNumber($_valid, SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_PERCENT'), '%');
+ echo '</td>';
+ }
+ echo '<td class="anl_ar' . $cssBck . ' anl_pr10">';
+ echo self::formatNumber($_kumulativa, SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_PERCENT'), '%');
+
+ echo '</td>';
+ echo '</tr>';
+
+ # če mamo več
+ if ($counter + 1 == $options['num_show_records'] && $options['num_show_records'] < count(self::$_FREQUENCYS[$_sequence]['valid'])) {
+ if (self::$isArchive == false) {
+ echo '<tr id="' . $spid . '_' . $_sequence . '_' . $counter . '" name="valid_row_' . $_sequence . '" >';
+ echo '<td class="anl_bl anl_ac anl_br gray">&nbsp;</td>';
+ echo '<td class="anl_br' . $cssBck . '">';
+ // Pri javni povezavi drugace izpisemo
+ if (self::$printPreview == false) {
+ echo '<div id="valid_row_togle_more_' . $_sequence . '" class="floatLeft blue pointer anl_more" onclick="showHidenTextTable(\'' . $spid . '\', \'' . $options['num_show_records'] . '\', \'' . self::$_CURRENT_LOOP['cnt'] . '\');return false;">' . $lang['srv_anl_more'] . '</div>';
+ echo '<div id="valid_row_togle_more_' . $_sequence . '" class="floatRight blue pointer anl_more" onclick="showHidenTextTable(\'' . $spid . '\', \'' . $options['num_show_records'] . '\', \'' . self::$_CURRENT_LOOP['cnt'] . '\');return false;">' . $lang['srv_anl_more'] . '</div>';
+ } else {
+ echo '<div id="valid_row_togle_more_' . $_sequence . '" class="floatLeft anl_more">' . $lang['srv_anl_more'] . '</div>';
+ echo '<div id="valid_row_togle_more_' . $_sequence . '" class="floatRight anl_more">' . $lang['srv_anl_more'] . '</div>';
+ }
+ echo '</td>';
+ if (self::$_SHOW_LEGENDA && $options['isOtherAnswer'] == false && $options['inline_legenda'] == true) {
+ echo '<td class="anl_ac anl_br' . $cssBck . '">&nbsp;</td>';
+ echo '<td class="anl_ac anl_br' . $cssBck . '">&nbsp;</td>';
+ }
+ echo '<td class="anl_ac anl_br' . $cssBck . '">' . '</td>';
+ echo '<td class="anl_ar anl_br' . $cssBck . ' anl_pr10">' . '</td>';
+ if (self::$_HEADERS[$spid]['show_valid_percent']) {
+ echo '<td class="anl_ar anl_br' . $cssBck . ' anl_pr10">' . '</td>';
+ }
+ echo '<td class="anl_ar' . $cssBck . ' anl_pr10">' . '</td>';
+ echo '</tr>';
+ } else {
+ #v arhivie dodamo vse odgovore vendar so skriti
+ echo '<tr id="' . $spid . '_' . $_sequence . '_' . $counter . '" name="valid_row_' . $_sequence . '" >';
+ echo '<td class="anl_bl anl_ac anl_br gray">&nbsp;</td>';
+ echo '<td class="anl_br' . $cssBck . '">';
+ echo '<div id="valid_row_togle_more_' . $_sequence . '" class="floatLeft blue pointer" onclick="$(this).parent().parent().parent().find(\'tr.displayNone\').removeClass(\'displayNone\');$(this).parent().parent().addClass(\'displayNone\');return false;">' . $lang['srv_anl_all'] . '</div>';
+ echo '<div id="valid_row_togle_more_' . $_sequence . '" class="floatRight blue pointer" onclick="$(this).parent().parent().parent().find(\'tr.displayNone\').removeClass(\'displayNone\');$(this).parent().parent().addClass(\'displayNone\');return false;">' . $lang['srv_anl_all'] . '</div>';
+ echo '</td>';
+ if (self::$_SHOW_LEGENDA && $options['isOtherAnswer'] == false && $options['inline_legenda'] == true) {
+ echo '<td class="anl_ac anl_br' . $cssBck . '">&nbsp;</td>';
+ echo '<td class="anl_ac anl_br' . $cssBck . '">&nbsp;</td>';
+ }
+ echo '<td class="anl_ac anl_br' . $cssBck . '">' . '</td>';
+ echo '<td class="anl_ar anl_br' . $cssBck . ' anl_pr10">' . '</td>';
+ if (self::$_HEADERS[$spid]['show_valid_percent']) {
+ echo '<td class="anl_ar anl_br' . $cssBck . ' anl_pr10">' . '</td>';
+ }
+ echo '<td class="anl_ar' . $cssBck . ' anl_pr10">' . '</td>';
+ echo '</tr>';
+ }
+ }
+
+ $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 '<script>';
+ # nastavimopravilne linke
+ echo '$("#secondNavigation_links a#meansDoPdf").attr("href", "' . $href_pdf . '");';
+ echo '$("#secondNavigation_links a#meansDoRtf").attr("href", "' . $href_rtf . '");';
+// echo '$("#secondNavigation_links a#meansDoXls").attr("href", "' . $href_xls . '");';
+ # prikažemo linke
+ echo '$("#hover_export_icon").removeClass("hidden");';
+ echo '$("#secondNavigation_links a").removeClass("hidden");';
+ echo '</script>';
+ }
+ }
+
+ 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'] . ')&nbsp;' . 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'] . ')&nbsp;' . 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'] . ')&nbsp;' . 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'] . ')&nbsp;' . 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'] . ')&nbsp;' . 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'] . ')&nbsp;' . 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'] . ')&nbsp;' . 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 <?php
+ $file_handler = fopen($tmp_file, "w");
+ fwrite($file_handler, "<?php\n");
+ fclose($file_handler);
+
+ if (count($sekvences1) > 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, "<?php\n");
+
+ fclose($file_handler);
+
+ # preštejemo vse veljavne enote (nobena vrednost ne sme bit missing)
+ if (IS_WINDOWS) {
+ $command_all = 'awk -F"|" "BEGIN {{OFS=\"\"} {ORS=\"\n\"}} ' . $status_filter . $spr1_addFilter . $spr2_addFilter . ' { print \"$sumaSkupna++;\"}" ' . $this->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 '<table class="anl_tbl_crosstab fullWidth" style="margin-top:10px;">';
+ echo '<colgroup>';
+ echo '<col style="width:auto; min-width:30px;" />';
+ echo '<col style="width:auto; min-width:30px; " />';
+ for ($i = 0; $i < $cols; $i++) {
+ echo '<col style="width:auto; min-width:30px;" />';
+ if ($showSingleUnits == false) {
+ echo '<col style="width:auto; min-width:30px;" />';
+ }
+ }
+ if ($showSingleUnits == true) {
+ echo '<col style="width:auto; min-width:30px;" />';
+ }
+ echo '</colgroup>';
+
+ echo '<tr>';
+ #echo '<td>xx&nbsp;</td>';
+ # ime variable
+ # teksti labele:
+ $label2 = $this->getSpremenljivkaTitle($_means[0]['v2']);
+ if ($showSingleUnits == false) {
+ $span = ' colspan="5"';
+ }
+ echo '<td class="anl_bt anl_bl anl_ac rsdl_bck_title ctbCll" rowspan="2">';
+ echo $label2;
+ echo '</td>';
+
+ for ($i = 0; $i < $cols; $i++) {
+ echo '<td class="anl_bt anl_bl anl_br anl_ac rsdl_bck_title ctbCll"' . $span . '>';
+ $label1 = $this->getSpremenljivkaTitle($_means[$i]['v1']);
+ echo $label1;
+ echo '</td>';
+ }
+ if ($showSingleUnits == true) {
+ echo '<td class="anl_bl ">&nbsp;</td>';
+ }
+ echo '</tr>';
+ echo '<tr>';
+
+ for ($i = 0; $i < $cols; $i++) {
+ #Povprečje
+ echo '<td class="anl_bt anl_bl anl_br anl_ac rsdl_bck_variable1 ctbCll" >';
+ echo $lang['srv_means_label'];
+ echo '</td>';
+ #enote
+ if ($showSingleUnits == false) {
+ echo '<td class="anl_bl anl_bt anl_br anl_ac red anl_ita anl_bck_text_0 rsdl_bck_variable1 ctbCll">' . $lang['srv_hierarchy_label_st'] . '</td>';
+ }
+
+ #Min
+ echo '<td class="anl_bt anl_bl anl_br anl_ac rsdl_bck_variable1 ctbCll" >';
+ echo $lang['srv_hierarchy_label_min'];
+ echo '</td>';
+
+ #Max
+ echo '<td class="anl_bt anl_bl anl_br anl_ac rsdl_bck_variable1 ctbCll" >';
+ echo $lang['srv_hierarchy_label_max'];
+ echo '</td>';
+
+ #Standardna deviacija
+ echo '<td class="anl_bt anl_bl anl_br anl_ac rsdl_bck_variable1 ctbCll" >';
+ echo $lang['srv_hierarchy_label_std_dev'];
+ echo '</td>';
+ }
+ if ($showSingleUnits == true) {
+ echo '<td class="anl_bl anl_bt anl_br anl_ac red anl_ita anl_bck_text_0 rsdl_bck_variable1 ctbCll">' . $lang['srv_hierarchy_label_st'] . '</td>';
+ }
+
+ echo '</tr>';
+
+ if (count($_means[0]['options']) > 0) {
+
+ foreach ($_means[0]['options'] as $ckey2 => $crossVariabla2) {
+
+ $units_per_row = 0;
+ echo '<tr>';
+ echo '<td class="anl_bt anl_bl anl_ac rsdl_bck_variable1 ctbCll">';
+ echo $crossVariabla2['naslov'];
+ # če ni tekstovni odgovor dodamo key
+ if ($crossVariabla2['type'] !== 't') {
+ if ($show_variables_values == true) {
+ if ($crossVariabla2['vr_id'] == null) {
+ echo '&nbsp;( ' . $ckey2 . ' )';
+ } else {
+ echo '&nbsp;( ' . $crossVariabla2['vr_id'] . ' )';
+ }
+ }
+ }
+ echo '</td>';
+
+ # celice z vsebino
+ for ($i = 0; $i < $cols; $i++) {
+ echo '<td class="ct_in_cell anl_bt' . '" k1="' . $ckey1 . '" k2="' . $ckey2 . '" n1="' . $crossVariabla1['naslov'] . '" n2="' . $crossVariabla2['naslov'] . '" v1="' . $crossVariabla1['vr_id'] . '" v2="' . $crossVariabla2['vr_id'] . '">';
+ echo $this->formatNumber($_means[$i]['result'][$ckey2], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL'));
+ echo '</td>';
+ if ($showSingleUnits == false) {
+ echo '<td class="anl_ac anl_bl anl_bt anl_br rsdl_bck0 crostabSuma">';
+ echo (int)$_means[$i]['sumaVrstica'][$ckey2];
+ echo '</td>';
+ } else {
+ $units_per_row = max($units_per_row, (int)$_means[$i]['sumaVrstica'][$ckey2]);
+ }
+
+ #Min - rezultati
+ echo '<td class="anl_ac anl_bl anl_bt anl_br rsdl_bck0">';
+ echo $this->formatNumber($_means[$i]['min'][$ckey2], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL'));
+ echo '</td>';
+
+ #Max - rezultati
+ echo '<td class="anl_ac anl_bl anl_bt anl_br rsdl_bck0">';
+ echo $this->formatNumber($_means[$i]['max'][$ckey2], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL'));
+ echo '</td>';
+
+ #Standardna deviacija - rezultati
+ echo '<td class="anl_ac anl_bl anl_bt anl_br rsdl_bck0">';
+ echo $this->formatNumber($_means[$i]['stdDeviation'][$ckey2], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL'));
+ echo '</td>';
+
+ }
+ if ($showSingleUnits == true) {
+ echo '<td class="anl_ac anl_bl anl_bt anl_br rsdl_bck0 crostabSuma">';
+ echo $units_per_row;
+ echo '</tr>';
+ }
+ echo '</tr>';
+ $max_units += $units_per_row;
+ }
+ }
+ echo '<tr>';
+ echo '<td class="anl_bb anl_bt anl_bl anl_ac red anl_ita anl_bck_text_0 rsdl_bck_variable1 ctbCll">' . $lang['srv_means_label3'] . '</td>';
+
+ for ($i = 0; $i < $cols; $i++) {
+ echo '<td class="anl_ac anl_bt anl_bl anl_br anl_bb rsdl_bck0 crostabSuma">';
+ echo $this->formatNumber($_means[$i]['sumaMeans'], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL'));
+ echo '</td>';
+ if ($showSingleUnits == false) {
+ echo '<td class="anl_ac anl_bt anl_bl anl_br anl_bb rsdl_bck0 crostabSuma">';
+ echo (int)$_means[$i]['sumaSkupna'];
+ echo '</td>';
+ }
+
+ #Skupaj Min
+ echo '<td class="anl_ac anl_bt anl_bl anl_br anl_bb rsdl_bck0 crostabSuma">';
+ echo $this->formatNumber($_means[$i]['sumaMin'], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL'));
+ echo '</td>';
+
+ #Skupaj Max
+ echo '<td class="anl_ac anl_bt anl_bl anl_br anl_bb rsdl_bck0 crostabSuma">';
+ echo $this->formatNumber($_means[$i]['sumaMax'], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL'));
+ echo '</td>';
+
+ #Skupaj standardna deviacija
+ echo '<td class="anl_ac anl_bt anl_bl anl_br anl_bb rsdl_bck0 crostabSuma">';
+ echo $this->formatNumber($_means[$i]['sumaStdDeviation'], SurveyDataSettingProfiles:: getSetting('NUM_DIGIT_RESIDUAL'));
+ echo '</td>';
+
+ }
+ if ($showSingleUnits == true) {
+ echo '<td class="anl_ac anl_bt anl_bl anl_br anl_bb rsdl_bck0 crostabSuma">';
+ echo $max_units;
+ echo '</tr>';
+ }
+
+ echo '</tr>';
+ echo '</table>';
+ }
+
+ /** 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 '<br/>';
+ echo '<span class="space_means_new">&nbsp;</span>';
+ echo '<select name="means_variable_' . $which . '" id="means_variable_' . $which . '" onchange="change_hierarhy_means(); return false;" autocomplete="off"'
+ . '>';
+ # ce prva variabla ni izbrana, dodamo tekst za izbiro prve variable
+ if ($variabla1['seq'] == null || $variabla1['seq'] == 0) {
+ echo '<option value="0" selected="selected" >' . $lang['srv_analiza_crosstab_izberi_more'] . '</option>';
+ }
+
+ foreach ($variables as $variable) {
+ echo '<option value="' . $variable['sequence'] . '" spr_id="' . $variable['spr_id'] . '" '
+ . (isset($variable['grd_id']) ? ' grd_id="' . $variable['grd_id'] . '" ' : '')
+ . (((int)$variable['canChoose'] == 1) ? '' : ' disabled="disabled" ')
+ . '> '
+ . ((int)$variable['sub'] == 0 ? '' : ((int)$variable['sub'] == 1 ? '&nbsp;&nbsp;' : '&nbsp;&nbsp;&nbsp;&nbsp;'))
+ . $variable['variableNaslov'] . '</option>';
+
+ }
+ echo '</select>';
+ echo '<span class="pointer" id="means_remove" onclick="hierarhy_means_remove_variable(this);"><span class="faicon delete_circle icon-orange_link" title=""></span></span>';
+
+ } else {
+ # which = 2
+ echo '<br/>';
+ echo '<span class="space_means_new">&nbsp;</span>';
+ echo '<select name="means_variable_' . $which . '" id="means_variable_' . $which . '" onchange="change_hierarhy_means(); return false;" autocomplete="off"'
+ . '>';
+
+ # ce prva variabla ni izbrana, dodamo tekst za izbiro prve variable
+ if ((int)$this->variabla1['0']['seq'] > 0) {
+ echo '<option value="0" selected="selected" >' . $lang['srv_analiza_crosstab_najprej_prvo'] . '</option>';
+ } else {
+ # če druga variabla ni izbrana dodamo tekst za izbiro druge variable
+ echo '<option value="0" selected="selected">' . $lang['srv_analiza_crosstab_izberi_more'] . '</option>';
+ }
+
+ foreach ($variables as $variable) {
+ echo '<option value="' . $variable['sequence'] . '" spr_id="' . $variable['spr_id'] . '" '
+ . (isset($variable['grd_id']) ? ' grd_id="' . $variable['grd_id'] . '" ' : '')
+ . (((int)$variable['canChoose'] == 1) ? '' : ' disabled="disabled" ')
+ . '> '
+ . ((int)$variable['sub'] == 0 ? '' : ((int)$variable['sub'] == 1 ? '&nbsp;&nbsp;' : '&nbsp;&nbsp;&nbsp;&nbsp;'))
+ . $variable['variableNaslov'] . '</option>';
+
+ }
+ echo '</select>';
+ echo '<span class="pointer" id="means_remove" onclick="hierarhy_means_remove_variable(this);"><span class="faicon delete_circle icon-orange_link" title=""></span></span>';
+ }
+ }
+
+ 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 .= '<span class="anl_variabla">';
+ $labela .= '<a href="/" title="' . $lang['srv_predogled_spremenljivka'] . '" onclick="showspremenljivkaSingleVarPopup(\'' . $spremenljivka_id . '\'); return false;">';
+ $labela .= strip_tags($spremenljivka['naslov']);
+ if ($show_variables_values == true) {
+ $labela .= '&nbsp;(' . strip_tags($spremenljivka['variable']) . ')';
+ }
+ $labela .= '</a>';
+ $labela .= '</span>';
+
+ if ($spremenljivka['tip'] == '16') {
+ if (strip_tags($grid['naslov']) != $lang['srv_new_text']) {
+ $labela .= '<br/>' . strip_tags($grid['naslov']);
+ }
+ $labela .= '&nbsp;(' . strip_tags($grid['variable']) . ')';
+ } else {
+ if (strip_tags($variable['naslov']) != $lang['srv_new_text']) {
+ $labela .= '<br/>' . strip_tags($variable['naslov']);
+ }
+ if ($show_variables_values == true) {
+ $labela .= '&nbsp;(' . strip_tags($variable['variable']) . ')';
+ }
+ }
+
+ }
+ }
+ }
+ }
+ if ($labela == null) {
+ $labela = '<span class="anl_variabla">';
+ $labela .= '<a href="/" title="' . $lang['srv_predogled_spremenljivka'] . '" onclick="showspremenljivkaSingleVarPopup(\'' . $spremenljivka_id . '\'); return false;">';
+ $labela .= strip_tags($spremenljivka['naslov']);
+ if ($show_variables_values == true) {
+ $labela .= '&nbsp;(' . strip_tags($spremenljivka['variable']) . ')';
+ }
+ $labela .= '</a>';
+ $labela .= '</span>' . 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 @@
+<?php
+
+/** *
+ * Ime: Samoocena hierarhija
+ * Opis: Class skrbi za izdelavo hierarhije za administratorja/osebo s
+ * pravicami za gradnjo hierarhije na nivoju posamezne ankete Avtor: Robert
+ * Šmalc
+ */
+
+namespace Hierarhija;
+
+use Cache;
+use Common;
+use Export;
+use finfo;
+use Help;
+use Hierarhija\Model\HierarhijaOnlyQuery;
+use Hierarhija\Model\HierarhijaQuery;
+use MailAdapter;
+use SurveyInfo;
+use SurveySetting;
+use TrackingClass;
+use function is_null;
+
+
+class Hierarhija {
+
+ #v konstruktor poberemo vse globalne spremenljivke, ki jih omenjen razrred uporablja
+ protected $anketa;
+
+ /**
+ * Funkcija poišče ustrezne srv_vrednost-i za določeno spremenljivko, kjer
+ * moramo izbrati "variablo" te spremenljivke
+ *
+ * @param (string) $var
+ *
+ * @return (array) or null
+ */
+
+ protected $var;
+
+ public function __construct($anketa)
+ {
+ global $lang, $global_user_id, $site_url, $admin_type;
+
+ $this->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 '<div style="color: #ffa608; font-style: italic;">' . $this->lang['srv_hierarchy_element_missing'] . '</div>';
+ }
+
+ if ($aktivna && (is_null($this->hierarhija_type) || $this->hierarhija_type < 4)) {
+ echo '<div id="hierarhija-app">';
+
+ // meni na levi strani
+ echo '<div class="hierarhija-levi-meni">';
+ echo '<div>' . $this->lang['srv_hierarchy_save_list'] . '</div>';
+ echo '<div class="h-tabela">';
+ echo '<table><tbody>';
+ echo '<tr v-for="shranjena in shranjenaHierarhija">';
+ echo '<td class="h-ime-shranjeno"
+ v-show="!imeHierarhije.urejanje"
+ v-on:click="pregledShranjeneHierarhije($index, shranjena.id, shranjena.struktura)"';
+ // v-on:click="uporabiShranjenoHierarhijo($index, shranjena.id, shranjena.struktura)"
+ echo 'v-bind:class="[{ \'active\': $index == imeHierarhije.index }]"
+ >
+ <div class="h-ime-prikaz">
+ {{ shranjena.ime }}
+ <span class="stevilo-evalvirancev" title="Število uporabnikov, ki so že dodani k strukturi" v-if="shranjena.stUporabnikov > 0">({{ shranjena.stEvalvirancev }})</span>
+ </div>
+ <td>';
+ echo '<td class="h-brisi-shranjeno" v-show="imeHierarhije.urejanje" v-on:click="izbrisiShranjenoHierarhijo($index, shranjena.id)"><span class="faicon delete_circle icon-orange_link" title="' . $this->lang['srv_hierarchy_help_1'] . '"></span></td>';
+ echo '<td class="h-ime-shranjeno"
+ v-show="imeHierarhije.urejanje"
+ v-on:click="imeHierarhije.index = $index"
+ v-bind:class="[{ \'editable-hierarhija\': $index == imeHierarhije.index && imeHierarhije.urejanje}]"
+ v-bind="{ contenteditable: $index == imeHierarhije.index && imeHierarhije.urejanje }"
+ v-on:blur="preimenujHierarhijo($index, shranjena.id)">
+ <div class="h-ime-prikaz h-urejanje">
+ {{ shranjena.ime }}
+ <span class="stevilo-evalvirancev" title="Število uporabnikov, ki so že dodani k strukturi" v-if="shranjena.stUporabnikov > 0 && imeHierarhije.index != $index"">({{ shranjena.stEvalvirancev }})</span>
+ </div>
+ <td>';
+ echo '</tr>';
+ echo '</tbody></table>';
+ echo '</div>';
+ echo '<div>
+ <span style="float: left; padding: 6px 15px 5px 0;">Urejanje</span>
+ <div class="onoffswitch" style="float: left; margin: 6px;">
+ <input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" v-model="imeHierarhije.urejanje" id="urejanje-imen" v-on:click="posodobiOpcijeHierarhije()">
+ <label class="onoffswitch-label" for="urejanje-imen">
+ <span class="onoffswitch-inner"></span>
+ <span class="onoffswitch-switch"></span>
+ </label>
+ </div>
+ </div>';
+ echo '<div style="float: left;">
+ <span style="margin: 10px 15px 0 0;display: inline-block;float: left;">Uvoz/Izvoz</span>
+ <span class="faicon import hierarhija-ikona"
+ title="Uvoz hierarhije"
+ style="margin: 8px 15px 0 0"
+ @click="uvozHierarhije"
+ ></span>
+ <a href="index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=' . M_ADMIN_IZVOZ_SIFRANTOV . '">
+ <span class="faicon export hierarhija-ikona"
+ title="Izvoz hierarhije"
+ style="margin: 8px 10px 0 0"
+ ></span>
+ </a>
+ </div>';
+ echo '</div>';
+
+ // Uvodno besedilo, ko se aktivira modul hierarhija$anketa
+ echo '<div v-if="imeHierarhije.aktivna.length == 0 &&
+ imeHierarhije.shrani.length == 0 &&
+ previewHierarhije.ime.length == 0"
+ style="width: 650px;"
+ >';
+ echo '<h1>' . $this->lang['srv_hierarchy_wellcome_title'] . '</h1>';
+ echo $this->lang['srv_hierarchy_wellcome_text'] . '<br /><br />';
+ echo '<button class="btn btn-moder"
+ v-on:click="izbrisiCelotnoHierarhijo()"
+ style="float:right; margin: 20px 60px;"
+ >
+ Ustvari novo hierarhijo
+ </button>';
+ echo '</div>';
+
+
+ // Omogočimo predogled hierarhije
+ echo '<div class="hierarhija_fieldset" v-show="previewHierarhije.vklop && previewHierarhije.ime.length > 0" style="display:none;">';
+ echo '<h1>Predogled hierarhije: <span class="oranzna">{{ previewHierarhije.ime }}</span></h1>';
+
+ echo '<div v-if="shranjenaHierarhija[previewHierarhije.index] && shranjenaHierarhija[previewHierarhije.index].stUporabnikov > 0">Hierarhija ima {{ shranjenaHierarhija[previewHierarhije.index].stEvalvirancev }} evalvacij in {{ shranjenaHierarhija[previewHierarhije.index].stUporabnikov }} uporabnikov.</div>';
+
+ // Tabela nivojev in šifrantov
+ echo '<div id="primer-sifrantov" v-show="previewHierarhije.input.length > 0">';
+ echo '<table>';
+ echo '<thead style="text-align: left;">';
+ echo '<tr>';
+ echo '<th>' . $this->lang['srv_hierarchy_table_header_1'] . '</th>';
+ echo '<th>' . $this->lang['srv_hierarchy_table_header_2'] . '</th>';
+ echo '</tr>';
+ echo '</thead>';
+ echo '<tbody>';
+
+ // Vuejs dinamično kreiranje novih nivojev
+ echo '<tr id="nivo-{{ nivo.id }}" v-for="nivo in previewHierarhije.input" track-by="$index">';
+ echo '<td><label> {{ nivo.st}}. {{ nivo.ime }}</label></td>';
+ echo '<td><select name="nivo" data-opcije="{{ nivo.id }}">';
+ echo '<option value = "#" v-for="sifrant in nivo.sifranti">{{ sifrant.ime }}</option >';
+ echo '</select></td>';
+ echo '</tr>';
+
+ echo '</tbody></table></div>';
+ echo '<div v-else>Hierarhija je prazna in ima določen samo naslov.</div>';
+
+ // Gumbi
+ echo '<div style="padding:20px 10px; float: right;">';
+ echo '<button class="btn btn-moder" @click="izklopiPredogled()" style="margin: 0 10px;">' . $this->lang['back'] . '</button>';
+ echo '<button class="btn btn-moder"
+ @click="aktivirajIzbranoHierarhijo()"
+ v-if="previewHierarhije.input.length > 0"
+ >
+ Uporabi omenjeno hierarhijo
+ </button>';
+ echo '</div>';
+ echo '</div>';
+
+
+ // naslov hierarhije
+ echo '<div class="hierarhija_fieldset" v-if="(imeHierarhije.aktivna > 0 || imeHierarhije.shrani.length > 0) && !previewHierarhije.vklop">';
+ echo '<div class="left-float">';
+ echo '<h1>Hierarhija
+ <span class="oranzna">
+ <span v-if="imeHierarhije.shrani != imeHierarhije.aktivna">{{ (imeHierarhije.shrani.length > 30 ? (imeHierarhije.shrani.substring(0,30)+\' ...\') }}</span>
+ <span v-else>{{ (imeHierarhije.aktivna.length > 30 ? (imeHierarhije.aktivna.substring(0,30)+\' ...\') : imeHierarhije.aktivna) }}</span>
+ </span>
+ </h1>';
+ echo '</div>';
+ echo '<div class="left-float" style="padding: 20px 10px;">
+ <a href="#"
+ class="surveycomment"
+ v-on:click="dodajKomentar()"
+ title="Dodaj komentar k hierarhiji"
+ >
+ <span class="faicon inline_comment"></span> Dodaj komentar
+ </a>
+ </div>';
+ echo '<div class="left-float" style="padding: 20px 0px;">
+ <a href="#" class="logo-upload" v-on:click="logoUpload()" title="Naloži logotip za izpis pri poročilih">
+ <i class="fa fa-lg fa-file-image-o" aria-hidden="true"></i> Naloži logo
+ </a>
+ </div>';
+
+ // V kolikor imamo že strukturo prikažemo tudi številke
+ echo '<div style="clear:both;" v-if="shranjenaHierarhija[imeHierarhije.index] && shranjenaHierarhija[imeHierarhije.index].stUporabnikov > 0">Hierarhija ima {{ shranjenaHierarhija[imeHierarhije.index].stEvalvirancev }} evalvacij in {{ shranjenaHierarhija[imeHierarhije.index].stUporabnikov }} uporabnikov.</div>';
+
+ // Dodajanje nivojev in njihovih nazivov
+ echo '<div v-if="!vpisanaStruktura" style="clear: both;">';
+ echo '<h2 v-if="!vpisanaStruktura">' . $this->lang['srv_hierarchy_create_code'] . '</h2>';
+ echo '<div class="hierarhija-nov-nivo"
+ v-on:click="izbrisiCelotnoHierarhijo()"
+ v-if="!vpisanaStruktura"
+ style="float: right;display: block;margin:-30px -35px 0 0;">
+ Ustvari novo hierarhijo<span class="faicon edit small icon-as_link pointer h-edit-nivo hierarhija-inline"></span>
+ </div>';
+ echo '<div>';
+ echo '<table v-if="!vpisanaStruktura">';
+ echo '<thead style="text-align: left;">';
+ echo '<tr>';
+ echo '<th>' . $this->lang['srv_hierarchy_table_header_nivo_1'] . '</th>';
+ echo '<th style="padding-left: 15px;">' . $this->lang['srv_hierarchy_table_header_nivo_2'] . '</th>';
+ echo '</tr>';
+ echo '</thead>';
+ echo '<tbody>';
+
+ // Vuejs dinamično kreiranje novih nivojev
+ echo '<tr>';
+ echo '<td>';
+ echo '<span class="hierarhija-elementi">{{ novaHierarhijaSt }}.</span>';
+ echo '</td>';
+ echo '<td>';
+ echo '<input type="text" size="50" class="hierarhija-elementi" v-model="imeNivoja" v-on:keyup.enter="dodajNivoHierarhije()">';
+ echo '<div class="hierarhija-nov-nivo" v-on:click="dodajNivoHierarhije()">' . $this->lang['srv_hierarchy_input_name_nivo'] . '<span class="hierarhija-plus"></span></div>';
+ echo '</td>';
+ echo '</tr>';
+
+ echo '</tbody></table>';
+ echo '</div>';
+ echo '</div>';
+ echo '<div class="clear"></div>';
+
+
+ // Selectbox s šifranti za posamezen nivo, vpis šifrantov dovolimo šele ko imamo vpisano prvo raven
+ echo '<div v-show="inputNivo[0]">';
+ echo '<div class="h-sa-list">';
+ echo '<div style="margin-top: 16px;">';
+ echo '<h2 style="float: left; display: inline-block; margin-top: 0;">' . $this->lang['srv_hierarchy_code_lists'] . '</h2>';
+
+ echo '<div class="hierarhija-urejanje">
+ <div class="onoffswitch">
+ <input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" v-model="vklopiUrejanje" id="vklopi-urejanje-hierarhije" checked v-on:click="getSaveOptions(\'admin_skrij_urejanje_nivojev\', !vklopiUrejanje)">
+ <label class="onoffswitch-label" for="vklopi-urejanje-hierarhije">
+ <span class="onoffswitch-inner"></span>
+ <span class="onoffswitch-switch"></span>
+ </label>
+ </div>
+ </div>';
+ echo '<span class="toolbox_add_title"> ' . Help::display('srv_hierarchy_edit_elements') . '</span>';
+
+ echo '</div>';
+
+ echo '<div class="clear"></div>';
+
+ // izris primera šifrantov
+ echo '<div id="primer-sifrantov">';
+ echo '<table>';
+ echo '<thead style="text-align: left;">';
+ echo '<tr>';
+ echo '<th>' . $this->lang['srv_hierarchy_table_header_1'] . '</th>';
+ echo '<th>' . $this->lang['srv_hierarchy_table_header_2'] . '</th>';
+ echo '<th>' . $this->lang['srv_hierarchy_table_header_3'] . '</th>';
+ echo '<th v-show="vklopiUrejanje">' . $this->lang['srv_hierarchy_table_header_4'] . '</th>';
+ echo '</tr>';
+ echo '</thead>';
+ echo '<tbody>';
+
+ // Vuejs dinamično kreiranje novih nivojev
+ echo '<tr id="nivo-{{ nivo.id }}" v-for="nivo in inputNivo">';
+ echo '<td><label> {{ nivo.st}}. <span contenteditable="true" class="h-edit-nivo editable" data-labela="{{ nivo.id }}" v-on:blur="preimenujLabeloNivoja(nivo.id)">{{ nivo.ime }}</span></label></td>';
+ echo '<td><select name="nivo" data-opcije="{{ nivo.id }}">';
+ echo '<option value = "#" v-for="sifrant in nivo.sifranti">{{ sifrant.ime }}</option >';
+ echo '</select></td>';
+
+ echo '<td>';
+ echo '<span class="faicon delete_circle icon-orange_link spaceLeft hierarhija-inline" v-on:click="odstraniNivoHierarhije($index, nivo.id)" v-show="vklopiUrejanje && vpisanaStruktura == 0" title="' . $this->lang['srv_hierarchy_help_1'] . '"></span>';
+ echo '<span class="faicon edit small icon-as_link pointer h-edit-nivo hierarhija-inline" v-on:click="brisiSifrant(nivo.id)" v-show="vklopiUrejanje" title="' . $this->lang['srv_hierarchy_help_2'] . '"></span>';
+
+ ## Vstavimo checkboc od kje naprej se lahko šifranti ponavljajo
+ echo '<input type="checkbox" name="unikatni-sifranti" class="hierarhija-inline" style="cursor: pointer;" value="1" :checked="nivo.unikaten == 1" v-on:click="posodobiUnikatnega(nivo.id, nivo)" title="' . $this->lang['srv_hierarchy_help_3'] . '">';
+ echo '</td>';
+ echo '<td>';
+ echo '<input type="text" class="hierarhija-inline" size="40" data-nivo="{{ nivo.id }}" v-show="vklopiUrejanje" v-on:keyup.enter="dodajSifrant( $index, nivo.id )" placeholder="' . $this->lang['srv_hierarchy_input_name_sifrant'] . '"/>';
+ echo '<div class="hierarhija-nov-nivo" v-show="vklopiUrejanje" v-on:click="dodajSifrant( $index, nivo.id )">' . $this->lang['srv_hierarchy_input_name_sifrant'] . '<span class="hierarhija-plus"></span></div>';
+ echo '</td>';
+ echo '</tr>';
+
+ echo '</tbody></table>';
+ echo '</div>';
+
+ // Naprej na naslednji korak
+ echo '<div>';
+ // Shranjevanje hierarhije
+ echo '<div style="padding: 20px 0 10px;" v-show="prikaziImeZaShranjevanje">';
+ echo '<b>Shrani trenutno hierarhijo pod imenom: </b>';
+ echo '<input size="50" type="text" v-model="imeHierarhije.shrani">';
+ echo '</div>';
+
+ echo '<div style="float: right; width: 100%; text-align: right; padding: 7px 0;">
+ <input type="checkbox" v-model="prikaziImeZaShranjevanje" value="1"> Hierarhijo želim shraniti pod novim imenom.
+ </div>';
+
+ echo '<div style="padding:20px;float:right;">';
+ echo '<button v-on:click="shraniTrenutnoHierarhijo()" v-show="prikaziImeZaShranjevanje" class="btn btn-moder" style="margin-right: 15px;">' . $this->lang['save'] . '</button>';
+ echo '<button v-on:click="premikNaprej(\'' . M_UREDI_UPORABNIKE . '\')" class="btn btn-moder" style="margin-right: 15px;">' . $this->lang['next1'] . '</button>';
+ echo '</div>';
+ echo '</div>';
+
+ echo '</div>';
+
+
+ echo '</fieldset>';
+ echo '</div>';
+ echo '</div>';
+
+ // popup za urejanje vrednosti
+ echo '<div id="vrednost_edit" class="divPopUp">';
+ echo '</div>';
+
+ // fade pri fullscreen urejanje spremenljivke
+ echo '<div id="fade">';
+ echo '</div>';
+
+ } else {
+ echo '<div id="hierarhija-app">';
+ // Naslov
+ echo '<div class="hierarhija_fieldset">';
+ echo '<div class="left-float"><h1 v-show="imeHierarhije.aktivna">Hierarhija: <span style="color: #fa4913">{{ imeHierarhije.aktivna }}</span></h1></div>';
+ echo '<div class="left-float" style="padding: 20px;"><a href="#" class="surveycomment" title="Dodaj komentar o vprašanju"> <span class="faicon inline_comment"></span> Dodaj komentar</a></div>';
+ echo '<div class="left-float" style="padding: 20px 0px;">
+ <a href="#" class="logo-upload" v-on:click="logoUpload()" title="Naloži logotip za izpis pri poročilih">
+ <i class="fa fa-lg fa-file-image-o" aria-hidden="true"></i> Naloži logo
+ </a>
+ </div>';
+ echo '</div>';
+
+ echo '<div class="clear"></div>';
+
+ // 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 '<div class="okvircek" style="padding-bottom: 3px;">';
+ echo '<h3>Čas aktivacije: <b>' . $cas_aktivacije . '</b></h3>';
+ echo '<h3>Hierarhijo je aktiviral uporabnik: <b>' . $uporabnik->name . ' ' . $uporabnik->surname . '</b> (' . $uporabnik->email . ') <a class="btn" href="index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=aktivacija-strukture-ankete">Podrobnosti</a></h3>';
+ echo '</div>';
+
+ echo '<div class="clear"></div>';
+
+ // Tabela nivojev in šifrantov
+ echo '<div id="primer-sifrantov" class="pregled">';
+ echo '<table>';
+ echo '<thead style="text-align: left;">';
+ echo '<tr>';
+ echo '<th>' . $this->lang['srv_hierarchy_table_header_1'] . '</th>';
+ echo '<th>' . $this->lang['srv_hierarchy_table_header_2'] . '</th>';
+ echo '</tr>';
+ echo '</thead>';
+ echo '<tbody>';
+
+ // Vuejs dinamično kreiranje novih nivojev
+ echo '<tr id="nivo-{{ nivo.id }}" v-for="nivo in inputNivo">';
+ echo '<td><label> {{ nivo.st}}. {{ nivo.ime }}</label></td>';
+ echo '<td><select name="nivo" data-opcije="{{ nivo.id }}">';
+ echo '<option value = "#" v-for="sifrant in nivo.sifranti">{{ sifrant.ime }}</option >';
+ echo '</select></td>';
+ echo '</tr>';
+
+ echo '</tbody></table>';
+ echo '</div>';
+
+ echo '<div style="width:35%;text-align: right;">';
+ echo '<a class="btn btn-moder" href="index.php?anketa=' . $this->anketa . '&a=hierarhija_superadmin&m=' . M_ADMIN_IZVOZ_SIFRANTOV . '">Izvoz šifrantov</a>';
+ echo '</div>';
+
+ echo '</div>';
+ }
+ }
+
+ /**
+ * 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 = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <style>
+ body {
+ width: 100% !important;
+ min-width: 100%;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ margin: 0;
+ Margin: 0;
+ padding: 0;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ }
+
+ table {
+ border-spacing: 0;
+ border-collapse: collapse;
+ }
+
+ td {
+ word-wrap: break-word;
+ -webkit-hyphens: auto;
+ -moz-hyphens: auto;
+ hyphens: auto;
+ border-collapse: collapse !important;
+ }
+
+
+ tr, td, th {
+ text-align: left;
+ padding: 8px 10px;
+ border-color: #dddddd;
+ border-width: 1px;
+ border-style: solid;
+ }
+
+
+ th {
+ background-color: #EFF2F7;
+ }
+
+ .center{
+ text-align: center !important;
+ }
+ </style>
+ </head><body>';
+
+ $email .= $lang['srv_hierarchy_teacher_email_1'];
+ $email .= '<p>' . $lang['srv_hierarchy_teacher_email_2'] . '»<b>' . SurveyInfo::getSurveyTitle() . '</b>«' . $lang['srv_hierarchy_teacher_email_3'] . '<a href="' . $site_url . 'sa" target="_blank">' . $site_url . 'sa</a></p>';
+
+ $email .= '<br /><table cellspacing="0" style="border-collapse: collapse;">';
+ $email .= '<thead>';
+ $email .= '<tr>
+ <th border="1" cellpadding="0">Hierarhija</th>';
+
+ if (SurveyInfo::getSurveyModules('hierarhija') == 2 || in_array($koda_za_resevanje_ankete, ['vsem', 'ucitelju'])) {
+ $email .= '<th border="1" cellspacing="0" class="center">Koda za učitelja</th>';
+ }
+
+ // V kolikor nimamo nikakršne izbere potem posredujemo kodo tudi za učence
+ if (in_array($koda_za_resevanje_ankete, ['vsem', 'ucencem'])) {
+ $email .= '<th border="1" cellspacing="0" class="center">Koda za učence</th>';
+ }
+
+ $email .= '<tr>';
+ $email .= '</thead>';
+ $email .= '<tbody>';
+
+ // generiranje kode
+ while ($koda = mysqli_fetch_object($kode)) {
+ $email .= '<tr>';
+ $email .= '<td border="1" cellspacing="0">' . HierarhijaHelper::hierarhijaPrikazNaslovovpriUrlju($anketa, $koda->hierarhija_struktura_id, TRUE) . '</td>';
+
+ if (SurveyInfo::getSurveyModules('hierarhija') == 2 || in_array($koda_za_resevanje_ankete, ['vsem', 'ucitelju'])) {
+ $email .= '<td border="1" cellspacing="0" class="center"><span style="letter-spacing: 1px; font-size:16px; font-weight: bold;">' . strtoupper($koda->koda) . '</span></td>';
+ }
+
+ // 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 .= '<td border="1" cellspacing="0" class="center"><span style="letter-spacing: 1px; font-size:16px; font-weight: bold; color:#ffa608;">' . strtoupper($koda_ucenci->koda) . '</span></td>';
+ }
+
+ $email .= '</tr>';
+ }
+
+ $email .= '</tbody>';
+ $email .= '</table>';
+
+ $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 .= '<p>' . $lang['srv_hierarchy_teacher_email_4'] . '<a href="' . $site_url . '" target="_blank">' . $site_url . '</a>' . $lang['srv_hierarchy_teacher_email_5'];
+ $email .= '»' . $user->email . '«' . $lang['srv_hierarchy_teacher_email_6'] . '</p>';
+ }
+
+ // Podpis
+ $signature = Common::getEmailSignature();
+ $email .= $signature;
+
+ // Zaključek emaila
+ $email .= '</body></html>';
+
+
+ // 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 .= '<div class="hierarhija-naslov-uvod">';
+ $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 .= '<b>';
+ foreach ($sifrant as $key => $sifra) {
+ $izpis .= ($key > 1 ? ' - ' : NULL) . $sifra;
+ }
+ $izpis .= '</b>';
+
+ if (!$only_hierarhija) {
+ $izpis .= '</div>';
+ }
+
+ 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 '<div class="okvircek">';
+ echo '<h2>' . $this->lang['srv_hierarchy_activation_link'];
+ echo ' <a href="#" class="surveycomment" title="Dodaj komentar k hierarhiji" style="float:right; margin-top: -5px; margin-left: 10px;">
+ <span class="faicon inline_comment"></span>
+ </a>';
+ echo '<span onclick="previewMail(\'1\')"><i class="fa fa-envelope-o block right link" aria-hidden="true"></i></span></h2>';
+ echo $this->lang['srv_hierarhy_activation_text'];
+
+ if ($st_uporabnikov_upravicenih_do_evalvacije) {
+ echo '<div style="padding: 15px 0 20px;">';
+ echo '<b>Ob aktiviciji ankete bodo upoštevane naslednje nastavitve:</b><br />';
+ echo '<table>';
+ echo '<tbody>';
+ $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 '<tr>';
+ echo '<td style="width: 180px;">' . $this->lang[$prevod] . '</td>';
+ echo '<td><input type="radio" name="' . $nastavitev . '" id="' . $nastavitev . '-0" value="0" onclick="posodobiPosiljanjeKod(\'' . $nastavitev . '\', 0);" ' . (is_null(HierarhijaQuery::getOptions($this->anketa, $nastavitev)) ? 'checked="checked"' : NULL) . '>
+ <label for="' . $nastavitev . '-0">' . $this->lang['srv_hierarchy_yes'] . '</label>';
+ echo '<input type="radio" name="' . $nastavitev . '" id="' . $nastavitev . '-1" value="1" onclick="posodobiPosiljanjeKod(\'' . $nastavitev . '\', 1);" ' . (HierarhijaQuery::getOptions($this->anketa, $nastavitev) == 1 ? 'checked="checked"' : NULL) . '>
+ <label for="' . $nastavitev . '-1">' . $this->lang['srv_hierarchy_no'] . '</label></td>';
+ echo '</tr>';
+ }
+ echo '</tbody>';
+ echo '</table>';
+
+ echo '<br />';
+ echo $this->lang['srv_hierarchy_code_text_bottom'];
+ echo '</div>';
+ echo '<button type="button" class="btn btn-moder" onclick="anketa_active(\'' . $this->anketa . '\',\'0\', \'\', \'1\'); return false;">Aktiviraj hierarhijo in anketo</button>';
+ } else {
+ echo '<div class="error-email"><span class="faicon warning icon-orange"></span> V bazi ni dodanega nobenega učitelja, zato aktivacija ni mogoča!</div>';
+ }
+
+ echo '</div>';
+
+ // izklop ankete
+ echo '<div class="okvircek" style="margin-top: 30px;">';
+ echo '<h2>' . $this->lang['srv_hierarchy_turnoff'] . '</h2>';
+ echo $this->lang['srv_hierarhy_turnoff_text'];
+ echo '<div>';
+ echo '<a id="h-navbar-link"
+ class="no-img side-right btn btn-moder
+ ref="#"
+ title="' . $this->lang['srv_hierarchy_turnoff'] . '"
+ onclick="toggleAdvancedModule(\'hierarhija\', 1);">';
+ echo $this->lang['srv_hierarchy_turnoff'] . '</a>';
+ echo '</div>';
+ echo '</div>';
+
+ } else {
+ // Aktivirana anketa in hierarhija
+ echo '<div class="okvircek">';
+ echo '<h2>' . $this->lang['srv_hierarchy_active_hierarchy_and_survey'] . '</h2>';
+ echo $this->lang['srv_hierarchy_active_hierarchy_and_survey_text'];
+
+ $row = SurveyInfo::getInstance()->getSurveyRow();
+ echo '<button type="button" class="btn btn-moder" onclick="anketa_active(\'' . $this->anketa . '\',\'' . $row['active'] . '\'); return false;">' . ($row['active'] ? $this->lang['srv_hierarchy_deactivate_survey'] : $this->lang['srv_hierarchy_activate_survey']) . '</button>';
+ echo '</div>';
+
+ // 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 '<div class="okvircek" style="margin-top: 30px;">';
+ echo '<h2>' . $this->lang['srv_hierarchy_active_information_user'] . ' <span onclick="previewMail(\'1\')"><i class="fa fa-envelope-o block right link" aria-hidden="true"></i></span></h2>';
+ echo '<h3>Čas aktivacije: <b>' . $cas_aktivacije . '</b></h3>';
+ echo '<h3>Aktivnost evalvacije: <b> od ' . date('d.m.Y', strtotime($row['starts'])) . ' do ' . date('d.m.Y', strtotime($row['expire'])) . '</b><a href="index.php?anketa=' . $row['id'] . '&a=trajanje"><span class="faicon edit"></span></a></h3>';
+ echo '<h3>Hierarhijo je aktiviral uporabnik: <b>' . $uporabnik->name . ' ' . $uporabnik->surname . '</b> (' . $uporabnik->email . ')</h3>';
+
+ if (HierarhijaQuery::getOptions($this->anketa, 'onemogoci_dostop_uciteljem') == 1) {
+ echo '<h3>' . $this->lang['srv_hierarchy_teacher_can_not_access'] . '</h3>';
+ }
+
+ echo '<h3>' . HierarhijaHelper::textGledeNaOpcije($this->anketa, 'srv_hierarchy_email_code') . '</h3>';
+
+ $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 '<ul style="list-style: initial;max-height: 500px; overflow: auto;">';
+ while ($uporabnik = $users_upravicen_do_evalvacije->fetch_object()) {
+ echo '<li>' . $uporabnik->email . '</li>';
+ }
+ echo '</ul>';
+
+ // 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 '<div id="obvesti-samo-ucitelje" style="padding-top: 15px;"><button class="btn btn-moder" onclick="obvestiUciteljeZaResevanjeAnkete()">Pošlji obvestilo učiteljem s kodo za reševanje</button></div>';
+ }
+
+ echo '</div>';
+
+ // 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 '<div class="okvircek" style="margin-top: 30px;" id="vue-custom">';
+ echo '<h2>' . $this->lang['srv_hierarchy_active_information_about_manager'] . ' <span onclick="previewMail(\'2\')"><i class="fa fa-envelope-o block right link" aria-hidden="true"></i></span></h2>';
+ echo '<p>' . $this->lang['srv_hierarchy_active_information_about_manager_text'] . '</p>';
+
+ echo '<form action="#" method="post">';
+ echo '<div v-if="managerOznaciVse" v-on:click="managerZamenjajOznaci" class="link oznaci"><i class="fa fa-check-square-o" aria-hidden="true"></i> - označi vse</div>';
+ echo '<div v-else v-on:click="managerZamenjajOznaci" class="link oznaci"><i class="fa fa-square-o" aria-hidden="true"></i> - označi nobenega</div>';
+
+ echo '<ul style="padding: 4px;">';
+ while ($manager = $managerji_ankete->fetch_object()) {
+ echo '<li style="padding: 2px 0;"><input type="checkbox" v-model="!managerOznaciVse" name="manager" value="' . $manager->user_id . '" id="manager-' . $manager->id . $manager->user_id . '"/><label for="manager-' . $manager->id . $manager->user_id . '">' . $manager->level . '.nivo: ' . $manager->email . '</label></li>';
+ }
+ echo '</ul>';
+
+ echo '<button type="submit" class="btn btn-moder" v-on:click="emailObvestiloZaManagerje()"; return false;">' . $this->lang['srv_hierarchy_submit'] . '</button>';
+ echo '</form>';
+ echo '</div>';
+ }
+ }
+
+ }
+
+ /**
+ * Uporabniko prikažemo opcijo za kopiranje ankete s šifranti in strukturo
+ */
+ public function kopiranjeHierarhijeInAnkete()
+ {
+
+ echo '<div class="okvircek">';
+ echo '<h2>' . $this->lang['srv_hierarchy_copy_link'] . '</h2>';
+ echo $this->lang['srv_hierarhy_copy_text'];
+ echo '<button type="button" class="btn btn-moder" onclick="anketa_copy_top(\'' . $this->anketa . '\', \'1\'); return false;">Kopiraj anketo skupaj s strukturo uporabnikov</button>';
+ echo '<br /><br />';
+ echo $this->lang['srv_hierarhy_copy_text_2'];
+ echo '<button type="button" class="btn btn-moder" onclick="anketa_copy_top(\'' . $this->anketa . '\'); return false;">Kopiraj anketo</button>';
+ echo '</div>';
+
+ }
+
+ /**
+ * 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 '<h2>Izgradnja hierarhije <span class="oranzna">' . (!empty($aktivna_hierarhija_ime) ? $aktivna_hierarhija_ime : '') . '</span> za anketo: ' . $row['naslov'] . '</h2>';
+ echo '<span>Ob aktiviranju bodo uporabniki na najnižjem nivoju prejeli kodo/šifro</span>';
+
+ //vnosni obrazec za izgradnjo hierarhije
+ echo '<div class="izgradnja_hierarhije">';
+
+ //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 '</div>';
+
+ //prikaži JS Tree s trenutno hierarhijo
+ $this->jsTreePrikazHierarhije();
+ } elseif (!empty($max_st_nivojev) && SurveyInfo::getSurveyModules('hierarhija') == 2) {
+ echo '<h3>' . $this->lang['srv_hierarchy_active_text'] . '</h3>';
+ $this->jsTreePrikazHierarhije();
+ } else {
+ echo '<h3>' . $this->lang['srv_hierarchy_nothing'] . '</h3>';
+ }
+ }
+
+ /**
+ * 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 '<div id="hierarhija-jstree-ime">';
+ if (!is_null($hierarhija->ravni_ime)) {
+ echo '<h2>Hierarhija</h2>';
+ echo '<b>' . $hierarhija->ravni_ime;
+ if ($this->hierarhija_type > 4) {
+ echo ' - ' . $hierarhija->sifrant_ime;
+ }
+ echo ': </b>';
+ }
+ echo '</div>';
+
+ // LOAD jsTree na ta element
+ echo '<div id="admin_hierarhija_jstree"></div>';
+
+ echo '<script type="text/javascript" src="modules/mod_hierarhija/js/vendor/jstree.min.js"></script>';
+ echo '<script>jstree_json_data(' . $this->anketa . ');</script>';
+ }
+
+ /**
+ * 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 '<h2>Izgradnja hierarhije <span class="oranzna">' . (!empty($aktivna_hierarhija_ime) ? $aktivna_hierarhija_ime : '') . '</span> za anketo: ' . $row['naslov'] . '</h2>';
+ echo '<div class="help-text">';
+ echo '<div class="srv_hierarchy_user_help">';
+ echo $this->lang['srv_hierarchy_user_help_top_1'];
+ echo ' Vse uporabnike lahko uvozite tukaj <i class="fa fa-lg modra click fa-user-plus" onclick="uvoziUporabnike()" aria-hidden="true"></i>';
+ echo '<br/><br/>' . $this->lang['srv_hierarchy_user_help_top_2'];
+ echo '</div>';
+ echo '<div class="srv_hierarchy_user_help_sifrant_vnesen" style="display: none;">' . $this->lang['srv_hierarchy_user_help_sifrant_vnesen_1'] . ' Vse uporabnike lahko uvozite tukaj <i class="fa fa-lg modra click fa-user-plus" onclick="uvoziUporabnike()" aria-hidden="true"></i><br /><br />' . $this->lang['srv_hierarchy_user_help_sifrant_vnesen_2'] . '</div>';
+ echo '</div>';
+
+ //vnosni obrazec za izgradnjo hierarhije
+ echo '<div class="izgradnja_hierarhije">';
+
+ $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 '</div>';
+ }
+
+ //prikaži JS Tree s trenutno hierarhijo
+ $this->jsTreePrikazHierarhije();
+ } elseif (!empty($max_st_nivojev) && $hierarchy_status == 2) {
+ echo '<h3>' . $this->lang['srv_hierarchy_active_text'] . '</h3>';
+
+ if ($this->hierarhija_type < 5) {
+ $results = (new HierarhijaQuery())->getSifrantAdmin($this->anketa);
+
+ // Prikažemo samo datatables
+ echo '<div id="vue-gradnja-hierarhije">';
+ echo '<div style="padding-top:26px;clear: both;display: block;">';
+ echo '<h2>Prikaz zgrajene hierarhije:</h2>';
+ echo '<div id="secondNavigation_links">
+ <a href="#" class="srv_ico" id="hover_export_icon" title="Izvoz v"><span class="faicon export" deluminate_imagetype="png"></span> Izvozi strukturo uporabnikov</a>
+ <div id="hover_export" style="display: none;">
+ <a href="index.php?anketa=' . $this->anketa . '&a=' . ($this->hierarhija_type < 5 ? A_HIERARHIJA_SUPERADMIN : A_HIERARHIJA) . '&m=uredi-uporabnike&izvoz=1" class="srv_ico" title="CSV izvoz uporabnikov za analizo">
+ Iz tabele
+ </a>
+ <a href="index.php?anketa=' . $this->anketa . '&a=' . ($this->hierarhija_type < 5 ? A_HIERARHIJA_SUPERADMIN : A_HIERARHIJA) . '&m=uredi-uporabnike&izvoz=struktura-analiz&n=1" class="srv_ico" title="Izvozi v excel">
+ Za združevanje s podatki ankete
+ </a>
+ <a href="index.php?anketa=' . $this->anketa . '&a=' . ($this->hierarhija_type < 5 ? A_HIERARHIJA_SUPERADMIN : A_HIERARHIJA) . '&m=uredi-uporabnike&izvoz=struktura-analiz" class="srv_ico" title="Izvozi v excel">
+ Za združevanje z imenskimi vnosi šifrantov
+ </a>
+ </div>
+ </div>';
+
+// echo '<div class="uporabniki-ikona-tabela"
+// title="CSV izvoz uporabnikov"
+// >
+// <a href="index.php?anketa=' . $this->anketa . '&a=' . ($this->hierarhija_type < 5 ? A_HIERARHIJA_SUPERADMIN : A_HIERARHIJA) . '&m=uredi-uporabnike&izvoz=1" class="btn btn-moder">Izvoz uporabnikov</a>
+// </div>';
+// echo '<div class="uporabniki-ikona-tabela"
+// title="CSV izvoz uporabnikov za analizo"
+// style="padding-right: 20px;"
+// >
+// <a href="index.php?anketa=' . $this->anketa . '&a=' . ($this->hierarhija_type < 5 ? A_HIERARHIJA_SUPERADMIN : A_HIERARHIJA) . '&m=uredi-uporabnike&izvoz=struktura-analiz" class="btn btn-moder">Struktura uporabnikov za analizo</a>
+// </div>';
+ echo '<table id="vpis-sifrantov-admin-tabela" class="tabela-obroba custom-datatables">';
+ echo '<thead>';
+ echo ' <tr>';
+ foreach ($results['nivoji'] as $key => $nivo) {
+ echo '<th style="text-align: left;">' . $nivo['level'] . '.nivo: ' . $nivo['ime'] . '</th>';
+ }
+ echo '</tr>';
+ echo '</thead>';
+ echo '<tbody>';
+ echo '<tbody>';
+ echo '</table>';
+ echo '</div>';
+ echo '</div>';
+ }
+
+ $this->jsTreePrikazHierarhije();
+ } else {
+ echo '<h3>' . $this->lang['srv_hierarchy_nothing'] . '</h3>';
+ }
+ }
+
+ /**
+ * Izris forme za gradnjo hierarhije uporabnik na določenem nivoju
+ *
+ * @param array $results
+ *
+ * @return echo html
+ */
+ private function vpisHierarhijeUporabnikTabela($results)
+ {
+ echo '<div id="vue-gradnja-hierarhije">';
+
+ // Kadar nimamo vpisanih šifrantov
+ echo '<div v-if="podatki[0].sifranti[0].sifrant == null" style="padding:10px 0">';
+ echo $this->lang['srv_hierarchy_empty_drop_downs'];
+ echo '</div>';
+
+ echo '<div class="vpis-sifrantov" v-else>';
+ echo '<table class="tabela-obroba tabela-vpis-sifrantov">';
+
+ echo '<thead>';
+ echo '<tr>';
+ foreach ($results['nivoji'] as $key => $nivo) {
+ $array_key = array_keys($results['nivoji']);
+ if ($key == end($array_key)) {
+ echo '<th style="border-right: none;">' . $nivo['level'] . '. nivo - ' . $nivo['ime'] . '</th>';
+ } else {
+ echo '<th>' . $nivo['level'] . '. nivo - ' . $nivo['ime'] . '</th>';
+ }
+ }
+ echo '<th style="border-left: none;">Evalviranec</th>';
+ echo '</tr>';
+ echo '</thead>';
+
+ echo '<tbody>';
+ echo '<tr>';
+
+ // Če je uporabnik izbran na določen nivo, potem pred tem naredimo fiksna polja z input disabled
+ echo '<td style="width: auto;vertical-align: top;" v-for="struktura in user.struktura">';
+ echo '<div style="font-weight: bold;margin: 5px 0;text-align: center;">{{ struktura.ime }}</div>';
+ echo '</td>';
+
+ echo '<td v-for="nivo in podatki" v-if="nivo.level > user.uporabnik.level" style="width: auto;vertical-align: top;">';
+ // 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 '<div v-show="pageLoadComplete && (izbran.strukturaId[nivo.level -1] > 0 || izbran.sifrant[nivo.level-1] > 0)">';
+ echo '<div class="h-select2">
+ <select class="select2" v-select="izbran.sifrant[nivo.level]" data-level="{{ nivo.level }}">
+ <option value="0"> --- </option>
+ <option v-for="s in nivo.sifranti" :value="s.id" >{{ s.sifrant }}</option>
+ </select>
+ </div>';
+ echo '<div class="h-uporabnik" v-show="izbran.sifrant[nivo.level] > 0" v-on:click="prikaziVnosOseb(nivo.level)">
+ <span v-if="nivo.level == podatki.maxLevel" class="icon user-red"></span>
+ <span v-else class="faicon users icon-as_link"></span>
+ </div>';
+ echo '</div>';
+
+ // Prikažemo že dodane uporabnike in tudi uporabnike samo dodane v virtual dom
+ echo '<div class="h-uporabnik-prikazi" v-if="osebe.show[nivo.level] && (nivo.level < podatki.maxLevel)">';
+ echo 'Uporabnik/i:';
+ echo '<ul>';
+ // Seznam uporabnikov, ki so že v bazi in jih samo prikličemo
+ echo '<li v-for="uporabnik in izbran.sifrantPodatki[nivo.level].uporabniki">{{ uporabnik.email }}
+ <span v-if="uporabnik.ime != uporabnik.email">({{ uporabnik.ime }} {{ uporabnik.priimek }})</span>
+ <span class="icon brisi-x"
+ v-on:click="izbrisiUporabnikaIzBaze(uporabnik.id, $index, nivo.level)"
+ v-if="osebe.nivo < podatki.maxLevel"
+ ></span>
+ </li>';
+ // Seznam uporabnikov, ki jih še ni v bazi in so bili na novo dodani
+ echo '<li v-for="oseba in osebe.nove[nivo.level]">{{ oseba[0] }} <span v-if="oseba[1]">({{ oseba[1] }} {{ oseba[2] }})</span> <span class="icon brisi-x" v-on:click="izbrisiUporabnika(nivo.level)" ></span></li>';
+ echo '</ul>';
+ echo '</div>';
+ echo '</td>';
+ echo '<td style="vertical-align: top;padding: 13px;color:#ffa608;border-left: none;">';
+ // Seznam uporabnikov, ki so že v bazi in jih samo prikličemo
+ echo '<div v-for="uporabnik in izbran.sifrantPodatki[podatki.maxLevel].uporabniki">{{ uporabnik.email }}
+ <span v-if="uporabnik.ime != uporabnik.email">({{ uporabnik.ime }} {{ uporabnik.priimek }})</span>
+ </div>';
+ // Seznam uporabnikov, ki jih še ni v bazi in so bili na novo dodani
+ echo '<div v-for="oseba in osebe.nove[podatki.maxLevel]">{{ oseba[0] }} <span v-if="oseba[1]">({{ oseba[1] }} {{ oseba[2] }})</span> <span class="icon brisi-x" v-on:click="izbrisiUporabnika(podatki.maxLevel)" style="margin-left: 10px;"></span></div>';
+ echo '</td>';
+ echo '</tr>';
+ echo '<tr id="gumb">
+ <td colspan="' . (sizeof($results['nivoji']) + 1) . '">
+ <button type="button" class="btn btn-moder" v-on:click="submitSifrante()">Potrdi in prenesi</button>
+ </td>
+ </tr>';
+ echo '</tbody>';
+ echo '</table>';
+ echo '</div>';
+
+ // možnost vpisa osebe za določen nivo
+ echo '<div style="padding-top:26px;clear: both;display: block;" v-if="osebe.prikazi">';
+ echo '<div class="okvircek">';
+ echo '<h2>Vnos oseb za {{ osebe.nivo }}. nivo:</h2>';
+ echo '<div>';
+ echo $this->lang['srv_hierarchy_add_users'] . '
+ <div style="padding:15px 0;">
+ <textarea name="emails" style="height:100px; width:100%;"
+ v-if="osebe.nivo < podatki.maxLevel"
+ v-model="osebe.textarea"
+ v-on:keyup.enter="preveriPravilnostEmaila()"
+ ></textarea>
+ <input type="text"
+ name="emails"
+ style="height: 16px; width:100%;"
+ v-else
+ v-model="osebe.textarea"
+ v-on:keyup.enter="preveriPravilnostEmaila()"
+ />
+ </div>
+ <div class="h-opozorilo">*Polje email je obvezno polje za zadnji nivo.</div>
+ <div v-if="email.opozorilo" style="color:red;font-style:italic;padding: 0 0 10px;"><ul><li v-for="email in email.napake">Elektronski naslov <b>{{ email.naslov }}</b> v vrstici <b>{{ email.vrstica }}</b> ni pravilen.</li></ul></div>
+ ';
+ echo '</div>';
+ echo '<button type="button" class="btn btn-moder" v-on:click="vpisOsebNaNivoTextarea()">Vnesi osebe</button>';
+ echo '</div>';
+ echo '</div>';
+
+
+ // Prikažemo Datatables rezultate samo za zdanji nivo;
+ echo '<div style="padding-top:26px;clear: both;display: block;">';
+ echo '<h2>Prikaz zgrajene hierarhije:</h2>';
+ echo '<table id="vpis-sifrantov-admin-tabela" class="tabela-obroba">';
+ echo '<thead>';
+ echo ' <tr>';
+ foreach ($results['nivoji'] as $key => $nivo) {
+ echo '<th style="text-align: left;">' . $nivo['level'] . '.nivo: ' . $nivo['ime'] . '</th>';
+ }
+ echo '<th style="width: 120px;"> </th>';
+ echo '</tr>';
+ echo '</thead>';
+ echo '<tbody>';
+ echo '<tbody>';
+ echo '</table>';
+ echo '</div>';
+ echo '</div>';
+ }
+
+ /**
+ * Izris forme za gradnjo hierarhije Superadmin
+ *
+ * @param array $results
+ *
+ * @return echo html
+ */
+ private function vpisHierarhijeAdminTabela($results)
+ {
+ global $site_url;
+
+ echo '<div id="vue-gradnja-hierarhije">';
+ // Kadar nimamo vpisanih šifrantov
+ echo '<div v-if="podatki[0].sifranti[0].sifrant == null" style="padding:10px 0">';
+ echo $this->lang['srv_hierarchy_empty_drop_downs'];
+ echo '</div>';
+
+ echo '<div class="vpis-sifrantov" v-else><table class="tabela-obroba tabela-vpis-sifrantov">';
+ echo '<thead>';
+ echo '<tr>';
+ foreach ($results['nivoji'] as $key => $nivo) {
+ $polje_kljuci = array_keys($results['nivoji']);
+ if ($key == end($polje_kljuci)) {
+ echo '<th style="border-right: none;">' . $nivo['level'] . '. nivo - ' . $nivo['ime'] . '</th>';
+ } else {
+ echo '<th>' . $nivo['level'] . '. nivo - ' . $nivo['ime'] . '</th>';
+ }
+ }
+ echo '<th style="border-left: none;">Evalviranec</th>';
+ echo '</tr>';
+ echo '</thead>';
+ echo '<tbody>';
+ echo '<tr>';
+ echo '<td v-for="nivo in podatki" style="width: auto;vertical-align: top; border-right:none;">';
+ // 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 '<div v-show="prikaziJsKoSeJeCelaSpletnaStranZeNalozila(nivo.level)">';
+
+ echo '<div class="h-select2">
+ <select class="select2" v-select="izbran.sifrant[nivo.level]" data-level="{{ nivo.level }}">
+ <option value="0"> --- </option>
+ <option v-for="s in nivo.sifranti" :value="s.id">{{ s.sifrant }}</option>
+ </select>
+ </div>';
+
+ echo '<div class="h-uporabnik" v-show="aliPrikazemIkonoZaDodajanjeUporabnikov(nivo.level)" v-on:click="prikaziVnosOseb(nivo.level)">
+ <span v-if="nivo.level == podatki.maxLevel" class="icon user-red"></span>
+ <span v-else class="faicon users icon-as_link"></span>
+ </div>';
+
+ echo '<div class="h-select2 izberi-uporabnika" v-if="prikaziSelectZaZadnjiNivo(nivo.level)">
+ <select class="select2" id="izbira-uciteljev" v-select="user.selected" v-on:change="vpisemoUporabnikaIzDropDownMenija()">
+ <option value="0"> --- </option>
+ <option v-for="user in user.dropdown" :value="user.id">{{ user.label }}</option>
+ </select>
+ </div>';
+
+ echo '</div>';
+
+
+ // Prikažemo že dodane uporabnike in tudi uporabnike samo dodane v virtual dom
+ echo '<div class="h-uporabnik-prikazi" v-if="osebe.show[nivo.level] && (nivo.level < podatki.maxLevel)">';
+ echo 'Uporabnik/i:';
+ echo '<ul>';
+ // Seznam uporabnikov, ki so že v bazi in jih samo prikličemo
+ echo '<li v-for="uporabnik in izbran.sifrantPodatki[nivo.level].uporabniki">{{ uporabnik.email }}
+ <span v-if="uporabnik.ime != uporabnik.email">({{ uporabnik.ime }} {{ uporabnik.priimek }})</span>
+ <span class="icon brisi-x"
+ v-on:click="izbrisiUporabnikaIzBaze(uporabnik.id, $index, nivo.level)"
+ v-if="nivo.level < podatki.maxLevel"
+ ></span>
+ </li>';
+ // Seznam uporabnikov, ki jih še ni v bazi in so bili na novo dodani
+ echo '<li v-for="oseba in osebe.nove[nivo.level]">{{ oseba[0] }} <span v-if="oseba[1]">({{ oseba[1] }} {{ oseba[2] }})</span> <span class="icon brisi-x" v-on:click="izbrisiUporabnika(nivo.level)" ></span></li>';
+ echo '</ul>';
+ echo '</div>';
+ echo '</td>';
+ echo '<td style="vertical-align: top;padding: 13px;color:#ffa608; border-left: none;">';
+ echo '<div v-if="izbran.sifrantPodatki[podatki.maxLevel]">';
+ // Seznam uporabnikov, ki so že v bazi in jih samo prikličemo
+ echo '<div v-for="uporabnik in izbran.sifrantPodatki[podatki.maxLevel].uporabniki">{{ uporabnik.email }}
+ <span v-if="uporabnik.ime != uporabnik.email">({{ uporabnik.ime }} {{ uporabnik.priimek }})</span>
+ </div>';
+ // Seznam uporabnikov, ki jih še ni v bazi in so bili na novo dodani
+ echo '<div v-for="oseba in osebe.nove[podatki.maxLevel]">{{ oseba[0] }} <span v-if="oseba[1]">({{ oseba[1] }} {{ oseba[2] }})</span> <span class="icon brisi-x" v-on:click="izbrisiUporabnika(podatki.maxLevel)" style="margin-left: 10px;"></span></div>';
+ echo '</div>';
+ echo '</td>';
+ echo '</tr>';
+ echo '<tr id="gumb">
+ <td colspan="' . (sizeof($results['nivoji']) + 1) . '">
+ <button type="button" class="btn btn-moder" v-on:click="submitSifrante()">Potrdi in prenesi</button>
+ </td>
+ </tr>';
+ echo '</tbody>';
+ echo '</table>';
+ echo '<div class="error-email" style="display: none;" v-if="preveriCejeEmailZeVnesenVbazoZaUcitelja(podatki.maxLevel)"><span class="faicon warning icon-orange"></span> Elektronski naslov za zadnji nivo je že vnešen v bazo.</div>';
+ echo '</div>';
+
+ // možnost vpisa osebe za določen nivo
+ echo '<div style="padding-top:26px;clear: both;display: block;" v-if="osebe.prikazi">';
+ echo '<div class="okvircek">';
+ echo '<h2 v-if="osebe.nivo < podatki.maxLevel">Vnos oseb za {{ osebe.nivo }}. nivo ​– managerji z vpogledom v rezultate (?)</h2>';
+ echo '<h2 v-else class="oranzna">​Vnos osebe na zadnjem nivoju - učitelj, ki bo evalviran (?)</h2>';
+ echo '<div>';
+ echo '<p v-if="osebe.nivo < podatki.maxLevel">' . $this->lang['srv_hierarchy_add_users'] . '</p>';
+ echo '<p v-else>' . $this->lang['srv_hierarchy_add_users_last'] . '</p>';
+ echo '<div style="padding:15px 0;">';
+ echo '<textarea name="emails" style="height:100px; width:100%;"
+ v-if="osebe.nivo < podatki.maxLevel"
+ v-model="osebe.textarea"
+ v-on:keyup.enter="preveriPravilnostEmaila()"
+ ></textarea>
+ <input type="text"
+ name="emails"
+ style="height: 16px; width:100%;"
+ v-if="osebe.nivo == podatki.maxLevel"
+ v-model="osebe.textarea"
+ v-on:keyup.enter="preveriPravilnostEmaila()"
+ />
+ </div>
+ <div class="h-opozorilo">*Polje email je obvezno polje za zadnji nivo.</div>
+ <div v-if="email.opozorilo" style="color:red;font-style:italic;padding: 0 0 10px;"><ul><li v-for="email in email.napake">Elektronski naslov <b>{{ email.naslov }}</b> v vrstici <b>{{ email.vrstica }}</b> ni pravilen.</li></ul></div>';
+ echo '</div>';
+ echo '<button type="button" class="btn btn-moder" v-on:click="vpisOsebNaNivoTextarea()">
+ <span v-if="osebe.nivo < podatki.maxLevel">Vnos oseb</span>
+ <span v-else>Vnos osebe</span>
+ </button>';
+ echo '</div>';
+ echo '</div>';
+
+
+ // Prikažemo Datatables rezultate samo za zdanji nivo;
+ echo '<div id="div-datatables" style="padding-top:26px;clear: both;display: block;">';
+ echo '<h2>Prikaz zgrajene hierarhije:</h2>';
+ // Vklopimo prikaz pomoči in števila vnoso uporabnikov
+ echo '<div class="help-text" style="width: 100%">';
+ $this->prikaziStUporabnikovNaZadnjemNivojuHelp();
+ echo '</div>';
+
+ echo '<div class="uporabniki-ikona-tabela"
+ title="Zamenjaj uporabnika na zadnjem nivoju"
+ onclick="zamenjajUporabnikaZNovim()"
+ >
+ <div class="btn btn-moder">' . $this->lang['srv_hierarchy_btn_find_and_replace'] . '</div>
+ </div>';
+ echo '<div class="uporabniki-ikona-tabela"
+ title="CSV izvoz uporabnikov"
+ style="padding: 0 10px;"
+ >
+ <a href="index.php?anketa=' . $this->anketa . '&a=' . ($this->hierarhija_type < 5 ? A_HIERARHIJA_SUPERADMIN : A_HIERARHIJA) . '&m=uredi-uporabnike&izvoz=1" class="btn btn-moder">Izvoz uporabnikov</a>
+ </div>';
+ echo '<table id="vpis-sifrantov-admin-tabela" class="tabela-obroba">';
+ echo '<thead>';
+ echo ' <tr>';
+ foreach ($results['nivoji'] as $key => $nivo) {
+ echo '<th style="text-align: left;">' . $nivo['level'] . '.nivo: ' . $nivo['ime'] . '</th>';
+ }
+ echo '<th style="width: 70px;"> </th>';
+ echo '</tr>';
+ echo '</thead>';
+ echo '<tbody>';
+ echo '<tbody>';
+ echo '</table>';
+ echo '<div style="display:block; margin:25px -20px; padding-bottom:25px; width: 100%;">';
+ echo '<button class="btn btn-moder"
+ style="float: right;"
+ onclick="opozoriUporabnikaKerNiPotrdilPodatkov(\'index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA_SUPERADMIN . '&amp;m=' . M_ADMIN_AKTIVACIJA . '\')"
+ title="' . $this->lang['srv_hierarchy_status'] . '">';
+ echo $this->lang['next1'] . '</button>';
+ echo '</div>';
+ echo '</div>';
+ echo '</div>';
+ }
+
+ /**
+ * 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 '<h2>Izgradnja hierarhije <span class="oranzan">' . (!empty($aktivna_hierarhija_ime) ? $aktivna_hierarhija_ime : '') . '</span> za anketo: ' . $row['naslov'] . '</h2>';
+
+ //vnosni obrazec za izgradnjo hierarhije
+ echo '<div class="izgradnja_hierarhije">';
+
+ //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 '<form id="h-submit">';
+ // echo '<input type="hidden" value="' . $this->anketa . '" id="anketa_id" name="anketa_id">';
+ //
+ // if (isset($level)) {
+ // $this->vpisHierarhijeTabela($results, $level, $struktura_sifrant_id);
+ // } else {
+ // $this->vpisHierarhijeTabela($results, null, null, $max_st_nivojev);
+ // }
+
+ // echo '<form id="h-submit">';
+ // echo '<input type="hidden" value="' . $this->anketa . '" id="anketa_id" name="anketa_id">';
+ //
+ // if (isset($level)) {
+ // $this->vpisHierarhijeAdmin($results, $level, $struktura_sifrant_id);
+ // } else {
+ // $this->vpisHierarhijeAdmin($results);
+ // }
+ //
+ //
+ // echo '<div class="h-form-field">
+ // <label id="check-uporabnik">Dodaj uporabnika na izbran nivo:</label>
+ // <div class="h-form-options">
+ // <input type="checkbox" name="email-check" value="1" id="dovoli-vpis-emaila"/>
+ // </div>
+ // </div>';
+ //
+ // echo '<div class="h-form-field" id="vpis-emaila">
+ // <label>' . $this->lang['srv_hierarchy_add_users'] . '</label>
+ // <div class="h-form-options h-email-user">
+ // <textarea name="emails"></textarea>
+ // </div>
+ // <div class="h-opozorilo">*Polje email je obvezno polje za zadnji nivo.</div>
+ // </div>';
+ //
+ // echo '<div class="h-form-field" style="padding-left: 35em; clear: both;">
+ // <input type="submit" value="Vnesi">
+ // </div>';
+ // echo '</form>';
+
+ }
+
+
+ echo '</div>';
+
+ //prikaži JS Tree s trenutno hierarhijo
+ $this->jsTreePrikazHierarhije();
+ } elseif (!empty($max_st_nivojev) && SurveyInfo::getSurveyModules('hierarhija') == 2) {
+ echo '<h3>' . $this->lang['srv_hierarchy_active_text'] . '</h3>';
+ $this->jsTreePrikazHierarhije();
+ } else {
+ echo '<h3>' . $this->lang['srv_hierarchy_nothing'] . '</h3>';
+ }
+
+ }
+
+ 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 '<div id="hierarhija-status">';
+
+ if (SurveyInfo::getSurveyModules('hierarhija') == 2) {
+ echo '<div class="status-gumbi">';
+ echo '<button class="btn btn-moder" onclick="prikaziUrejanjeSuperkode()">Vključi izdelavo superšifre</button>';
+ echo '</div>';
+ }
+
+ echo '<div class="tabela-status">';
+ echo '<table class="hierarhija-status-admin custom-datatables printElement printTable" id="hierarhija-status-admin">';
+ echo '<thead>';
+ echo '<tr>
+ <th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb auto-width" style="width:90px;">Izberi učitelja za generiranje super šifre</th>
+ <th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb auto-width">Hierarhija</th>
+ <th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Email učitelja</th>
+ <th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Koda za učence</th>
+ <th colspan="3" style="text-align: center;" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Status učencev</th>
+ <th colspan="2" style="text-align: center;" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Časovni potek učencev</th>';
+ echo '<th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb" style="border-left:2px solid #fa4913 !important;">Koda za učitelja</th>';
+ echo '<th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Vnos učitelja (datum)</th>
+ </tr>';
+ echo '<tr>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">' . $this->lang['srv_userstatus_5ll'] . '</th>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">' . $this->lang['srv_userstatus_5'] . '</th>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">' . $this->lang['srv_userstatus_6'] . '</th>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Prvi vnos</th>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Zadnji vnos</th>
+ </tr>';
+ echo '</thead>';
+ echo '<tbody>';
+
+ $body = HierarhijaIzvoz::getInstance($this->anketa)->getStatus(TRUE);
+
+ if (is_null($body)) {
+ return '';
+ }
+
+ foreach ($body as $id_koda => $row) {
+ echo '<tr>';
+ echo '<td style="text-align: center;">
+ <input type="checkbox" value="' . $id_koda . '" class="koda-za-kosarico" onclick="dodajKodoVKosarico(\'' . $id_koda . '\')"/>
+ </td>';
+
+ // Izrišemo vse stolpce v omenjeni vrstici
+ foreach ($row as $key => $podatek) {
+ if ($key == 0 || $key == 1) {
+
+ echo '<td ' . ($key == 0 ? 'data-hierarhija' : 'data-email') . '="' . $id_koda . '">' . $podatek . '</td>';
+
+ } elseif ($key == 2 || $key == 8) {
+
+ echo '<td style="text-align:center; letter-spacing:1px; ' . ($key == 2 ? 'color:#1e88e5;' : NULL) . ($key == 8 ? 'border-left:2px solid #fa4913 !important;' : NULL) . '">' . $podatek . '</td>';
+
+ } else {
+
+ echo '<td style="text-align:center;">' . $podatek . '</td>';
+
+ }
+
+ }
+
+ echo '</tr>';
+ }
+
+ echo '</tbody>';
+ echo '</table>';
+ echo '</div>';
+
+ echo '<div class="analysis_bottom_settings">
+
+ <a href="#" onclick="printElement(\'Status\'); return false;" title="Natisni" class="srv_ico">
+ <span class="faicon print icon-grey_dark_link"></span>
+ </a>
+
+ <a href="index.php/?anketa=' . $this->anketa . '&a=' . A_HIERARHIJA_SUPERADMIN . '&m=' . M_HIERARHIJA_STATUS . '&izvoz=status" title="CSV izvoz" class="srv_ico">
+ <span class="sprites xls_large"></span>
+ </a>
+
+ </div>';
+
+ echo '</div>';
+
+ // košarica s kodami
+ echo '<div class="superkode">';
+ echo '<div class="kosarica" style="display: none;">';
+ echo '<h2>Tranutno izbrane kode:</h2>';
+ echo '<ul id="seznamKod"></ul>';
+ echo '<button class="btn btn-moder" id="ustvari-superkodo">Ustvari novo super kodo</button>';
+ echo '</div>';
+
+ echo '<div class="prikaz-superkod" style="display: none;">
+ <h2>Superkode</h2>
+ <table class="hierarhija-tabela">
+ <thead>
+ <tr>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb auto-width">Superkoda</th>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb auto-width">Seznam hierarhije, ki jih pokriva</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>';
+ echo '</div>';
+ }
+
+ /**
+ * 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 '<table class="hierarhija-status-ucitelji printElement">';
+ echo '<thead>';
+ echo '<tr>
+ <th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Hierarhija</th>';
+ echo '<th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Koda za učence</th>';
+
+ echo '<th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Koda za učitelja</th>
+ <th colspan="3" style="text-align: center;" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Status učencev</th>
+ <th colspan="2" style="text-align: center;" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Časovni potek učencev</th>
+ <th rowspan="2" class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Vnos učitelja (datum)</th>
+ </tr>';
+ echo '<tr>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">' . $this->lang['srv_userstatus_5ll'] . '</th>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">' . $this->lang['srv_userstatus_5'] . '</th>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">' . $this->lang['srv_userstatus_6'] . '</th>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Prvi vnos</th>
+ <th class="anl_br anl_ac anl_bck anl_variabla_line anl_bb">Zadnji vnos</th>
+
+ </tr>';
+ echo '</thead>';
+ echo '<tbody>';
+
+ //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 '<tr>
+ <td>' . HierarhijaHelper::hierarhijaPrikazNaslovovpriUrlju($this->anketa, $struktura_id) . '</td>';
+
+ echo '<td style="text-align:center;color:#ffa608;">' . strtoupper(HierarhijaOnlyQuery::getKodaRow($this->anketa, $struktura_id)->koda) . '</td>';
+
+ echo '<td style="text-align:center;">' . strtoupper(HierarhijaOnlyQuery::getKodaRow($this->anketa, $struktura_id, 'ucitelj')->koda) . '</td>
+ <td style="text-align:center;">' . (!empty($zacel_izpolnjevati) ? $zacel_izpolnjevati : '/') . '</td>
+ <td style="text-align:center;">' . (!empty($delno_izpolnjena) ? $delno_izpolnjena : '/') . '</td>
+ <td style="text-align:center;">' . (!empty($koncal_anketo) ? $koncal_anketo : '/') . '</td>
+ <td style="text-align:center;">' . (!is_null($first_insert) ? date('d.m.Y, H:i', $first_insert) : '/') . '</td>
+ <td style="text-align:center;">' . (!is_null($last_insert) ? date('d.m.Y, H:i', $last_insert) : '/') . '</td>
+ <td style="text-align:center;">' . ((!is_null($cas_ucitelj['cas']) && $cas_ucitelj['status'] == 6 && $cas_ucitelj['lurker'] == 0) ? date('d.m.Y, H:i', $cas_ucitelj['cas']) : '/') . '</td>';
+
+ // V kolikor je hierarhija aktivna potem prikažemo možnost pregleda analiz
+ if ($this->modul['hierarhija'] > 1) {
+ echo '<td><a href="index.php?anketa=' . $this->anketa . '&a=' . A_HIERARHIJA . '&m=' . M_ANALIZE . '&s=' . $struktura_id . '" class="btn btn-moder">Poglej analizo</button></td>';
+ }
+ echo '</tr>';
+ }
+
+ echo '</tbody>';
+ echo '</table>';
+ }
+
+ /**
+ * 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 '<div class="hierarhija-navigacija">';
+ echo '<ul>';
+
+ # zavihek urejanje hierarhije
+ echo '<li>';
+
+ echo '<a id="h-navbar-link" class="no-img side-right' . ($url == M_ADMIN_UREDI_SIFRANTE ? ' active' : '') . '"' . ' href="index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA_SUPERADMIN . '&amp;m=' . M_ADMIN_UREDI_SIFRANTE . '"
+ title="' . ($hierarchy_status == 2 ? $this->lang['srv_hierarchy_code_active'] : $this->lang['srv_hierarchy_code']) . '">';
+ echo ($hierarchy_status == 2 ? $this->lang['srv_hierarchy_code_active'] : $this->lang['srv_hierarchy_code']) . '</a>';
+ echo '</li>';
+ echo '<li class="space"></li>';
+
+ # zavihek uredi uporabnike
+ echo '<li>';
+ echo '<a id="h-navbar-link"
+ class="no-img side-right' . ($url == M_UREDI_UPORABNIKE ? ' active' : '') . '"' . ' href="index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA_SUPERADMIN . '&amp;m=' . M_UREDI_UPORABNIKE . '"
+ title="' . ($hierarchy_status == 2 ? $this->lang['srv_hierarchy_add_users_link_active'] : $this->lang['srv_hierarchy_add_users_link']) . '">';
+ echo ($hierarchy_status == 2 ? $this->lang['srv_hierarchy_add_users_link_active'] : $this->lang['srv_hierarchy_add_users_link']) . '</a>';
+ echo '</li>';
+ echo '<li class="space"></li>';
+
+ # zavihek AKTIVIRANJE ANEKTE v kolikor je bila že aktivirana potem izklop ni več mogoč
+ echo '<li>';
+ echo '<a id="h-navbar-link" class="no-img side-right' . ($url == M_ADMIN_AKTIVACIJA ? ' active' : '') . '"' . ' href="index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA_SUPERADMIN . '&amp;m=' . M_ADMIN_AKTIVACIJA . '" title="' . $this->lang['srv_hierarchy_activation_link'] . '">';
+ echo $this->lang['srv_hierarchy_activation_link'] . '</a>';
+ echo '</li>';
+ echo '<li class="space"></li>';
+
+ # zavihek status
+ echo '<li>';
+ echo '<a id="h-navbar-link" class="no-img side-right' . ($url == M_HIERARHIJA_STATUS ? ' active' : '') . '"' . ' href="index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA_SUPERADMIN . '&amp;m=' . M_HIERARHIJA_STATUS . '" title="' . $this->lang['srv_hierarchy_status'] . '">';
+ echo $this->lang['srv_hierarchy_status'] . '</a>';
+ echo '</li>';
+ echo '<li class="space"></li>';
+
+ # zavihek analize
+ if (HierarhijaHelper::preveriDostop($this->anketa) ) {
+ echo '<li>';
+ echo '<a id="h-navbar-link" class="no-img side-right' . ($url == M_ANALIZE ? ' active' : '') . '"' . ' href="index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA_SUPERADMIN . '&amp;m=' . M_ANALIZE . '" title="' . $this->lang['srv_hierarchy_analysis_link'] . '">';
+ echo $this->lang['srv_hierarchy_analysis_link'] . '</a>';
+ echo '</li>';
+ echo '<li class="space"></li>';
+ }
+
+ # zavihek KOPIRANJE ankete
+ echo '<li>';
+ echo '<a id="h-navbar-link" class="no-img side-right' . ($url == M_ADMIN_KOPIRANJE ? ' active' : '') . '"' . ' href="index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA_SUPERADMIN . '&amp;m=' . M_ADMIN_KOPIRANJE . '" title="' . $this->lang['srv_hierarchy_copy_link'] . '">';
+ echo $this->lang['srv_hierarchy_copy_link'] . '</a>';
+ echo '</li>';
+ echo '<li class="space"></li>';
+
+
+ echo '</ul>';
+ echo '</div>';
+
+ }
+
+ /**
+ * 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 '<div class="hierarhija-navigacija ucitelji">';
+ echo '<ul>';
+
+ # zavihek uredi uporabnike
+ echo '<li>';
+ echo '<a id="h-navbar-link" class="no-img side-right' . ($url == M_UREDI_UPORABNIKE ? ' active' : '') . '"' . ' href="index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA . '&amp;m=' . M_UREDI_UPORABNIKE . '"
+ title="' . ($hierarchy_status == 2 ? $this->lang['srv_hierarchy_add_users_link_active'] : $this->lang['srv_hierarchy_add_users_link']) . '">';
+ echo ($hierarchy_status == 2 ? $this->lang['srv_hierarchy_add_users_link_active'] : $this->lang['srv_hierarchy_add_users_link']) . '</a>';
+ echo '</li>';
+ echo '<li class="space"></li>';
+
+ # zavihek status
+ echo '<li>';
+ echo '<a id="h-navbar-link" class="no-img side-right' . ($url == M_HIERARHIJA_STATUS ? ' active' : '') . '"' . ' href="index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA . '&amp;m=' . M_HIERARHIJA_STATUS . '" title="' . $this->lang['srv_hierarchy_status'] . '">';
+ echo $this->lang['srv_hierarchy_status'] . '</a>';
+ echo '</li>';
+ echo '<li class="space"></li>';
+
+ # zavihek analize
+ echo '<li>';
+ echo '<a id="h-navbar-link" class="no-img side-right' . ($url == M_ANALIZE ? ' active' : '') . '"' . ' href="index.php?anketa=' . $this->anketa . '&amp;a=' . A_HIERARHIJA . '&amp;m=' . M_ANALIZE . '" title="' . $this->lang['srv_hierarchy_analysis_link'] . '">';
+ echo $this->lang['srv_hierarchy_analysis_link'] . '</a>';
+ echo '</li>';
+ echo '<li class="space"></li>';
+
+
+ # url naslov
+ echo '<li class="hierarhija-desni-link">';
+ echo '<span>' . $this->lang['srv_hierarchy_link_name'] . '</span>';
+ echo '<a id="h-navbar-link" class="no-img side-right" href="' . $site_url . 'sa" target="_blank">';
+ echo $site_url . 'sa</a>';
+ echo '</li>';
+
+ echo '</ul>';
+ echo '</div>';
+
+ }
+
+} \ 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 @@
+<?php
+/***************************************
+ * Description: Funkcije za pomoč pri hierarhiji
+ * Autor: Robert Šmalc
+ * Created date: 11.04.2017
+ *****************************************/
+
+namespace Hierarhija;
+
+use Hierarhija\Model\HierarhijaOnlyQuery;
+use Hierarhija\Model\HierarhijaQuery;
+use SurveyInfo;
+use Common;
+
+class HierarhijaHelper
+{
+ /**
+ * Iz teksa zamenjamo besede, ki so med lojtrami (#nivo1#, #nivo2#, #ime
+ * ucitelja#, #email ucitelja#)
+ *
+ * @param text $text
+ * @param int $ank_id
+ *
+ * @return text
+ */
+ public static function dataPiping($text, $ank_id = null)
+ {
+
+ if (is_null($ank_id)) {
+ $ank_id = (! empty(get('anketa')) ? get('anketa') : $_GET['anketa']);
+ }
+
+ // Preverimo, če tekst vsebuje kaj
+ if (! preg_match_all('/#([\w\s]+)#/', $text, $matches) || is_null($ank_id)) {
+ return $text;
+ }
+
+ // Pridobimo ID vrednosti spremenljivk, za katere moramo dobiti naslove, da jih lahko prikažemo
+ $get = get('get');
+
+ // V kolikor smo na katerikoli strani, potem gledamo po piškotkih
+ if (isset($get->{'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 @@
+<?php
+/***************************************
+ * Description:
+ * Autor: Robert Šmalc
+ * Created date: 10.08.2017
+ *****************************************/
+
+namespace Hierarhija;
+
+use Dostop;
+use Export;
+use Hierarhija\Model\HierarhijaOnlyQuery;
+use Hierarhija\Model\HierarhijaQuery;
+use SurveyInfo;
+use TrackingClass;
+
+class HierarhijaIzvoz {
+
+ private static $_instance;
+
+ protected $anketa;
+
+ protected $polje_strukture = [];
+
+ protected $user_id;
+
+ public function __construct($anketa)
+ {
+ $this->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('<br />', '', $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 @@
+<?php
+/***************************************
+ * Description:
+ * Autor: Robert Šmalc
+ * Created date: 06.05.2017
+ *****************************************/
+
+namespace Hierarhija;
+
+
+include_once($_SERVER['DOCUMENT_ROOT'].'/function.php');
+include_once($_SERVER['DOCUMENT_ROOT'].'/admin/survey/definition.php');
+include_once($_SERVER['DOCUMENT_ROOT'].'/admin/exportclases/class.pdfIzvozAnalizaFunctions.php');
+require_once($_SERVER['DOCUMENT_ROOT'].'/admin/exportclases/class.enka.pdf.php');
+
+define("ALLOW_HIDE_ZERRO_REGULAR", false); // omogočimo delovanje prikazovanja/skrivanja ničelnih vnosti za navadne odgovore
+define("ALLOW_HIDE_ZERRO_MISSING", true); // omogočimo delovanje prikazovanja/skrivanja ničelnih vnosti za missinge
+
+define("NUM_DIGIT_AVERAGE", 2); // stevilo digitalnih mest za povprecje
+define("NUM_DIGIT_DEVIATION", 2); // stevilo digitalnih mest za povprecje
+
+define("M_ANALIZA_DESCRIPTOR", "descriptor");
+define("M_ANALIZA_FREQUENCY", "frequency");
+
+define("FNT_FREESERIF", "freeserif");
+define("FNT_FREESANS", "freesans");
+define("FNT_HELVETICA", "helvetica");
+
+define("FNT_MAIN_TEXT", FNT_FREESANS);
+define("FNT_QUESTION_TEXT", FNT_FREESANS);
+define("FNT_HEADER_TEXT", FNT_FREESANS);
+
+define("FNT_MAIN_SIZE", 10);
+define("FNT_QUESTION_SIZE", 9);
+define("FNT_HEADER_SIZE", 10);
+
+define("RADIO_BTN_SIZE", 3);
+define("CHCK_BTN_SIZE", 3);
+define("LINE_BREAK", 6);
+
+define ('PDF_MARGIN_HEADER', 8);
+define ('PDF_MARGIN_FOOTER', 12);
+define ('PDF_MARGIN_TOP', 18);
+define ('PDF_MARGIN_BOTTOM', 18);
+define ('PDF_MARGIN_LEFT', 15);
+define ('PDF_MARGIN_RIGHT', 15);
+
+use enka_TCPDF;
+use SurveyUserSession;
+use SurveyMeans;
+use HierarhijaAnalysis;
+use SurveyInfo;
+use SurveyUserSetting;
+use SurveyDataSettingProfiles;
+
+class HierarhijaIzvozAnalize
+{
+
+ var $anketa;// = array(); // trenutna anketa
+
+ var $pi=array('canCreate'=>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("&scaron;","&#353;","&#269;"),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 @@
+<?php
+
+/***************************************
+ * Description: Razred omogoča kopiranja obstoječe strukture in shranjevanje v json
+ * Autor: Robert Šmalc
+ * Created date: 04.11.2016
+ *****************************************/
+namespace Hierarhija;
+
+use Hierarhija\Model\HierarhijaOnlyQuery;
+use Hierarhija\Model\HierarhijaQuery;
+
+class HierarhijaKopiranjeClass
+{
+ private static $_instance;
+ protected $anketa;
+ protected $polje_strukture = [];
+ protected $user_id;
+
+ public function __construct($anketa)
+ {
+ $this->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 @@
+<?php
+/***************************************
+ * Description:
+ * Autor: Robert Šmalc
+ * Created date: 22.05.2017
+ *****************************************/
+
+namespace Hierarhija;
+
+use Hierarhija\Model\HierarhijaOnlyQuery;
+use Hierarhija\Model\HierarhijaQuery;
+use SurveyDataFile;
+use SurveyInfo;
+
+class HierarhijaPorocilaClass
+{
+ // Konstante do direktorijev
+ const tempFolder = "admin/survey/modules/mod_hierarhija/porocila/temp/";
+ const scriptFolder = "admin/survey/modules/mod_hierarhija/porocila/R/";
+ const resultFolder = "admin/survey/modules/mod_hierarhija/porocila/results/";
+
+ public function __construct($anketa = null)
+ {
+ if (is_null($anketa))
+ return 'Ni izbrane ankete';
+
+ $this->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 '<div>';
+ echo 'Rscript ' . $script;
+ //echo '<br />'.$out.'<br />';
+ var_dump($output);
+ echo '</div>';
+
+
+ // 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 '<div>';
+ echo 'Rscript ' . $script;
+ //echo '<br />'.$out.'<br />';
+ var_dump($output);
+ echo '</div>';
+ }
+
+ // 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