summaryrefslogtreecommitdiffstats
path: root/admin/survey/modules/mod_hierarhija/class/HierarhijaIzvoz.php
diff options
context:
space:
mode:
Diffstat (limited to 'admin/survey/modules/mod_hierarhija/class/HierarhijaIzvoz.php')
-rw-r--r--admin/survey/modules/mod_hierarhija/class/HierarhijaIzvoz.php344
1 files changed, 344 insertions, 0 deletions
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