861 lines
36 KiB
PHP
861 lines
36 KiB
PHP
<?php
|
|
|
|
namespace App\Controller;
|
|
|
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\Form\FormError;
|
|
use App\Form\CreateQuestFlow;
|
|
use Ramsey\Uuid\Uuid;
|
|
|
|
use Symfony\Component\HttpKernel\KernelInterface;
|
|
use Symfony\Component\Filesystem\Filesystem;
|
|
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
|
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
|
|
|
|
use App\Entity\Quest;
|
|
use App\Entity\Questoption;
|
|
use App\Entity\Questguest;
|
|
use App\Entity\Questvote;
|
|
use App\Form\QuestguestType as QuestguestType;
|
|
use App\Form\QuestkeyType as QuestkeyType;
|
|
use App\Form\QueststatusType as QueststatusType;
|
|
|
|
class QuestController extends AbstractController
|
|
{
|
|
private $knpSnappy;
|
|
private $appKernel;
|
|
|
|
public function __construct(KernelInterface $appKernel,\Knp\Snappy\Pdf $knpSnappy)
|
|
{
|
|
$this->appKernel = $appKernel;
|
|
$this->knpSnappy = $knpSnappy;
|
|
}
|
|
|
|
public function list()
|
|
{
|
|
$questguests=$this->getUser()->getQuestguests();
|
|
|
|
return $this->render('Quest/quest.html.twig', [
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
'questguests' => $questguests,
|
|
]);
|
|
}
|
|
|
|
public function submit(CreateQuestFlow $flow)
|
|
{
|
|
$em = $this->getDoctrine()->getManager();
|
|
$key = Uuid::uuid4();
|
|
$quest = new Quest();
|
|
$quest->setUser($this->getUser());
|
|
$quest->setKey($key);
|
|
$quest->setPrivate(true);
|
|
$quest->setNotification(true);
|
|
$quest->setStatus(0);
|
|
$quest->setTonotifyclose(false);
|
|
$quest->setTonotifyopen(false);
|
|
|
|
$flow->bind($quest);
|
|
$form = $flow->createForm();
|
|
|
|
$return = $this->edit($flow,$form,$quest);
|
|
|
|
if($return) return $this->redirect($this->generateUrl('app_quest'));
|
|
|
|
return $this->render('Quest/edit.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
'form' => $form->createView(),
|
|
'flow' => $flow,
|
|
'quest' => $quest,
|
|
]);
|
|
}
|
|
|
|
public function update($id,CreateQuestFlow $flow)
|
|
{
|
|
$em = $this->getDoctrine()->getManager();
|
|
$quest=$em->getRepository("App:Quest")->find($id);
|
|
|
|
// Construction de la chaine jsonquestoptions
|
|
$questoptions=$em->getRepository("App:Questoption")->findBy(["quest"=>$quest],["roworder"=>"ASC"]);
|
|
$tboptions=[];
|
|
foreach($questoptions as $questoption) {
|
|
$roworder=$questoption->getRoworder();
|
|
|
|
$tboptions[$roworder]=[
|
|
"id"=>$questoption->getId(),
|
|
"code"=>$questoption->getCode(),
|
|
"roworder"=>$questoption->getRoworder(),
|
|
"name"=>$questoption->getName(),
|
|
"required"=>$questoption->getRequired(),
|
|
"type"=>$questoption->getType(),
|
|
"parameters"=>implode(";",$questoption->getParameters()),
|
|
];
|
|
}
|
|
|
|
$jsonquestoptions="[";
|
|
$i=0;
|
|
foreach($tboptions as $option) {
|
|
if($i>0) $jsonquestoptions.=",";
|
|
$jsonquestoptions.=json_encode($option);
|
|
$i++;
|
|
|
|
}
|
|
$jsonquestoptions.="]";
|
|
$quest->setJsonquestoptions($jsonquestoptions);
|
|
|
|
// Construction de la chaine jsonquestguests
|
|
$questguests=$em->getRepository("App:Questguest")->findBy(["quest"=>$quest],["email"=>"ASC"]);
|
|
$tbquestguests=[];
|
|
foreach($questguests as $questguest) {
|
|
array_push($tbquestguests,$questguest->getEmail());
|
|
}
|
|
$quest->setJsonquestguests(json_encode($tbquestguests));
|
|
|
|
$flow->bind($quest);
|
|
$form = $flow->createForm();
|
|
|
|
$return = $this->edit($flow,$form,$quest);
|
|
if($return) return $this->redirect($this->generateUrl('app_quest'));
|
|
|
|
return $this->render('Quest/edit.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
'form' => $form->createView(),
|
|
'flow' => $flow,
|
|
'quest' => $quest,
|
|
'id' => $id,
|
|
]);
|
|
}
|
|
|
|
private function edit(CreateQuestFlow &$flow,&$form,$quest)
|
|
{
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
// On s'assure que le quest appartient bien à l'utilisateur
|
|
if($this->getUser()!=$quest->getUser()) {
|
|
return $this->redirect($this->generateUrl('app_quest'));
|
|
}
|
|
|
|
if ($flow->isValid($form)) {
|
|
// Controle de validité étape questoptions
|
|
if($flow->getCurrentStepNumber()=="2") {
|
|
$data=$form->getData();
|
|
|
|
$jsonquestoptions=$data->getJsonquestoptions();
|
|
if(!$jsonquestoptions||$jsonquestoptions=="[]") {
|
|
$form->addError(new FormError("Votre enquête doit comporter au minimum une question"));
|
|
}
|
|
|
|
$fgerrname=false;
|
|
$fgerrrequired=false;
|
|
$fgerrtype=false;
|
|
$fgerrparameters=false;
|
|
$json=json_decode($jsonquestoptions);
|
|
foreach($json as $option) {
|
|
if($option->name==""&&!$fgerrname) {
|
|
$fgerrname=true;
|
|
$form->addError(new FormError("Les intitulés de question sont obligatoire"));
|
|
}
|
|
if($option->required==""&&!$fgerrrequired) {
|
|
$fgerrrequired=true;
|
|
$form->addError(new FormError("Vous devez préciser si les questions sont obligatoire ou non"));
|
|
}
|
|
if($option->type==""&&!$fgerrtype) {
|
|
$fgerrtype=true;
|
|
$form->addError(new FormError("Vous devez préciser si le type sur l'ensemble des questions"));
|
|
}
|
|
if($option->type=="110"&&$option->parameters==""&&!$fgerrparameters) {
|
|
$fgerrparameters=true;
|
|
$form->addError(new FormError("Vous devez préciser les valeurs de choix sur l'ensemble des questions de type choix"));
|
|
}
|
|
|
|
}
|
|
|
|
$errors = $form->getErrors();
|
|
foreach( $errors as $error ) {
|
|
$this->get('session')->getFlashBag()->add("error", $error->getMessage());
|
|
}
|
|
}
|
|
|
|
// Controle de validité étape questguests
|
|
if($flow->getCurrentStepNumber()=="3") {
|
|
$data=$form->getData();
|
|
|
|
if($quest->getPrivate()) {
|
|
$jsonquestguests=$data->getJsonquestguests();
|
|
if(!$jsonquestguests||$jsonquestguests=="[]") {
|
|
$form->addError(new FormError("Votre enquête doit comporter au minimum un invité"));
|
|
}
|
|
|
|
$errors = $form->getErrors();
|
|
foreach( $errors as $error ) {
|
|
$this->get('session')->getFlashBag()->add("error", $error->getMessage());
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
if($form->isValid($form)) {
|
|
$flow->saveCurrentStepData($form);
|
|
|
|
if ($flow->nextStep()) {
|
|
$form = $flow->createForm();
|
|
} else {
|
|
// Sauvegarde du sondage
|
|
$em->persist($quest);
|
|
|
|
// Sauvegarde des questoptions
|
|
$data=$form->getData();
|
|
$jsonquestoptions=json_decode($data->getJsonquestoptions());
|
|
$tbquestoptions=[];
|
|
foreach($jsonquestoptions as $option) {
|
|
$questoption=$em->getRepository("App:Questoption")->findOneBy(["code"=>$option->code,"quest"=>$quest]);
|
|
if(!$questoption) {
|
|
$questoption=new Questoption();
|
|
$questoption->setCode($option->code);
|
|
$questoption->setQuest($quest);
|
|
$questoption->setName($option->name);
|
|
$questoption->setRoworder($option->roworder);
|
|
$questoption->setRequired($option->required);
|
|
$questoption->setType($option->type);
|
|
$questoption->setParameters(explode(";",$option->parameters));
|
|
$em->persist($questoption);
|
|
}
|
|
}
|
|
|
|
// Sauvegarde des invités
|
|
if($quest->getPrivate()) {
|
|
$data=$form->getData();
|
|
$jsonquestguest=json_decode($data->getJsonquestguests());
|
|
$tbquestguests=[];
|
|
|
|
// On ajoute le propriétaire du sondage en tant qu'invité si ce n'est pas le cas
|
|
if(!in_array($this->getUser()->getEmail(),$jsonquestguest)) array_push($jsonquestguest,$this->getUser()->getEmail());
|
|
|
|
foreach($jsonquestguest as $email) {
|
|
array_push($tbquestguests,$email);
|
|
$user=$em->getRepository("App:User")->findOneBy(["email"=>$email]);
|
|
|
|
$questguest=$em->getRepository("App:Questguest")->findOneBy(["email"=>$email,"quest"=>$quest]);
|
|
if(!$questguest) {
|
|
$key = Uuid::uuid4();
|
|
$displayname=$email;
|
|
$tonotifyquestguest=true;
|
|
if($user) {
|
|
$displayname=$user->getDisplayname();
|
|
$tonotifyquestguest=($user!=$this->getUser());
|
|
}
|
|
|
|
$questguest=new Questguest();
|
|
$questguest->setEmail($email);
|
|
$questguest->setDisplayname($displayname);
|
|
$questguest->setKey($key);
|
|
$questguest->setQuest($quest);
|
|
$questguest->setTonotifyguest($tonotifyquestguest);
|
|
$questguest->setTonotifyowner(false);
|
|
}
|
|
$questguest->setUser($user);
|
|
$em->persist($questguest);
|
|
|
|
}
|
|
|
|
// Suppression des invités obsolète
|
|
$questguests=$quest->getQuestguests();
|
|
foreach($questguests as $questguest) {
|
|
if(!in_array($questguest->getEmail(),$tbquestguests)) {
|
|
$em->remove($questguest);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
// On ajoute qu'il arrive le propriétaire en tant qu'invité
|
|
$questguest=$em->getRepository("App:Questguest")->findOneBy(["email"=>$this->getUser()->getEmail(),"quest"=>$quest]);
|
|
if(!$questguest) {
|
|
$key = Uuid::uuid4();
|
|
$questguest=new Questguest();
|
|
$questguest->setEmail($this->getUser()->getEmail());
|
|
$questguest->setDisplayname($this->getUser()->getDisplayname());
|
|
$questguest->setKey($key);
|
|
$questguest->setQuest($quest);
|
|
$questguest->setTonotifyguest(false);
|
|
$questguest->setTonotifyowner(false);
|
|
}
|
|
$questguest->setUser($this->getUser());
|
|
$em->persist($questguest);
|
|
}
|
|
|
|
$em->flush();
|
|
$flow->reset();
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public function delete($id,Request $request)
|
|
{
|
|
// Initialisation de l'enregistrement
|
|
$em = $this->getDoctrine()->getManager();
|
|
$quest=$em->getRepository("App:Quest")->find($id);
|
|
|
|
// On s'assure que le quest appartient bien à l'utilisateur
|
|
if($this->getUser()!=$quest->getUser()) {
|
|
return $this->redirect($this->generateUrl('app_quest'));
|
|
}
|
|
|
|
// Suppression
|
|
$em->remove($quest);
|
|
$em->flush();
|
|
|
|
return $this->redirect($this->generateUrl('app_quest'));
|
|
}
|
|
|
|
public function closeopen($id,$status,Request $request) {
|
|
// Initialisation de l'enregistrement
|
|
$em = $this->getDoctrine()->getManager();
|
|
$quest=$em->getRepository("App:Quest")->find($id);
|
|
|
|
// On s'assure que le quest appartient bien à l'utilisateur
|
|
if($this->getUser()!=$quest->getUser()) {
|
|
return $this->redirect($this->generateUrl('app_quest'));
|
|
}
|
|
|
|
$modalclose=false;
|
|
$quest->setStatus($status);
|
|
|
|
if($status==1) {
|
|
$quest->setTonotifyclose(true);
|
|
$quest->setTonotifymessage("Bonjour,<br><br>L'enquête suivante est à présent close : <b>".$quest->getTitle()."</b><br><br>Merci de votre réponse.<br><br>Vous pouvez consulter les résultats de l'enquête via le lien ci-après: <a href='#LINK#'>accéder au résultat de l'enquête</a><br><br>Cordialement<br>".$quest->getUser()->getDisplayname());
|
|
}
|
|
else {
|
|
$quest->setTonotifyopen(true);
|
|
$quest->setTonotifymessage("Bonjour,<br><br>L'enquête suivante est à présent réouverte: <b>".$quest->getTitle()."</b><br><br>Vous pouvez de nouveau modifier vos réponses via le lien ci-après: <a href='#LINK#'>accéder à l'enquête</a>.<br><br>Cordialement<br>".$quest->getUser()->getDisplayname());
|
|
}
|
|
|
|
// Création du formulaire
|
|
$form = $this->createForm(QueststatusType::class,$quest,array("status"=>$status));
|
|
|
|
// Récupération des data du formulaire
|
|
$form->handleRequest($request);
|
|
|
|
// Sur validation
|
|
if ($form->get('submit')->isClicked() && $form->isValid()) {
|
|
$data = $form->getData();
|
|
|
|
$em->persist($data);
|
|
$em->flush();
|
|
|
|
// Retour à la liste
|
|
$modalclose=true;
|
|
}
|
|
|
|
return $this->render('Quest/status.html.twig',[
|
|
'useheader' => false,
|
|
'usesidebar' => false,
|
|
'form' => $form->createView(),
|
|
'modalclose' => $modalclose,
|
|
]);
|
|
}
|
|
|
|
public function byuserkey($key,Request $request)
|
|
{
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
// Recherche de l'utilisateur dans le sondage
|
|
$questguest = $em->getRepository("App:Questguest")->findOneBy(["quest"=>$key,"user"=>$this->getUser()]);
|
|
if(!$questguest) {
|
|
return $this->render('Response/nokey.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
]);
|
|
}
|
|
|
|
$return = $this->questvote($request,$form,$questguest,"byuserkey");
|
|
if($return) return $this->redirect($this->generateUrl('app_quest'));
|
|
|
|
return $this->render('Response/questvote.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
'questguest' => $questguest,
|
|
'form' => $form->createView(),
|
|
'by' => "byuserkey",
|
|
]);
|
|
}
|
|
|
|
public function byguestkey($key,Request $request)
|
|
{
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
// Recherche de la clé d'invitation
|
|
$questguest = $em->getRepository("App:Questguest")->findOneBy(["key"=>$key]);
|
|
|
|
if(!$questguest) {
|
|
return $this->render('Response/nokey.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
]);
|
|
}
|
|
|
|
$this->questvote($request,$form,$questguest,"byguestkey");
|
|
|
|
return $this->render('Response/questvote.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
'questguest' => $questguest,
|
|
'form' => $form->createView(),
|
|
'by' => "byguestkey",
|
|
]);
|
|
}
|
|
|
|
public function byquestkey($key,Request $request)
|
|
{
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
// Recherche de la clé d'invitation
|
|
$quest = $em->getRepository("App:Quest")->findOneBy(["key"=>$key]);
|
|
if(!$quest) {
|
|
return $this->render('Response/nokey.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
]);
|
|
}
|
|
|
|
// S'assurer que le sondage est public
|
|
if($quest->getPrivate()) {
|
|
return $this->render('Response/nokey.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
]);
|
|
}
|
|
|
|
// Si la personne est déjà connectée : on génère une invitation et on le redirige via un accès user
|
|
if($this->getUser()) {
|
|
$questguest = $em->getRepository("App:Questguest")->findOneBy(["quest"=>$quest,"user"=>$this->getUser()]);
|
|
if(!$questguest) {
|
|
$key = Uuid::uuid4();
|
|
$email=$this->getUser()->getEmail();
|
|
$displayname=$this->getUser()->getDisplayname();
|
|
$tonotifyquestguest=true;
|
|
|
|
$questguest=new Questguest();
|
|
$questguest->setEmail($email);
|
|
$questguest->setDisplayname($displayname);
|
|
$questguest->setKey($key);
|
|
$questguest->setQuest($quest);
|
|
$questguest->setTonotifyguest($tonotifyquestguest);
|
|
$questguest->setTonotifyowner(false);
|
|
$questguest->setUser($this->getUser());
|
|
$em->persist($questguest);
|
|
$em->flush();
|
|
}
|
|
|
|
return $this->redirect($this->generateUrl('app_quest_byuserkey',["key"=>$quest->getId()]));
|
|
}
|
|
|
|
|
|
// Initialisation de l'enregistrement
|
|
$data = new Questguest();
|
|
|
|
// Création du formulaire
|
|
$form = $this->createForm(QuestkeyType::class,$data);
|
|
|
|
// Récupération des data du formulaire
|
|
$form->handleRequest($request);
|
|
|
|
// S'assurer que la personne n'a pas déjà voté
|
|
// Si c'est le cas il ne devrait plus utiliser cette url
|
|
// On lui retourne l'url associé à son questvote
|
|
if ($form->get('submit')->isClicked()) {
|
|
$data = $form->getData();
|
|
$email=$data->getEmail();
|
|
$questguest=$em->getRepository("App:Questguest")->findOneBy(["quest"=>$quest,"email"=>$email]);
|
|
if($questguest) {
|
|
$questguest->setTonotifyguest(true);
|
|
$em->persist($questguest);
|
|
$em->flush();
|
|
|
|
// Initialiser l'erreur
|
|
$form->addError(new FormError("Une personne a déjà utiliser ce mail pour répondre au sondage.<br>Si vous êtes cette personne vous allez recevoir un mail vous indiquant l'url d'accès pour modifier ou visualiser votre réponse"));
|
|
$this->get('session')->getFlashBag()->clear();
|
|
$errors = $form->getErrors();
|
|
foreach( $errors as $error ) {
|
|
$request->getSession()->getFlashBag()->add("error", $error->getMessage());
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($form->get('submit')->isClicked()&&$form->isValid()) {
|
|
$user=$em->getRepository("App:User")->findOneBy(["email"=>$email]);
|
|
|
|
$questguest=$em->getRepository("App:Questguest")->findOneBy(["email"=>$email,"quest"=>$quest]);
|
|
if(!$questguest) {
|
|
$key = Uuid::uuid4();
|
|
$displayname=$data->getDisplayname();
|
|
$tonotifyquestguest=true;
|
|
|
|
$questguest=new Questguest();
|
|
$questguest->setEmail($email);
|
|
$questguest->setDisplayname($displayname);
|
|
$questguest->setKey($key);
|
|
$questguest->setQuest($quest);
|
|
$questguest->setTonotifyguest($tonotifyquestguest);
|
|
$questguest->setTonotifyowner(false);
|
|
}
|
|
$questguest->setUser($user);
|
|
$em->persist($questguest);
|
|
$em->flush();
|
|
|
|
return $this->redirect($this->generateUrl('app_quest_byguestkey',["key"=>$questguest->getKey()]));
|
|
}
|
|
|
|
return $this->render('Quest/byquestkey.html.twig',[
|
|
'useheader' => false,
|
|
'usesidebar' => false,
|
|
'quest' => $quest,
|
|
'key' => $key,
|
|
'form' => $form->createView(),
|
|
]);
|
|
}
|
|
|
|
public function byloginkey($key,Request $request) {
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
// Recherche de la clé d'invitation
|
|
$quest = $em->getRepository("App:Quest")->findOneBy(["key"=>$key]);
|
|
if(!$quest) {
|
|
return $this->render('Response/nokey.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
]);
|
|
}
|
|
|
|
// S'assurer que le sondage est public
|
|
if($quest->getPrivate()) {
|
|
return $this->render('Response/nokey.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
]);
|
|
}
|
|
|
|
// Si la personne est déjà connectée : on génère une invitation et on le redirige via un accès user
|
|
if($this->getUser()) {
|
|
$questguest = $em->getRepository("App:Questguest")->findOneBy(["quest"=>$quest,"user"=>$this->getUser()]);
|
|
if(!$questguest) {
|
|
$key = Uuid::uuid4();
|
|
$email=$this->getUser()->getEmail();
|
|
$displayname=$this->getUser()->getDisplayname();
|
|
$tonotifyquestguest=true;
|
|
|
|
$questguest=new Questguest();
|
|
$questguest->setEmail($email);
|
|
$questguest->setDisplayname($displayname);
|
|
$questguest->setKey($key);
|
|
$questguest->setQuest($quest);
|
|
$questguest->setTonotifyguest($tonotifyquestguest);
|
|
$questguest->setTonotifyowner(false);
|
|
$questguest->setUser($this->getUser());
|
|
$em->persist($questguest);
|
|
$em->flush();
|
|
}
|
|
|
|
return $this->redirect($this->generateUrl('app_quest_byuserkey',["key"=>$quest->getId()]));
|
|
}
|
|
|
|
return $this->render('Response/nokey.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
]);
|
|
}
|
|
|
|
private function questvote(&$request,&$form,&$questguest,$by) {
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
// Construction de la chaine jsonquestvotes
|
|
$questoptions=$em->getRepository("App:Questoption")->findBy(["quest"=>$questguest->getQuest()],["roworder"=>"ASC"]);
|
|
$tbquestvotes=[];
|
|
foreach($questoptions as $questoption) {
|
|
$code=$questoption->getCode();
|
|
$type=$questoption->getType();
|
|
|
|
if(!array_key_exists($code,$tbquestvotes)) {
|
|
$tbquestvotes[$code]=["code"=>$code,"val"=>"","type"=>$type];
|
|
}
|
|
|
|
$questvote=$em->getRepository("App:Questvote")->findOneBy(["questguest"=>$questguest,"questoption"=>$questoption]);
|
|
if($questvote)
|
|
$tbquestvotes[$code]["val"]=(!is_null($questvote->getVote())?$questvote->getVote():"");
|
|
}
|
|
|
|
$jsonquestvotes="[";
|
|
$i=0;
|
|
foreach($tbquestvotes as $questvote) {
|
|
if($i>0) $jsonquestvotes.=",";
|
|
$jsonquestvotes.=json_encode($questvote);
|
|
$i++;
|
|
|
|
}
|
|
$jsonquestvotes.="]";
|
|
$questguest->setJsonquestvotes($jsonquestvotes);
|
|
|
|
// Création du formulaire
|
|
$form = $this->createForm(QuestguestType::class,$questguest,["status"=>$questguest->getQuest()->getStatus()]);
|
|
|
|
// Récupération des data du formulaire
|
|
$form->handleRequest($request);
|
|
|
|
// Si validation
|
|
if($questguest->getQuest()->getStatus()==0) {
|
|
if ($form->get('submit')->isClicked() && $form->isValid()) {
|
|
$data=$form->getData();
|
|
$jsonquestvotes=json_decode($data->getJsonquestvotes());
|
|
|
|
foreach($jsonquestvotes as $toquestvote) {
|
|
$questoption=$em->getRepository("App:Questoption")->findOneBy(["quest"=>$questguest->getQuest(),"code"=>$toquestvote->code]);
|
|
if($questoption) {
|
|
$questvote=$em->getRepository("App:Questvote")->findOneBy(["questguest"=>$questguest,"questoption"=>$questoption]);
|
|
if(!$questvote) {
|
|
$questvote= new Questvote();
|
|
$questvote->setQuestguest($questguest);
|
|
$questvote->setQuestoption($questoption);
|
|
}
|
|
|
|
$questvote->setVote($toquestvote->val==""?null:$toquestvote->val);
|
|
$em->persist($questvote);
|
|
$em->flush();
|
|
}
|
|
}
|
|
|
|
// Si le questvote n'est pas celui du propriétaire : on positionne le flag de notification du owner
|
|
if($questguest->getUser()!=$questguest->getQuest()->getUser()) {
|
|
$questguest->setTonotifyowner(true);
|
|
$em->persist($questvote);
|
|
$em->flush();
|
|
}
|
|
|
|
if($by=="byuserkey") return true;
|
|
$this->get('session')->getFlashBag()->add("notice", "Votre réponse a bien été prise en compte.<br>Vous pouvez à tout moment modifier vos réponses via le lien qui vous a été transmis par mail.");
|
|
}
|
|
}
|
|
else
|
|
$this->get('session')->getFlashBag()->add("notice", "Cette enquête est close");
|
|
|
|
return false;
|
|
}
|
|
|
|
public function result($id,Request $request,$access="") {
|
|
// Type pdf / css
|
|
$type=$request->get('type');
|
|
if($access!="") $type="";
|
|
|
|
$em = $this->getDoctrine()->getManager();
|
|
$quest=$em->getRepository("App:Quest")->find($id);
|
|
$questguests=$em->getRepository("App:Questguest")->findBy(["quest"=>$quest]);
|
|
$questoptions=$em->getRepository("App:Questoption")->findBy(["quest"=>$quest],["roworder"=>"ASC"]);
|
|
|
|
// On s'assure que le quest appartient bien à l'utilisateur
|
|
if($this->getUser()!=$quest->getUser()&&$access=="") {
|
|
return $this->redirect($this->generateUrl('app_quest'));
|
|
}
|
|
|
|
$graphs=[];
|
|
$tbcolor=array("red"=>"#CF000F","green"=>"#3FC380","blue"=>"#446CB3","orange"=>"#F89406");
|
|
foreach($questoptions as $option) {
|
|
$questvotes=$option->getQuestvotes();
|
|
if(!empty($questvotes)) {
|
|
// Initialisation du tableau de données consolidées
|
|
switch($option->getType()) {
|
|
// type = oui / non
|
|
case 10:
|
|
$tmp=[];
|
|
$tmp["datacode"]=$option->getCode();
|
|
$tmp["dataname"]=$option->getName();
|
|
$tmp["datatype"]="donut";
|
|
$tmp["data"]=[
|
|
0 => ["total"=>0,"label"=>"non","color"=>$tbcolor["red"]],
|
|
1 => ["total"=>0,"label"=>"oui","color"=>$tbcolor["green"]],
|
|
];
|
|
|
|
$graphs[$option->getRoworder()]=$tmp;
|
|
break;
|
|
|
|
// Type oui / non=0 / peut-être
|
|
// Type oui / non=0 / en partie
|
|
case 20:
|
|
case 30:
|
|
$tmp=[];
|
|
$tmp["datacode"]=$option->getCode();
|
|
$tmp["dataname"]=$option->getName();
|
|
$tmp["datatype"]="donut";
|
|
$tmp["data"]=[
|
|
0 => ["total"=>0,"label"=>"non","color"=>$tbcolor["red"]],
|
|
1 => ["total"=>0,"label"=>"oui","color"=>$tbcolor["green"]],
|
|
2 => ["total"=>0,"label"=>($option->getType()=="20"?"peut-être":"en partie"),"color"=>$tbcolor["orange"]],
|
|
];
|
|
$graphs[$option->getRoworder()]=$tmp;
|
|
break;
|
|
|
|
// Type = Très Satisfait / Satisfait / Peu Satisfait /Insatisfait
|
|
case 40:
|
|
case 50:
|
|
$tmp=[];
|
|
$tmp["datacode"]=$option->getCode();
|
|
$tmp["dataname"]=$option->getName();
|
|
$tmp["datatype"]="donut";
|
|
$tmp["data"]=[
|
|
0 => ["total"=>0,"label"=>"Très Satisfait","color"=>$tbcolor["green"]],
|
|
1 => ["total"=>0,"label"=>"Satisfait","color"=>$tbcolor["blue"]],
|
|
2 => ["total"=>0,"label"=>"Peu Satisfait","color"=>$tbcolor["orange"]],
|
|
3 => ["total"=>0,"label"=>"Insatisfait","color"=>$tbcolor["red"]]
|
|
];
|
|
$graphs[$option->getRoworder()]=$tmp;
|
|
break;
|
|
|
|
// Type Note
|
|
case 60:
|
|
case 70:
|
|
case 80:
|
|
switch($option->getType()) {
|
|
case 60:$datamax=5; break;
|
|
case 70:$datamax=10; break;
|
|
case 80:$datamax=20; break;
|
|
}
|
|
$tmp=[];
|
|
$tmp["datacode"]=$option->getCode();
|
|
$tmp["dataname"]=$option->getName();
|
|
$tmp["datatype"]="average";
|
|
$tmp["datamax"]=$datamax;
|
|
$tmp["data"]=["total"=>0,"count"=>0];
|
|
$graphs[$option->getRoworder()]=$tmp;
|
|
break;
|
|
|
|
// Type = Très Satisfait / Satisfait / Peu Satisfait /Insatisfait
|
|
case 110:
|
|
$tmp=[];
|
|
$tmp["datacode"]=$option->getCode();
|
|
$tmp["dataname"]=$option->getName();
|
|
$tmp["datatype"]="donut";
|
|
$tmp["data"]=[];
|
|
foreach($option->getParameters() as $parameter) {
|
|
$tmp["data"][$parameter] = ["total"=>0,"label"=>$parameter,"color"=>('#'.substr(str_shuffle('ABCDEF0123456789'),0,6))];
|
|
}
|
|
$graphs[$option->getRoworder()]=$tmp;
|
|
break;
|
|
}
|
|
|
|
// Cumule des réponses
|
|
foreach($questvotes as $vote) {
|
|
$val=explode("||||",$vote->getVote())[0];
|
|
switch($option->getType()) {
|
|
// Type donut
|
|
case 10:
|
|
case 20:
|
|
case 30:
|
|
case 40:
|
|
case 50:
|
|
case 110;
|
|
$graphs[$option->getRoworder()]["data"][$val]["total"]++;
|
|
break;
|
|
|
|
// Type Moyenne
|
|
case 60:
|
|
case 70:
|
|
case 80:
|
|
$graphs[$option->getRoworder()]["data"]["total"]+=$val;
|
|
$graphs[$option->getRoworder()]["data"]["count"]++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if($type=="pdf") {
|
|
$rootdir = $this->appKernel->getProjectDir();
|
|
$filename="Enquete-".str_pad($id,5,"0",STR_PAD_LEFT).".pdf";
|
|
$fileloc=$rootdir."/uploads/quest/$id/".$filename;
|
|
|
|
$fs = new Filesystem();
|
|
$fs->remove(array($fileloc));
|
|
|
|
$render = $this->renderView('Quest/result.html.twig',[
|
|
'useheader' => false,
|
|
'usesidebar' => false,
|
|
'sondeUse' => false,
|
|
'quest' => $quest,
|
|
'questguests' => $questguests,
|
|
'graphs' => $graphs,
|
|
'type' => $type,
|
|
'access' => $access,
|
|
]);
|
|
|
|
$render=str_replace("/ninesurvey/","https://ninegate.ac-arno.fr/ninesurvey/",$render);
|
|
$this->knpSnappy->generateFromHtml($render,$fileloc);
|
|
return $this->file($fileloc);
|
|
}
|
|
elseif($type=="csv") {
|
|
$rootdir = $this->appKernel->getProjectDir()."/uploads/quest/$id";
|
|
$filename="Enquete-".str_pad($id,5,"0",STR_PAD_LEFT).".csv";
|
|
$fs = new Filesystem();
|
|
$fs->mkdir($rootdir);
|
|
$csvh = fopen($rootdir."/".$filename, 'w');
|
|
$d = ';'; // this is the default but i like to be explicit
|
|
$e = '"'; // this is the default but i like to be explicit
|
|
|
|
$data=["id","Login","Nom","Prénom","Email","Téléphone"];
|
|
fputcsv($csvh, $data, $d, $e);
|
|
fclose($csvh);
|
|
$response = new BinaryFileResponse($rootdir."/".$filename);
|
|
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);
|
|
return $response;
|
|
}
|
|
else {
|
|
return $this->render('Quest/result.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
'quest' => $quest,
|
|
'questguests' => $questguests,
|
|
'graphs' => $graphs,
|
|
'access' => $access,
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function resultbyguestkey($key,Request $request)
|
|
{
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
// Recherche de la clé d'invitation
|
|
$questguest = $em->getRepository("App:Questguest")->findOneBy(["key"=>$key]);
|
|
|
|
if(!$questguest) {
|
|
return $this->render('Response/nokey.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
]);
|
|
}
|
|
//return new Response();
|
|
return $this->result($questguest->getQuest()->getId(),$request,"byguestkey");
|
|
}
|
|
|
|
|
|
public function resultbyuserkey($key,Request $request)
|
|
{
|
|
$em = $this->getDoctrine()->getManager();
|
|
|
|
// Recherche de l'utilisateur dans le sondage
|
|
$questguest = $em->getRepository("App:Questguest")->findOneBy(["quest"=>$key,"user"=>$this->getUser()]);
|
|
if(!$questguest) {
|
|
return $this->render('Response/nokey.html.twig',[
|
|
'useheader' => true,
|
|
'usesidebar' => false,
|
|
]);
|
|
}
|
|
|
|
//return new Response();
|
|
return $this->result($questguest->getQuest()->getId(),$request,"byuserkey");
|
|
}
|
|
}
|