1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/limesurvey_ynh.git synced 2024-09-03 19:36:32 +02:00
limesurvey_ynh/sources/application/controllers/admin/quotas.php

562 lines
22 KiB
PHP

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
* LimeSurvey
* Copyright (C) 2007-2011 The LimeSurvey Project Team / Carsten Schmitz
* All rights reserved.
* License: GNU/GPL License v2 or later, see LICENSE.php
* LimeSurvey is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*
*/
/**
* Quotas Controller
*
* This controller performs quota actions
*
* @package LimeSurvey
* @subpackage Backend
*/
class quotas extends Survey_Common_Action
{
function __construct($controller, $id)
{
parent::__construct($controller, $id);
// Load helpers
Yii::app()->loadHelper('surveytranslator');
// Sanitize/get globals/variables
$_POST['quotamax'] = sanitize_int(Yii::app()->request->getPost('quotamax'));
if (empty($_POST['autoload_url']))
{
$_POST['autoload_url'] = 0;
}
if (empty($_POST['quota_limit']) || !is_numeric(Yii::app()->request->getPost('quota_limit')) || Yii::app()->request->getPost('quota_limit') < 0)
{
$_POST['quota_limit'] = 0;
}
}
private function _getData($iSurveyId)
{
// Set the variables in an array
$aData['iSurveyId'] = $aData['surveyid'] = $iSurveyId;
$aData['clang'] = $this->getController()->lang;
$aData['sBaseLang'] = Survey::model()->findByPk($iSurveyId)->language;
$aData['aLangs'] = Survey::model()->findByPk($iSurveyId)->additionalLanguages;
array_unshift($aData['aLangs'], $aData['sBaseLang']);
$aData['action'] = $action = Yii::app()->request->getParam('action');
if (!isset($action))
$aData['action'] = 'quotas';
return $aData;
}
private function _checkPermissions($iSurveyId, $sPermission)
{
$clang=$this->getController()->lang;
if (!empty($sPermission) && !(Permission::model()->hasSurveyPermission($iSurveyId, 'quotas', $sPermission))) {
Yii::app()->session['flashmessage'] = $clang->gT('Access denied!');
$this->_redirectToIndex($iSurveyId);
}
}
function _redirectToIndex($iSurveyId)
{
$clang=$this->getController()->lang;
if(Permission::model()->hasSurveyPermission($iSurveyId, 'quotas','read'))
{
$this->getController()->redirect($this->getController()->createUrl("/admin/quotas/sa/index/surveyid/$iSurveyId"));
}
else
{
Yii::app()->session['flashmessage'] = $clang->gT('Access denied!');
$this->getController()->redirect($this->getController()->createUrl("admin/survey/sa/view/surveyid/$iSurveyId"));
}
}
function index($iSurveyId, $quickreport = false)
{
$iSurveyId = sanitize_int($iSurveyId);
$this->_checkPermissions($iSurveyId, 'read');
$aData = $this->_getData($iSurveyId);
$aViewUrls = array();
if ($quickreport == false)
{
$aViewUrls[] = 'viewquotas_view';
}
$clang = $aData['clang'];
$totalquotas = 0;
$totalcompleted = 0;
$csvoutput = array();
$criteria = new CDbCriteria;
$criteria->select = '*';
$criteria->join = 'LEFT JOIN {{quota_languagesettings}} as qls ON (t.id = qls.quotals_quota_id)';
$criteria->condition = 'sid=:survey AND quotals_language=:lang';
$criteria->params = array(':survey' => $iSurveyId, ':lang' => $aData['sBaseLang']);
$criteria->order = 'name';
$aResult = Quota::model()->findAll($criteria);
//if there are quotas let's proceed
if (count($aResult) > 0)
{
$aViewUrls['output'] = '';
//loop through all quotas
foreach ($aResult as $aQuotaListing)
{
$totalquotas += $aQuotaListing['qlimit'];
$completed = getQuotaCompletedCount($iSurveyId, $aQuotaListing['id']);
$highlight = ($completed >= $aQuotaListing['qlimit']) ? '' : "style='color: orange'"; //Incomplete quotas displayed in red
$totalcompleted = $totalcompleted + $completed;
$csvoutput[] = $aQuotaListing['name'] . "," . $aQuotaListing['qlimit'] . "," . $completed . "," . ($aQuotaListing['qlimit'] - $completed) . "\r\n";
if ($quickreport != false)
{
continue;
}
$aData['quotalisting'] = $aQuotaListing;
$aData['highlight'] = $highlight;
$aData['completed'] = $completed;
$aData['totalquotas'] = $totalquotas;
$aData['totalcompleted'] = $totalcompleted;
$aViewUrls['output'] .= $this->getController()->renderPartial("/admin/quotas/viewquotasrow_view", $aData, true);
//check how many sub-elements exist for a certain quota
$aResults2 = QuotaMember::model()->findAllByAttributes(array('quota_id' => $aQuotaListing['id']));
//loop through all sub-parts
foreach ($aResults2 as $aQuotaQuestions)
{
$aQuestionAnswers = self::getQuotaAnswers($aQuotaQuestions['qid'], $iSurveyId, $aQuotaListing['id']);
$aData['question_answers'] = $aQuestionAnswers;
$aData['quota_questions'] = $aQuotaQuestions;
$aViewUrls['output'] .= $this->getController()->renderPartial('/admin/quotas/viewquotasrowsub_view', $aData, true);
}
}
}
else
{
// No quotas have been set for this survey
$aViewUrls[] = 'viewquotasempty_view';
}
$aData['totalquotas'] = $totalquotas;
$aData['totalcompleted'] = $totalcompleted;
if ($quickreport == false)
{
$aViewUrls[] = 'viewquotasfooter_view';
$this->_renderWrappedTemplate('quotas', $aViewUrls, $aData);
}
else
{
header("Content-Disposition: attachment; filename=results-survey" . $iSurveyId . ".csv");
header("Content-type: text/comma-separated-values; charset=UTF-8");
header("Pragma: public");
echo $clang->gT("Quota name") . "," . $clang->gT("Limit") . "," . $clang->gT("Completed") . "," . $clang->gT("Remaining") . "\r\n";
foreach ($csvoutput as $line)
{
echo $line;
}
die;
}
}
function insertquota($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$this->_checkPermissions($iSurveyId, 'create');
$aData = $this->_getData($iSurveyId);
$aLangs = $aData['aLangs'];
$oQuota = new Quota;
$oQuota->sid = $iSurveyId;
$oQuota->name = Yii::app()->request->getPost('quota_name');
$oQuota->qlimit = Yii::app()->request->getPost('quota_limit');
$oQuota->action = Yii::app()->request->getPost('quota_action');
$oQuota->autoload_url = Yii::app()->request->getPost('autoload_url');
$oQuota->save();
$iQuotaId = $oQuota->id;
//Iterate through each language, and make sure there is a quota message for it
$sError = '';
foreach ($aLangs as $sLang)
{
if (!$_POST['quotals_message_' . $sLang])
{
$sError .= getLanguageNameFromCode($sLang, false) . "\\n";
}
}
if ($sError != '')
{
$aData['sShowError'] = $sError;
}
else
//All the required quota messages exist, now we can insert this info into the database
{
foreach ($aLangs as $sLang) //Iterate through each language
{
//Clean XSS - Automatically provided by CI input class
$_POST['quotals_message_' . $sLang] = html_entity_decode($_POST['quotals_message_' . $sLang], ENT_QUOTES, "UTF-8");
// Fix bug with FCKEditor saving strange BR types
$_POST['quotals_message_' . $sLang] = fixCKeditorText($_POST['quotals_message_' . $sLang]);
$oQuotaLanguageSettings = new QuotaLanguageSetting;
$oQuotaLanguageSettings->quotals_quota_id = $iQuotaId;
$oQuotaLanguageSettings->quotals_language = $sLang;
$oQuotaLanguageSettings->quotals_name = Yii::app()->request->getPost('quota_name');
$oQuotaLanguageSettings->quotals_message = $_POST['quotals_message_' . $sLang];
$oQuotaLanguageSettings->quotals_url = $_POST['quotals_url_' . $sLang];
$oQuotaLanguageSettings->quotals_urldescrip = $_POST['quotals_urldescrip_' . $sLang];
$oQuotaLanguageSettings->save();
}
}
self::_redirectToIndex($iSurveyId);
}
function modifyquota($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$this->_checkPermissions($iSurveyId, 'update');
$aData = $this->_getData($iSurveyId);
$aLangs = $aData['aLangs'];
$oQuota = Quota::model()->findByPk(Yii::app()->request->getPost('quota_id'));
$oQuota->name = Yii::app()->request->getPost('quota_name');
$oQuota->qlimit = Yii::app()->request->getPost('quota_limit');
$oQuota->action = Yii::app()->request->getPost('quota_action');
$oQuota->autoload_url = Yii::app()->request->getPost('autoload_url');
$oQuota->save();
//Iterate through each language posted, and make sure there is a quota message for it
$sError = '';
foreach ($aLangs as $sLang)
{
if (!$_POST['quotals_message_' . $sLang])
{
$sError.= getLanguageNameFromCode($sLang, false) . "\\n";
}
}
if ($sError != '')
{
$aData['sShowError'] = $sError;
}
else
//All the required quota messages exist, now we can insert this info into the database
{
foreach ($aLangs as $sLang) //Iterate through each language
{
//Clean XSS - Automatically provided by CI
$_POST['quotals_message_' . $sLang] = html_entity_decode($_POST['quotals_message_' . $sLang], ENT_QUOTES, "UTF-8");
// Fix bug with FCKEditor saving strange BR types
$_POST['quotals_message_' . $sLang] = fixCKeditorText($_POST['quotals_message_' . $sLang]);
$oQuotaLanguageSettings = QuotaLanguageSetting::model()->findByAttributes(array('quotals_quota_id' => Yii::app()->request->getPost('quota_id'), 'quotals_language' => $sLang));
$oQuotaLanguageSettings->quotals_name = Yii::app()->request->getPost('quota_name');
$oQuotaLanguageSettings->quotals_message = $_POST['quotals_message_' . $sLang];
$oQuotaLanguageSettings->quotals_url = $_POST['quotals_url_' . $sLang];
$oQuotaLanguageSettings->quotals_urldescrip = $_POST['quotals_urldescrip_' . $sLang];
$oQuotaLanguageSettings->save();
}
} //End insert language based components
self::_redirectToIndex($iSurveyId);
}
function insertquotaanswer($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$this->_checkPermissions($iSurveyId, 'update');
$oQuotaMembers = new QuotaMember('create'); // Trigger the 'create' rules
$oQuotaMembers->sid = $iSurveyId;
$oQuotaMembers->qid = Yii::app()->request->getPost('quota_qid');
$oQuotaMembers->quota_id = Yii::app()->request->getPost('quota_id');
$oQuotaMembers->code = Yii::app()->request->getPost('quota_anscode');
if ($oQuotaMembers->save()) {
if (!empty($_POST['createanother']))
{
$_POST['action'] = "quotas";
$_POST['subaction'] = "new_answer";
$sSubAction = "new_answer";
self::new_answer($iSurveyId, $sSubAction);
}
else
{
self::_redirectToIndex($iSurveyId);
}
} else {
// Save was not successful, redirect back
$_POST['action'] = "quotas";
$_POST['subaction'] = "new_answer";
$sSubAction = "new_answer_two";
self::new_answer($iSurveyId, $sSubAction);
}
}
function delans($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$this->_checkPermissions($iSurveyId, 'update');
QuotaMember::model()->deleteAllByAttributes(array(
'id' => Yii::app()->request->getPost('quota_member_id'),
'qid' => Yii::app()->request->getPost('quota_qid'),
'code' => Yii::app()->request->getPost('quota_anscode'),
));
self::_redirectToIndex($iSurveyId);
}
function delquota($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$this->_checkPermissions($iSurveyId, 'delete');
Quota::model()->deleteByPk(Yii::app()->request->getPost('quota_id'));
QuotaLanguageSetting::model()->deleteAllByAttributes(array('quotals_quota_id' => Yii::app()->request->getPost('quota_id')));
QuotaMember::model()->deleteAllByAttributes(array('quota_id' => Yii::app()->request->getPost('quota_id')));
self::_redirectToIndex($iSurveyId);
}
function editquota($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$this->_checkPermissions($iSurveyId, 'update');
$aData = $this->_getData($iSurveyId);
$aLangs = $aData['aLangs'];
$clang = $aData['clang'];
$aViewUrls = array();
$aQuotaInfo = Quota::model()->findByPk(Yii::app()->request->getPost('quota_id'));
$aData['quotainfo'] = $aQuotaInfo;
$first=true;
foreach ($aLangs as $sLanguage)
{
$aTabTitles[$sLanguage] = getLanguageNameFromCode($sLanguage, false);
if ($first)
{
$aTabTitles[$sLanguage].= ' (' . $clang->gT("Base language") . ')';
$first = false;
}
$aData['langquotainfo'] = QuotaLanguageSetting::model()->findByAttributes(array('quotals_quota_id' => Yii::app()->request->getPost('quota_id'), 'quotals_language' => $sLanguage));
$aData['lang'] = $sLanguage;
$aTabContents[$sLanguage] = $this->getController()->renderPartial('/admin/quotas/editquotalang_view', $aData, true);
}
$aData['aTabTitles']=$aTabTitles;
$aData['aTabContents']=$aTabContents;
$aViewUrls[] = 'editquota_view';
$this->_renderWrappedTemplate('quotas', $aViewUrls, $aData);
}
function new_answer($iSurveyId, $sSubAction = 'new_answer')
{
$iSurveyId = sanitize_int($iSurveyId);
$this->_checkPermissions($iSurveyId, 'update');
$aData = $this->_getData($iSurveyId);
$sBaseLang = $aData['sBaseLang'];
$clang = $aData['clang'];
$aViewUrls = array();
if (($sSubAction == "new_answer" || ($sSubAction == "new_answer_two" && !isset($_POST['quota_qid']))) && Permission::model()->hasSurveyPermission($iSurveyId, 'quotas', 'create'))
{
$result = Quota::model()->findAllByPk(Yii::app()->request->getPost('quota_id'));
foreach ($result as $aQuotaDetails)
{
$quota_name = $aQuotaDetails['name'];
}
$result = Question::model()->findAllByAttributes(array('type' => array('G', 'M', 'Y', 'A', 'B', 'I', 'L', 'O', '!'), 'sid' => $iSurveyId, 'language' => $sBaseLang, 'parent_qid' => 0));
if (empty($result))
{
$aViewUrls[] = 'newanswererror_view';
}
else
{
$aData['newanswer_result'] = $result;
$aData['quota_name'] = $quota_name;
$aViewUrls[] = 'newanswer_view';
}
}
if ($sSubAction == "new_answer_two" && isset($_POST['quota_qid']) && Permission::model()->hasSurveyPermission($iSurveyId, 'quotas', 'create'))
{
$aResults = Quota::model()->findByPk(Yii::app()->request->getPost('quota_qid'));
$sQuotaName = $aResults['name'];
$aQuestionAnswers = self::getQuotaAnswers(Yii::app()->request->getPost('quota_qid'), $iSurveyId, Yii::app()->request->getPost('quota_id'));
$x = 0;
foreach ($aQuestionAnswers as $aQACheck)
{
if (isset($aQACheck['rowexists']))
$x++;
}
reset($aQuestionAnswers);
$aData['question_answers'] = $aQuestionAnswers;
$aData['x'] = $x;
$aData['quota_name'] = $sQuotaName;
$aViewUrls[] = 'newanswertwo_view';
}
$this->_renderWrappedTemplate('quotas', $aViewUrls, $aData);
}
function newquota($iSurveyId)
{
$iSurveyId = sanitize_int($iSurveyId);
$this->_checkPermissions($iSurveyId, 'create');
$aData = $this->_getData($iSurveyId);
$clang = $aData['clang'];
$aData['thissurvey'] = getSurveyInfo($iSurveyId);
$aData['langs'] = $aData['aLangs'];
$aData['baselang'] = $aData['sBaseLang'];
$this->_renderWrappedTemplate('quotas', 'newquota_view', $aData);
}
/**
*
* @param type $iQuestionId
* @param type $iSurveyId
* @param type $iQuotaId
* @return array
*/
function getQuotaAnswers($iQuestionId, $iSurveyId, $iQuotaId)
{
$iQuestionId = sanitize_int($iQuestionId);
$iSurveyId = sanitize_int($iSurveyId);
$iQuotaId = sanitize_int($iQuotaId);
$aData = $this->_getData($iSurveyId);
$sBaseLang = $aData['sBaseLang'];
$clang = $aData['clang'];
$this->_checkPermissions($iSurveyId, 'read');
$aQuestion = Question::model()->findByPk(array('qid' => $iQuestionId, 'language' => $sBaseLang));
$aQuestionType = $aQuestion['type'];
if ($aQuestionType == 'M')
{
$aResults = Question::model()->findAllByAttributes(array('parent_qid' => $iQuestionId));
$aAnswerList = array();
foreach($aResults as $aDbAnsList)
{
$tmparrayans = array('Title' => $aQuestion['title'], 'Display' => substr($aDbAnsList['question'], 0, 40), 'code' => $aDbAnsList['title']);
$aAnswerList[$aDbAnsList['title']] = $tmparrayans;
}
} elseif ($aQuestionType == 'G')
{
$aAnswerList = array(
'M' => array('Title' => $aQuestion['title'], 'Display' => $clang->gT("Male"), 'code' => 'M'),
'F' => array('Title' => $aQuestion['title'], 'Display' => $clang->gT("Female"), 'code' => 'F'));
} elseif ($aQuestionType == 'L' || $aQuestionType == 'O' || $aQuestionType == '!')
{
$aAnsResults = Answer::model()->findAllByAttributes(array('qid' => $iQuestionId));
$aAnswerList = array();
foreach ($aAnsResults as $aDbAnsList)
{
$aAnswerList[$aDbAnsList['code']] = array('Title' => $aQuestion['title'], 'Display' => substr($aDbAnsList['answer'], 0, 40), 'code' => $aDbAnsList['code']);
}
} elseif ($aQuestionType == 'A')
{
$aAnsResults = Question::model()->findAllByAttributes(array('parent_qid' => $iQuestionId));
$aAnswerList = array();
foreach ($aAnsResults as $aDbAnsList)
{
for ($x = 1; $x < 6; $x++)
{
$tmparrayans = array('Title' => $aQuestion['title'], 'Display' => substr($aDbAnsList['question'], 0, 40) . ' [' . $x . ']', 'code' => $aDbAnsList['title']);
$aAnswerList[$aDbAnsList['title'] . "-" . $x] = $tmparrayans;
}
}
} elseif ($aQuestionType == 'B')
{
$aAnsResults = Answer::model()->findAllByAttributes(array('qid' => $iQuestionId));
$aAnswerList = array();
foreach ($aAnsResults as $aDbAnsList)
{
for ($x = 1; $x < 11; $x++)
{
$tmparrayans = array('Title' => $aQuestion['title'], 'Display' => substr($aDbAnsList['answer'], 0, 40) . ' [' . $x . ']', 'code' => $aDbAnsList['code']);
$aAnswerList[$aDbAnsList['code'] . "-" . $x] = $tmparrayans;
}
}
} elseif ($aQuestionType == 'Y')
{
$aAnswerList = array(
'Y' => array('Title' => $aQuestion['title'], 'Display' => $clang->gT("Yes"), 'code' => 'Y'),
'N' => array('Title' => $aQuestion['title'], 'Display' => $clang->gT("No"), 'code' => 'N'));
} elseif ($aQuestionType == 'I')
{
$slangs = Survey::model()->findByPk($iSurveyId)->additionalLanguages;
array_unshift($slangs, $sBaseLang);
while (list($key, $value) = each($slangs))
{
$tmparrayans = array('Title' => $aQuestion['title'], 'Display' => getLanguageNameFromCode($value, false), $value);
$aAnswerList[$value] = $tmparrayans;
}
}
if (empty($aAnswerList))
{
return array();
}
else
{
// Now we mark answers already used in this quota as such
$aExistsingAnswers = QuotaMember::model()->findAllByAttributes(array('sid' => $iSurveyId, 'qid' => $iQuestionId, 'quota_id' => $iQuotaId));
foreach ($aExistsingAnswers as $aAnswerRow)
{
if (array_key_exists($aAnswerRow['code'], $aAnswerList))
{
$aAnswerList[$aAnswerRow['code']]['rowexists'] = '1';
}
}
return $aAnswerList;
}
}
/**
* Renders template(s) wrapped in header and footer
*
* @param string $sAction Current action, the folder to fetch views from
* @param string|array $aViewUrls View url(s)
* @param array $aData Data to be passed on. Optional.
*/
protected function _renderWrappedTemplate($sAction = 'quotas', $aViewUrls = array(), $aData = array())
{
App()->getClientScript()->registerPackage('jquery-superfish');
App()->getClientScript()->registerScriptFile(Yii::app()->getConfig('adminscripts') . '/quotas.js');
parent::_renderWrappedTemplate($sAction, $aViewUrls, $aData);
}
}