1KA_F2F/admin/survey/modules/mod_hierarhija/class/HierarhijaPorocilaClass.php

321 lines
12 KiB
PHP
Raw Normal View History

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