<?php
namespace App\Controller;
use App\Entity\Users;
use App\Entity\Questionari;
use App\Entity\QuestionariIniziati;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Persistence\ManagerRegistry;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
class DefaultController extends AbstractController
{
#[Route('/', name: 'app_default_index')]
public function index(Request $request, ManagerRegistry $doctrine,$moodle_token = "", $uid = ""): Response
{
$this->denyAccessUnlessGranted('ROLE_USER');
$roles = $this->getUser()->getRoles();
if (in_array("ROLE_MANAGER", $roles)) {
$corsi = [];
$questionario_selected = 0;
$questionario = "";
$domande = [];
$thisQuestionario = "";
$contaCorsi = 0;
$corsiMoodle = [];
$corsoMoodle = 0;
$domande_ = [];
if ((int)$request->get("corsoMoodle") != 0) {
$corsoMoodle = (int)$request->get("corsoMoodle");
}
if ($moodle_token == "") {
$moodle_token = $request->get("moodle_token");
}
if ($uid == "") {
$uid = $request->get("uid");
}
if ($moodle_token != "" && $uid != "") {
$corsi = json_decode($this->getUser()->getCorsiMoodle());
if ($corsi && count($corsi) != 0 && (int)$request->get("corsoMoodle") == 0) {
$corsoMoodle = $corsi[0];
} else {
if ((int)$request->get("corsoMoodle") == 0) {
return $this->render('default/errormanager.html.twig', [
"errore" => "Non ci sono corsi collegati"
]);
}
}
$i = 0;
$options = [];
foreach ($corsi as $c) {
// recupero i titolo dei corsi a partire dall'id
$options[] = "options[ids][".$i."]=".$c;
$i++;
}
$x = exec('curl "https://www.partecipa.eu/webservice/rest/server.php?wstoken=' . $moodle_token . '&wsfunction=core_course_get_courses" -d "' . implode("&", $options) . '&moodlewsrestformat=json"');
$corsiJson = json_decode($x);
$questoCorso = "";
foreach ($corsiJson as $cJ) {
$corsiMoodle[$cJ->id] = $cJ->shortname;
if ($request->get("corsoMoodle") != "" && $cJ->id == $request->get("corsoMoodle")) {
$questoCorso = $cJ;
}
}
//var_dump($corsi);
$questionari = $doctrine->getRepository(Questionari::class)->findBy(["corso_id" => $corsi]);
$quests = [];
$qid = 0;
foreach ($questionari as $q) {
if (!isset($quests[$q->getQuestionario()->getId()])) {
$quests[$q->getQuestionario()->getId()] = $q->getQuestionario()->getTitolo();
if ($qid == 0) {
$qid = $q->getQuestionario()->getId();
}
}
}
if (count($quests) == 1) {
$questionario_selected = 1;
if((int)$request->get("corsoMoodle") != 0) {
$questionari = $doctrine->getRepository(Questionari::class)->findBy(["corso_id" => (int)$request->get("corsoMoodle")]);
} else {
$questionari = $doctrine->getRepository(Questionari::class)->findBy(["corso_id" => $corsi,"questionario" => $qid]);
}
foreach ($questionari as $q) {
$contaCorsi++;
}
$thisQuestionario = $questionari[0]->getQuestionario();
}
if ((int)$request->get("questionario") != 0) {
if ((int)$request->get("corsoMoodle") != 0) {
$questionari = $doctrine->getRepository(Questionari::class)->findBy(["corso_id" => (int)$request->get("corsoMoodle"), "questionario" => (int)$request->get("questionario")]);
} else {
$questionari = $doctrine->getRepository(Questionari::class)->findBy(["corso_id" => $corsi, "questionario" => (int)$request->get("questionario")]);
}
$thisQuestionario = $questionari[0]->getQuestionario();
$questionario_selected = 1;
$questionario = (int)$request->get("questionario");
foreach ($questionari as $q) {
$contaCorsi++;
}
}
if ($questionario_selected == 1) {
// ho scelto il singolo questionario
if ($corsoMoodle == 0) {
// sono nell'aggregato multicorso
// qui ci sono n questionari compilati che potrebbero avere sulla domanda "docente" un comportamento anomalo tra un questioanrio e l'altro ( 1 docente , 2 docenti .. n docenti a seconda del corso )
// in questo caso costruisco il modello a partire dal "root model" e poi aggrego le risposte "docente" mediandole per renderle singole.
$domande = $thisQuestionario->getDomandes();
foreach ($domande as $d) {
if ($d->getTipoRisposta() == "linkert5") {
$opt = $d->getOpzioniRisposta();
$opt = explode("\n",$opt);
$range = $opt[0];
$range = explode("#",$range);
$range = explode("|",$range[1]);
$argomenti = $opt[1];
$argomenti = explode("#",$argomenti);
$argomenti = explode("|",$argomenti[1]);
$domande_["d".$d->getPosizione()] = ["domanda" => $d->getDomanda(), "argomenti" => [], "range" => []];
foreach ($range as $r) {
$r2 = explode(":", $r);
$domande_["d" . $d->getPosizione()]["range"][$r2[0]] = $r2[1];
}
$i = 0;
foreach ($argomenti as $a) {
$domande_["d" . $d->getPosizione()]["argomenti"][] = ["domanda" => $a,"range" => []];
foreach ($range as $r) {
$r2 = explode(":", $r);
$domande_["d".$d->getPosizione()]["argomenti"][$i]["range"][$r2[0]] = 0;
}
$i++;
}
}
if ($d->getTipoRisposta()=="docente") {
$opt = $d->getOpzioniRisposta();
$opt = explode("\n", $opt);
$range = $opt[0];
$range = explode("#", $range);
$range = explode("|", $range[1]);
$argomenti = $opt[1];
$argomenti = explode("#", $argomenti);
$argomenti = explode("|", $argomenti[1]);
$docente = "";
$domande_["d" . $d->getPosizione()] = ["domanda" => $d->getDomanda(), "argomenti" => [], "range" => [], "docente" => $docente];
foreach ($range as $r) {
$r2 = explode(":", $r);
$domande_["d" . $d->getPosizione()]["range"][$r2[0]] = $r2[1];
}
$i = 0;
foreach ($argomenti as $a) {
$domande_["d".$d->getPosizione()]["argomenti"][] = ["domanda" => $a, "range" => []];
foreach ($range as $r) {
$r2 = explode(":", $r);
$domande_["d" . $d->getPosizione()]["argomenti"][$i]["range"][$r2[0]] = 0;
}
$i++;
}
}
}
foreach ($questionari as $q) {
$listaquestionari[] = $q->getId();
}
$questionariIniziati = $doctrine->getRepository(QuestionariIniziati::class)->findBy(["questionario" => $listaquestionari, "status" => 1]);
$risposteDocente = [];
$quantiDocenti = 0;
$giro = 0;
foreach ($questionariIniziati as $qi) {
$posizioneMenoUno = 0;
$risposte = $qi->getRispostes();
foreach ($risposte as $r) {
if ($r->getDomanda()->getTipoRisposta() == "linkert5") {
$risposta = $r->getRisposta();
if ($risposta != "") {
$ris = explode("|", $risposta);
foreach ($ris as $rr) {
$ris2 = explode(":", $rr);
$posizione = $r->getPosizione();
if ($posizioneMenoUno) {
$posizione--;
}
if (!isset($domande_["d" . $posizione])) {
} else {
$domande_["d" . $posizione]["argomenti"][($ris2[0] - 1)]["range"][$ris2[1]]++;
}
}
}
}
if ($r->getDomanda()->getTipoRisposta() == "docente") {
if ($quantiDocenti == 1) {
$risposteDocente["posizione"] = $r->getPosizione();
}
if ($quantiDocenti > 1) {
$posizioneMenoUno = 1;
}
$risposta = $r->getRisposta();
if ($risposta != "") {
$ris = explode("|", $risposta);
$opzioni = $r->getOpzioniRisposta();
$opzioni = explode("\n", $opzioni);
$range = $opzioni[0];
$range= explode("#", $range);
$range = explode("|", $range[1]);
$argomenti = $opzioni[1];
$argomenti= explode("#", $argomenti);
$argomenti = explode("|", $argomenti[1]);
if (isset($opzioni[2])) {
$docente = $opzioni[2];
$docente = explode("Teacher:", $docente);
$docente = json_decode($docente[1]);
$docente = $docente->id;
} else {
$docente = 0;
}
if (!isset($risposteDocente["d" . $docente])) {
$risposteDocente["d" . $docente] = ["argomenti" => []];
$i = 0;
foreach ($argomenti as $a) {
$risposteDocente["d" . $docente]["argomenti"][] = ["domanda" => $a, "range" => []];
foreach ($range as $r) {
$r2 = explode(":", $r);
$risposteDocente["d" . $docente]["argomenti"][$i]["range"][$r2[0]] = 0;
}
$i++;
}
}
foreach ($ris as $rr) {
$ris2 = explode(":", $rr);
$risposteDocente["d" . $docente]["argomenti"][($ris2[0] - 1)]["range"][$ris2[1]]++;
}
}
$quantiDocenti++;
}
}
$giro++;
}
$nDocenti = count($risposteDocente) - 1;
$finalRisposteDocente = [
"domanda" => "<p><strong>2. Valutazione docente</strong></p>",
"argomenti" => [],
"range" => []
];
foreach ($range as $rrr) {
$r_ = explode(":", $rrr);
$finalRisposteDocente["range"][$r_[0]] = $r_[1];
}
$giro = 1;
foreach ($risposteDocente as $k=>$v) {
if ($k == "posizione") {
continue;
}
foreach ($v as $k2 => $v2) {
foreach ($v2 as $v3 => $k3) {
if (!isset($finalRisposteDocente["argomenti"][$v3])) {
$finalRisposteDocente["argomenti"][$v3] = ["domanda" => $k3["domanda"], "range" => []];
}
foreach ($k3["range"] as $k4 => $v4) {
if (!isset($finalRisposteDocente["argomenti"][$v3]["range"])) {
$finalRisposteDocente["argomenti"][$v3]["range"] = [];
}
if (!isset($finalRisposteDocente["argomenti"][$v3]["range"][$k4])) {
$finalRisposteDocente["argomenti"][$v3]["range"][$k4] = 0;
}
$finalRisposteDocente["argomenti"][$v3]["range"][$k4] += $v4/$nDocenti;
}
}
}
}
$domande_["d" . $risposteDocente["posizione"]] = $finalRisposteDocente;
} else {
// sono nel dettaglio singolo corso
// qui ci sono n questionari compilati e come "modello" posso ricostruire a partire da domane
$questionarioModello = $questionari[0];
$domande = $questionarioModello->getDomandes();
foreach ($domande as $d) {
if ($d->getTipoRisposta() == "linkert5") {
$opt = $d->getOpzioniRisposta();
$opt = explode("\n", $opt);
$range = $opt[0];
$range = explode("#", $range);
$range = explode("|", $range[1]);
$argomenti = $opt[1];
$argomenti = explode("#", $argomenti);
$argomenti = explode("|", $argomenti[1]);
$domande_["d" . $d->getPosizione()] = ["domanda" => $d->getDomanda(), "argomenti" => [], "range" => []];
foreach ($range as $r) {
$r2 = explode(":", $r);
$domande_["d" . $d->getPosizione()]["range"][$r2[0]] = $r2[1];
}
$i = 0;
foreach ($argomenti as $a) {
$domande_["d" . $d->getPosizione()]["argomenti"][] = ["domanda" => $a,"range" => []];
foreach ($range as $r) {
$r2 = explode(":", $r);
$domande_["d" . $d->getPosizione()]["argomenti"][$i]["range"][$r2[0]] = 0;
}
$i++;
}
}
if ($d->getTipoRisposta() == "docente") {
$opt = $d->getOpzioniRisposta();
$opt = explode("\n", $opt);
$range = $opt[0];
$range = explode("#", $range);
$range = explode("|", $range[1]);
$argomenti = $opt[1];
$argomenti = explode("#", $argomenti);
$argomenti = explode("|", $argomenti[1]);
$docente = "";
if (isset($opt[2])) {
$docente = explode("Teacher:", $opt[2]);
$docente = json_decode($docente[1]);
$docente = $docente->name;
}
$domande_["d" . $d->getPosizione()] = ["domanda" => $d->getDomanda(), "argomenti" => [], "range" => [], "docente" => $docente];
foreach ($range as $r) {
$r2 = explode(":", $r);
$domande_["d" . $d->getPosizione()]["range"][$r2[0]] = $r2[1];
}
$i = 0;
foreach ($argomenti as $a) {
$domande_["d" . $d->getPosizione()]["argomenti"][] = ["domanda" => $a,"range" => []];
foreach ($range as $r) {
$r2 = explode(":", $r);
$domande_["d" . $d->getPosizione()]["argomenti"][$i]["range"][$r2[0]] = 0;
}
$i++;
}
}
}
foreach ($questionari as $q) {
$listaquestionari[] = $q->getId();
}
$questionariIniziati = $doctrine->getRepository(QuestionariIniziati::class)->findBy(["questionario" => $listaquestionari, "status" => 1]);
foreach ($questionariIniziati as $qi) {
$risposte = $qi->getRispostes();
foreach ($risposte as $r) {
if ($r->getDomanda()->getTipoRisposta() == "linkert5") {
$risposta = $r->getRisposta();
if ($risposta != "") {
$ris = explode("|", $risposta);
foreach ($ris as $rr) {
$ris2 = explode(":", $rr);
if (isset($domande_["d" . $r->getPosizione()]["argomenti"][($ris2[0] - 1)]["range"][$ris2[1]])) {
$domande_["d" . $r->getPosizione()]["argomenti"][($ris2[0] - 1)]["range"][$ris2[1]]++;
}
}
}
}
if ($r->getDomanda()->getTipoRisposta() == "docente") {
$risposta = $r->getRisposta();
if ($risposta != "") {
$ris = explode("|", $risposta);
foreach ($ris as $rr) {
$ris2 = explode(":", $rr);
if (isset($domande_["d" . $r->getPosizione()]["argomenti"][($ris2[0] - 1)]["range"][$ris2[1]])) {
$domande_["d" . $r->getPosizione()]["argomenti"][($ris2[0]-1)]["range"][$ris2[1]]++;
}
}
}
}
}
}
}
} else {
$questionariIniziati = [];
}
if ($request->get("xls") == 1) {
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle("Export");
$sheet->setCellValue('A1', $thisQuestionario->getTitolo());
if ($questoCorso != "") {
$sheet->setCellValue('A2', $questoCorso->fullname);
$sheet->setCellValue('C2', $questoCorso->idnumber);
$sheet->setCellValue('D2', date("d/m/Y", $questoCorso->startdate));
$sheet->setCellValue('E2', date("d/m/Y", $questoCorso->enddate));
}
$sheet->setCellValue('A3', "questionari iniziati");
$sheet->setCellValue('B3', count($questionariIniziati));
$sheet->setCellValue('C4', "Insoddisfacente");
$sheet->setCellValue('D4', "Poco Soddisfacente");
$sheet->setCellValue('E4', "Neutrale");
$sheet->setCellValue('F4', "Soddisfacente");
$sheet->setCellValue('G4', "Molto Soddisfacente");
$i = 5;
foreach ($domande_ as $d) {
$sheet->setCellValue('A' . $i, strip_tags($d["domanda"]));
if (isset($d["docente"])) {
$i++;
$sheet->setCellValue('A' . $i, "Docente: " . strip_tags($d["docente"]));
}
foreach ($d["argomenti"] as $a) {
$i++;
$sheet->setCellValue('A' . $i, strip_tags($a["domanda"]));
foreach ($a["range"] as $k => $v) {
if ($k == 1) {
$sheet->setCellValue('C' . $i, $v);
}
if ($k == 2) {
$sheet->setCellValue('D' . $i, $v);
}
if ($k == 3) {
$sheet->setCellValue('E' . $i, $v);
}
if ($k == 4) {
$sheet->setCellValue('F' . $i, $v);
}
if ($k == 5) {
$sheet->setCellValue('G' . $i, $v);
}
}
}
$i++;
}
// Create your Office 2007 Excel (XLSX Format)
$writer = new Xlsx($spreadsheet);
// Create a Temporary file in the system
$fileName = 'export_questionario.xlsx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
// Create the excel file in the tmp directory of the system
$writer->save($temp_file);
// Return the excel file as an attachment
return $this->file($temp_file, $fileName, ResponseHeaderBag::DISPOSITION_INLINE);
}
return $this->render('default/indexmanager.html.twig', [
"corsi" => $corsi,
"quests" => $quests,
"questionari" => $questionari,
"questionario" => $questionario,
"questionariIniziati" => count($questionariIniziati),
"thisQuestionario" => $thisQuestionario,
"moodle_token" => $moodle_token,
"domande" => $domande_,
"corsiMoodle" => $corsiMoodle,
"corsoMoodle" => $corsoMoodle,
"uid" => $uid,
"questionario_selected" => $questionario_selected,
]);
} else {
echo "49";
echo "moodle_token: ".$moodle_token."<br />";
echo "post moodle token: ".$request->get("moodle_token");
exit();
return $this->render('default/errormanager.html.twig', []);
}
} else {
$q = $doctrine->getRepository(Questionari::class)->findBy(["user" => $this->getUser(), "questionario" => null]);
return $this->render('default/index.html.twig', [
"questionari" => $q
]);
}
}
#[Route('/firewall', name: 'app_default_firewall')]
public function firewall(Request $request): Response
{
var_dump($_REQUEST);
exit();
}
}