mirror of
https://github.com/ACSPRI/queXS
synced 2024-04-02 12:12:16 +00:00
Added quota row functionality (ability to assign a quota to remove records by row from a sample)
This commit is contained in:
@@ -55,6 +55,7 @@ print "<li><a href=\"javascript:link('mainobj','import.php');\">" . T_("Import a
|
||||
print "<li><a href=\"javascript:link('mainobj','assignsample.php');\">" . T_("Assign samples to questionnaires") . "</a></li>";
|
||||
print "<li><a href=\"javascript:link('mainobj','questionnaireprefill.php');\">" . T_("Set values in questionnaire to pre fill") . "</a></li>";
|
||||
print "<li><a href=\"javascript:link('mainobj','quota.php');\">" . T_("Quota management") . "</a></li>";
|
||||
print "<li><a href=\"javascript:link('mainobj','quotarow.php');\">" . T_("Quota row management") . "</a></li>";
|
||||
print "<li><a href=\"javascript:link('mainobj','operators.php');\">" . T_("Add operators to the system") . "</a></li>";
|
||||
print "<li><a href=\"javascript:link('mainobj','operatorquestionnaire.php');\">" . T_("Assign operators to questionnaires") . "</a></li>";
|
||||
print "<li><a href=\"javascript:link('mainobj','operatorskill.php');\">" . T_("Modify operator skills") . "</a></li>";
|
||||
|
||||
261
admin/quotarow.php
Executable file
261
admin/quotarow.php
Executable file
@@ -0,0 +1,261 @@
|
||||
<?
|
||||
/**
|
||||
* Set quota's for answered questions and be able to exclude sample records by row
|
||||
* instead of an entire sample
|
||||
*
|
||||
*
|
||||
* This file is part of queXS
|
||||
*
|
||||
* queXS is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* queXS is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with queXS; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
*
|
||||
* @author Adam Zammit <adam.zammit@deakin.edu.au>
|
||||
* @copyright Deakin University 2007,2008,2009
|
||||
* @package queXS
|
||||
* @subpackage admin
|
||||
* @link http://www.deakin.edu.au/dcarf/ queXS was writen for DCARF - Deakin Computer Assisted Research Facility
|
||||
* @license http://opensource.org/licenses/gpl-2.0.php The GNU General Public License (GPL) Version 2
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Configuration file
|
||||
*/
|
||||
include("../config.inc.php");
|
||||
|
||||
/**
|
||||
* Database file
|
||||
*/
|
||||
include ("../db.inc.php");
|
||||
|
||||
/**
|
||||
* XHTML functions
|
||||
*/
|
||||
include("../functions/functions.xhtml.php");
|
||||
|
||||
/**
|
||||
* Display functions
|
||||
*/
|
||||
include("../functions/functions.display.php");
|
||||
|
||||
/**
|
||||
* Input functions
|
||||
*/
|
||||
include("../functions/functions.input.php");
|
||||
|
||||
/**
|
||||
* Limesurvey functions
|
||||
*/
|
||||
include("../functions/functions.limesurvey.php");
|
||||
|
||||
/**
|
||||
* Operator functions
|
||||
*/
|
||||
include("../functions/functions.operator.php");
|
||||
|
||||
|
||||
global $db;
|
||||
|
||||
|
||||
if (isset($_GET['questionnaire_id']) && isset($_GET['sgqa']) && isset($_GET['value']) && isset($_GET['completions']) && isset($_GET['sample_import_id']) && isset($_GET['comparison']) && isset($_GET['exclude_var']) && isset($_GET['exclude_val']))
|
||||
{
|
||||
//need to add quota
|
||||
|
||||
$questionnaire_id = bigintval($_GET['questionnaire_id']);
|
||||
$sample_import_id = bigintval($_GET['sample_import_id']);
|
||||
$value = $db->quote($_GET['value']);
|
||||
$completions = $db->quote($_GET['completions']);
|
||||
$sgqa = $db->quote($_GET['sgqa']);
|
||||
$comparison = $db->quote($_GET['comparison']);
|
||||
$exclude_val = $db->quote($_GET['exclude_val']);
|
||||
$exclude_var = $db->quote($_GET['exclude_var']);
|
||||
|
||||
$sql = "INSERT INTO questionnaire_sample_quota_row(questionnaire_id, sample_import_id, lime_sgqa,value,completions,comparison,exclude_var,exclude_val)
|
||||
VALUES ($questionnaire_id, $sample_import_id, $sgqa, $value, $completions, $comparison, $exclude_var, $exclude_val)";
|
||||
|
||||
$db->Execute($sql);
|
||||
|
||||
//Make sure to calculate on the spot
|
||||
update_quotas($questionnaire_id);
|
||||
}
|
||||
|
||||
if (isset($_GET['questionnaire_id']) && isset($_GET['questionnaire_sample_quota_row_id']))
|
||||
{
|
||||
//need to remove quota
|
||||
|
||||
$questionnaire_id = bigintval($_GET['questionnaire_id']);
|
||||
$questionnaire_sample_quota_row_id = bigintval($_GET['questionnaire_sample_quota_row_id']);
|
||||
|
||||
$sql = "DELETE FROM questionnaire_sample_quota_row
|
||||
WHERE questionnaire_sample_quota_row_id = '$questionnaire_sample_quota_row_id'";
|
||||
|
||||
$db->Execute($sql);
|
||||
|
||||
}
|
||||
|
||||
$questionnaire_id = false;
|
||||
if (isset($_GET['questionnaire_id'])) $questionnaire_id = bigintval($_GET['questionnaire_id']);
|
||||
|
||||
xhtml_head(T_("Quota row management"),true,false,array("../js/window.js"));
|
||||
print "<h1>" . T_("Select a questionnaire from the list below") . "</h1>";
|
||||
|
||||
$sql = "SELECT questionnaire_id as value,description, CASE WHEN questionnaire_id = '$questionnaire_id' THEN 'selected=\'selected\'' ELSE '' END AS selected
|
||||
FROM questionnaire";
|
||||
display_chooser($db->GetAll($sql),"questionnaire","questionnaire_id");
|
||||
|
||||
|
||||
if ($questionnaire_id != false)
|
||||
{
|
||||
$sample_import_id = false;
|
||||
if (isset($_GET['sample_import_id'])) $sample_import_id = bigintval($_GET['sample_import_id']);
|
||||
|
||||
print "<h1>" . T_("Select a sample from the list below") . "</h1>";
|
||||
|
||||
$sql = "SELECT s.sample_import_id as value,s.description, CASE WHEN s.sample_import_id = '$sample_import_id' THEN 'selected=\'selected\'' ELSE '' END AS selected
|
||||
FROM sample_import as s, questionnaire_sample as q
|
||||
WHERE q.questionnaire_id = $questionnaire_id
|
||||
AND q.sample_import_id = s.sample_import_id";
|
||||
|
||||
display_chooser($db->GetAll($sql),"sample","sample_import_id",true,"questionnaire_id=$questionnaire_id");
|
||||
|
||||
if ($sample_import_id != false)
|
||||
{
|
||||
print "<h1>" . T_("Current row quotas (click to delete)") . "</h1>";
|
||||
|
||||
$sql = "SELECT questionnaire_sample_quota_row_id,lime_sgqa,value,completions,quota_reached,lime_sid,comparison,exclude_var,exclude_val
|
||||
FROM questionnaire_sample_quota_row as qsq, questionnaire as q
|
||||
WHERE qsq.questionnaire_id = '$questionnaire_id'
|
||||
AND qsq.sample_import_id = '$sample_import_id'
|
||||
AND q.questionnaire_id = '$questionnaire_id'";
|
||||
|
||||
$r = $db->GetAll($sql);
|
||||
|
||||
if (empty($r))
|
||||
{
|
||||
print "<p>" . T_("Currently no row quotas") . "</p>";
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach($r as $v)
|
||||
{
|
||||
print "<div><a href='?questionnaire_id=$questionnaire_id&sample_import_id=$sample_import_id&questionnaire_sample_quota_row_id={$v['questionnaire_sample_quota_row_id']}'>" . T_("Stop calling") . " " . $v['exclude_var'] . " " . T_("like") . " " . $v['exclude_val'] . " " . T_("rows from this sample when:") . " {$v['lime_sgqa']} {$v['comparison']} {$v['value']} " . T_("for") . ": {$v['completions']} " . T_("completions") ."</a> - ";
|
||||
|
||||
if ($v['quota_reached'] == 1)
|
||||
print T_("Row quota reached");
|
||||
else
|
||||
print T_("Row quota not yet reached");
|
||||
|
||||
print " - " . T_("Current completions: ") . limesurvey_quota_completions($v['lime_sgqa'],$v['lime_sid'],$questionnaire_id,$sample_import_id,$v['value'],$v['comparison']);
|
||||
|
||||
print "</div>";
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
print "<h1>" . T_("Select a question for the row quota") . "</h1>";
|
||||
|
||||
$sql = "SELECT lime_sid
|
||||
FROM questionnaire
|
||||
WHERE questionnaire_id = '$questionnaire_id'";
|
||||
|
||||
$r = $db->GetRow($sql);
|
||||
|
||||
$lime_sid = $r['lime_sid'];
|
||||
|
||||
$sgqa = false;
|
||||
if (isset($_GET['sgqa'])) $sgqa = $_GET['sgqa'];
|
||||
|
||||
$sql = "SELECT CONCAT( q.sid, 'X', q.gid, 'X', q.qid, IFNULL( a.code, '' ) ) AS value, CONCAT(q.question, ': ', IFNULL(a.answer,'')) as description, CASE WHEN CONCAT( q.sid, 'X', q.gid, 'X', q.qid, IFNULL( a.code, '' ) ) = '$sgqa' THEN 'selected=\'selected\'' ELSE '' END AS selected
|
||||
FROM `" . LIME_PREFIX . "questions` AS q
|
||||
LEFT JOIN `" . LIME_PREFIX . "answers` AS a ON ( a.qid = q.qid )
|
||||
WHERE q.sid = '$lime_sid'";
|
||||
|
||||
|
||||
display_chooser($ldb->GetAll($sql),"sgqa","sgqa",true,"questionnaire_id=$questionnaire_id&sample_import_id=$sample_import_id");
|
||||
|
||||
if ($sgqa != false)
|
||||
{
|
||||
$sample_var = false;
|
||||
if (isset($_GET['sample_var']))
|
||||
$sample_var = $_GET['sample_var'];
|
||||
|
||||
print "<h1>" . T_("Select the sample variable to exclude") . "</h1>";
|
||||
|
||||
$sql = "SELECT sv.var as value, sv.var as description, CASE WHEN sv.var LIKE '$sample_var' THEN 'selected=\'selected\'' ELSE '' END AS selected
|
||||
FROM sample_var AS sv, sample AS s
|
||||
WHERE s.import_id = $sample_import_id
|
||||
AND s.sample_id = sv.sample_id
|
||||
GROUP BY sv.var";
|
||||
|
||||
display_chooser($db->GetAll($sql),"sample_var","sample_var",true,"questionnaire_id=$questionnaire_id&sample_import_id=$sample_import_id&sgqa=$sgqa");
|
||||
|
||||
if ($sample_var != false)
|
||||
{
|
||||
print "<h1>" . T_("Enter the details for creating the row quota:") . "</h1>";
|
||||
print "<h2>" . T_("Pre defined values for this question:") . "</h2>";
|
||||
|
||||
$qid = explode("X", $sgqa);
|
||||
$qid = $qid[2];
|
||||
|
||||
$sql = "SELECT l.code,l.title
|
||||
FROM `" . LIME_PREFIX . "labels` as l, `" . LIME_PREFIX . "questions` as q
|
||||
WHERE q.qid = '$qid'
|
||||
AND l.lid = q.lid";
|
||||
|
||||
$rs = $ldb->GetAll($sql);
|
||||
|
||||
if (!isset($rs) || empty($rs))
|
||||
print "<p>" . T_("No labels defined for this question") ."</p>";
|
||||
else
|
||||
xhtml_table($rs,array('code','title'),array(T_("Code value"), T_("Description")));
|
||||
|
||||
|
||||
?>
|
||||
<form action="" method="get">
|
||||
<p>
|
||||
<label for="value"><? echo T_("The code value to compare"); ?> </label><input type="text" name="value" id="value"/> <br/>
|
||||
<label for="comparison"><? echo T_("The type of comparison"); ?></label><select name="comparison" id="comparison"><option value="LIKE">LIKE</option><option value="NOT LIKE">NOT LIKE</option><option value="=">=</option><option value="!=">!=</option><option value="<"><</option><option value=">">></option><option value="<="><=</option><option value=">=">>=</option></select><br/>
|
||||
<label for="completions"><? echo T_("The number of completions to stop calling at"); ?> </label><input type="text" name="completions" id="completions"/> <br/>
|
||||
<label for="exclude_val"><? echo T_("Exclude from the sample where the value is like"); ?></label>
|
||||
<?
|
||||
|
||||
$sql = "SELECT sv.val as value, sv.val as description, '' AS selected
|
||||
FROM sample_var AS sv, sample AS s
|
||||
WHERE s.import_id = 6
|
||||
AND s.sample_id = sv.sample_id
|
||||
AND sv.var = '$sample_var'
|
||||
GROUP BY sv.val";
|
||||
|
||||
display_chooser($db->GetAll($sql),"exclude_val","exclude_val",false,false,false,false);
|
||||
flush();
|
||||
?>
|
||||
<br/>
|
||||
<input type="hidden" name="exclude_var" value="<? print($sample_var); ?>"/>
|
||||
<input type="hidden" name="questionnaire_id" value="<? print($questionnaire_id); ?>"/>
|
||||
<input type="hidden" name="sample_import_id" value="<? print($sample_import_id); ?>"/>
|
||||
<input type="hidden" name="sgqa" value="<? print($sgqa); ?>"/>
|
||||
<input type="submit" name="add_quota" value="<? print(T_("Add row quota")); ?>"/></p>
|
||||
</form>
|
||||
<?
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
xhtml_foot();
|
||||
|
||||
|
||||
?>
|
||||
@@ -518,6 +518,27 @@ CREATE TABLE IF NOT EXISTS `questionnaire_sample_quota` (
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
|
||||
|
||||
--
|
||||
-- Table structure for table `questionnaire_sample_quota_row`
|
||||
--
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `questionnaire_sample_quota_row` (
|
||||
`questionnaire_sample_quota_row_id` bigint(20) NOT NULL auto_increment,
|
||||
`questionnaire_id` bigint(20) NOT NULL,
|
||||
`sample_import_id` bigint(20) NOT NULL,
|
||||
`lime_sgqa` varchar(255) collate utf8_unicode_ci NOT NULL,
|
||||
`value` varchar(2048) collate utf8_unicode_ci NOT NULL,
|
||||
`comparison` varchar(15) collate utf8_unicode_ci NOT NULL default 'LIKE',
|
||||
`completions` int(11) NOT NULL,
|
||||
`exclude_var` char(128) collate utf8_unicode_ci NOT NULL,
|
||||
`exclude_val` varchar(256) collate utf8_unicode_ci NOT NULL,
|
||||
`quota_reached` tinyint(1) NOT NULL default '0',
|
||||
PRIMARY KEY (`questionnaire_sample_quota_row_id`),
|
||||
KEY `questionnaire_id` (`questionnaire_id`),
|
||||
KEY `sample_import_id` (`sample_import_id`),
|
||||
KEY `exclude_var` (`exclude_var`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
|
||||
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
||||
|
||||
@@ -302,6 +302,7 @@ function get_case_id($operator_id, $create = false)
|
||||
AND ((apn.appointment_id IS NOT NULL) or qs.call_attempt_max = 0 or ((SELECT count(*) FROM call_attempt WHERE case_id = c.case_id) < qs.call_attempt_max))
|
||||
AND ((apn.appointment_id IS NOT NULL) or qs.call_max = 0 or ((SELECT count(*) FROM `call` WHERE case_id = c.case_id) < qs.call_max))
|
||||
AND (SELECT count(*) FROM `questionnaire_sample_quota` WHERE questionnaire_id = c.questionnaire_id AND sample_import_id = s.import_id AND quota_reached = 1) = 0
|
||||
AND (SELECT count(*) FROM `questionnaire_sample_quota_row` as qsqr, sample_var as sv WHERE qsqr.questionnaire_id = c.questionnaire_id AND qsqr.sample_import_id = s.import_id AND qsqr.quota_reached = 1 and sv.sample_id = s.sample_id AND sv.var = qsqr.exclude_var AND qsqr.exclude_val LIKE sv.val) = 0
|
||||
ORDER BY apn.start DESC, a.start ASC
|
||||
LIMIT 1";
|
||||
|
||||
@@ -336,6 +337,7 @@ function get_case_id($operator_id, $create = false)
|
||||
AND !(q.restrict_work_shifts = 1 AND sh.shift_id IS NULL)
|
||||
AND !(si.call_restrict = 1 AND cr.day_of_week IS NULL)
|
||||
AND (SELECT count(*) FROM `questionnaire_sample_quota` WHERE questionnaire_id = qs.questionnaire_id AND sample_import_id = s.import_id AND quota_reached = 1) = 0
|
||||
AND (SELECT count(*) FROM `questionnaire_sample_quota_row` as qsqr, sample_var as sv WHERE qsqr.questionnaire_id = qs.questionnaire_id AND qsqr.sample_import_id = s.import_id AND qsqr.quota_reached = 1 AND sv.sample_id = s.sample_id AND sv.var = qsqr.exclude_var AND qsqr.exclude_val LIKE sv.val) = 0
|
||||
ORDER BY rand() * qs.random_select, s.sample_id
|
||||
LIMIT 1";
|
||||
|
||||
@@ -959,13 +961,11 @@ function missed_appointment($call_attempt_id)
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if any quotas apply to this questionnaire
|
||||
* and if so, update them
|
||||
*
|
||||
* @param int $questionnaire_id The questionnaire id
|
||||
* Update the quota table (sample wide)
|
||||
*
|
||||
* @param int $questionnaire_id The questionnaire ID to update
|
||||
*/
|
||||
function update_quotas($questionnaire_id)
|
||||
function update_quota($questionnaire_id)
|
||||
{
|
||||
global $db;
|
||||
|
||||
@@ -999,6 +999,63 @@ function update_quotas($questionnaire_id)
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update the row quota table
|
||||
*
|
||||
* @param int $questionnaire_id The questionnaire ID to update
|
||||
*/
|
||||
function update_row_quota($questionnaire_id)
|
||||
{
|
||||
global $db;
|
||||
|
||||
$sql = "SELECT questionnaire_sample_quota_row_id,q.questionnaire_id,sample_import_id,lime_sgqa,value,comparison,completions,quota_reached,q.lime_sid
|
||||
FROM questionnaire_sample_quota_row as qsq, questionnaire as q
|
||||
WHERE qsq.questionnaire_id = '$questionnaire_id'
|
||||
AND q.questionnaire_id = '$questionnaire_id'";
|
||||
|
||||
$rs = $db->GetAll($sql);
|
||||
|
||||
if (isset($rs) && !empty($rs))
|
||||
{
|
||||
//include limesurvey functions
|
||||
include_once(dirname(__FILE__).'/functions.limesurvey.php');
|
||||
|
||||
//update all row quotas for this questionnaire
|
||||
foreach($rs as $r)
|
||||
{
|
||||
$completions = limesurvey_quota_completions($r['lime_sgqa'],$r['lime_sid'],$r['questionnaire_id'],$r['sample_import_id'],$r['value'],$r['comparison']);
|
||||
|
||||
if ($completions >= $r['completions'])
|
||||
{
|
||||
//set row quota to reached
|
||||
$sql = "UPDATE questionnaire_sample_quota_row
|
||||
SET quota_reached = '1'
|
||||
WHERE questionnaire_sample_quota_row_id = {$r['questionnaire_sample_quota_row_id']}";
|
||||
|
||||
$db->Execute($sql);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if any quotas apply to this questionnaire
|
||||
* and if so, update them
|
||||
*
|
||||
* @param int $questionnaire_id The questionnaire id
|
||||
*
|
||||
*/
|
||||
function update_quotas($questionnaire_id)
|
||||
{
|
||||
update_quota($questionnaire_id);
|
||||
update_row_quota($questionnaire_id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -135,11 +135,13 @@ function xhtml_table($content,$fields,$head = false,$class = "tclass",$highlight
|
||||
* @param bool $useblank Add a blank element to the start of the list
|
||||
* @param string|bool $pass Anything to pass along in the return string (remember to separate with &)
|
||||
* @param bool $js Whether to use JS or not
|
||||
* @param bool $indiv Whether to display in a div or not
|
||||
*
|
||||
*/
|
||||
function display_chooser($elements, $selectid, $var, $useblank = true, $pass = false, $js = true)
|
||||
function display_chooser($elements, $selectid, $var, $useblank = true, $pass = false, $js = true, $indiv = true)
|
||||
{
|
||||
print "<div><select id='$selectid' name='$selectid' ";
|
||||
if ($indiv) print "<div>";
|
||||
print "<select id='$selectid' name='$selectid' ";
|
||||
if ($js) print "onchange=\"LinkUp('$selectid')\"";
|
||||
print ">";
|
||||
if ($useblank)
|
||||
@@ -166,8 +168,8 @@ function display_chooser($elements, $selectid, $var, $useblank = true, $pass = f
|
||||
if (isset($e['selected'])) print $e['selected'];
|
||||
print ">".$e['description']."</option>";
|
||||
}
|
||||
print "</select></div>";
|
||||
|
||||
print "</select>";
|
||||
if ($indiv) print "</div>";
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user