343 lines
9.5 KiB
PHP
Raw Normal View History

2020-08-14 13:36:36 +02:00
<?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()->getSurveyArchiveDBString();
2020-08-14 13:36:36 +02:00
// 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);
}
}