From b2ef33e98a10fe723f20591fc6b8d1c70075d2ea Mon Sep 17 00:00:00 2001 From: Adam Zammit Date: Wed, 24 May 2017 12:51:31 +1000 Subject: [PATCH] New feature: Choose Limesurvey attributes to assign sample records to on case creation --- CHANGELOG | 19 ++++ admin/assignsample.php | 139 +++++++++++++++++++++++++++-- functions/functions.limesurvey.php | 31 ++++++- functions/functions.operator.php | 57 ++++-------- 4 files changed, 196 insertions(+), 50 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 1147f857..4cb807d3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,22 @@ +queXS 2.1.0 - Changes since 2.0.1 + +Database changes required: + +CREATE TABLE IF NOT EXISTS `remote_sample_var` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `var_id` bigint(20) NOT NULL, + `questionnaire_id` bigint(20) NOT NULL, + `field` text COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `var_id` (`var_id`,`questionnaire_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; + +INSERT INTO remote_sample_var (var_id,questionnaire_id,field) +SELECT sv.var_id,qs.questionnaire_id,CASE WHEN sv.type = 6 THEN 'firstname' WHEN sv.type = 7 THEN 'lastname' WHEN sv.type = 8 THEN 'email' WHEN sv.type = 9 THEN 'token' END +FROM questionnaire_sample as qs +JOIN sample_import_var_restrict as sv ON (sv.sample_import_id = qs.sample_import_id AND sv.type IN (6,7,8,9)); + + queXS 2.0.1 - Changes since 2.0.0 This release includes fixes ported from the 1.x branch diff --git a/admin/assignsample.php b/admin/assignsample.php index 9f8b6349..bdb6b2e0 100644 --- a/admin/assignsample.php +++ b/admin/assignsample.php @@ -103,6 +103,22 @@ if (isset($_GET['questionnaire_id']) && isset($_GET['sample']) && isset($_GET[' $db->Execute($sql); + foreach($_GET as $key => $val) { + if (substr($key,0,2) == "sv") { + $varid = bigintval(substr($key,2)); + if (empty($val)) { + $sql = "DELETE FROM remote_sample_var + WHERE questionnaire_id = $questionnaire_id + AND var_id = $varid"; + } else { + $sql = "INSERT INTO remote_sample_var (questionnaire_id,var_id,field) + VALUES ($questionnaire_id,$varid," . $db->qstr($val) . ") + ON DUPLICATE KEY UPDATE field = " . $db->qstr($val); + } + $db->Execute($sql); + } + } + if (isset($_GET['generatecases'])) { //find the number of sample variables required @@ -210,7 +226,23 @@ if (isset($_POST['edit'])) WHERE questionnaire_id = '$questionnaire_id' AND sample_import_id = '$sid'"; - $db->Execute($sql); + $db->Execute($sql); + + foreach($_POST as $key => $val) { + if (substr($key,0,2) == "sv") { + $varid = bigintval(substr($key,2)); + if (empty($val)) { + $sql = "DELETE FROM remote_sample_var + WHERE questionnaire_id = $questionnaire_id + AND var_id = $varid"; + } else { + $sql = "INSERT INTO remote_sample_var (questionnaire_id,var_id,field) + VALUES ($questionnaire_id,$varid," . $db->qstr($val) . ") + ON DUPLICATE KEY UPDATE field = " . $db->qstr($val); + } + $db->Execute($sql); + } + } } @@ -245,6 +277,22 @@ if (isset($_GET['questionnaire_id']) && isset($_GET['rsid']))

" . T_("Sample") . ": " . $qs['description'] . "

"; + //Get list of attributes in Limesurvey and how they link to this sample + // + $sql = "SELECT sv.var_id,sv.var,sv.type,rv.field + FROM sample_import_var_restrict as sv + LEFT JOIN remote_sample_var as rv ON (rv.var_id = sv.var_id AND rv.questionnaire_id = $questionnaire_id) + WHERE sv.sample_import_id = $sid"; + + $svars = $db->GetAll($sql); + + include_once("../functions/functions.limesurvey.php"); + + $attributes = lime_get_token_attributes($questionnaire_id); + + + + $allownew = $selected =""; if ($qs['random_select'] == 1) $selected = "checked=\"checked\""; @@ -268,7 +316,33 @@ if (isset($_GET['questionnaire_id']) && isset($_GET['rsid']))
class="col-sm-1" data-toggle="toggle" data-size="small" data-on="" data-off="" data-width="85"/>



- + + " . T_("Sample variables to copy to Limesurvey participant table") . ""; + + print ""; + foreach($svars as $sv) { + print ""; + print ""; + } + print "
" . T_("Sample variable") . "" . T_("Limesurvey participant variable") . "
" + +?> +
@@ -417,12 +491,35 @@ if ($questionnaire_id != false) if (!empty($qs)) { print "
"; - print "

" . T_("Add a sample to this questionnaire:") . "

"; + print "

" . T_("Add a sample to this questionnaire:") . "

"; + + $sample_import_id = $qs[0]['sample_import_id']; + if (isset($_GET['sample'])) { + $sample_import_id = bigintval($_GET['sample']); + } + + //Get list of attributes in Limesurvey and how they link to this sample + // + $sql = "SELECT sv.var_id,sv.var,sv.type,rv.field + FROM sample_import_var_restrict as sv + LEFT JOIN remote_sample_var as rv ON (rv.var_id = sv.var_id AND rv.questionnaire_id = $questionnaire_id) + WHERE sv.sample_import_id = $sample_import_id"; + + $svars = $db->GetAll($sql); + + include_once("../functions/functions.limesurvey.php"); + + $attributes = lime_get_token_attributes($questionnaire_id); + + if ($attributes == false) { + print "
" . T_("Unable to access token/participants table in Limesurvey. Please confirm that this survey has a participant table created.") . "
"; + } else { + ?>
-


+


@@ -446,19 +543,47 @@ if ($questionnaire_id != false)
" data-off="" data-width="85"/>
- * + *

+ +" . T_("Sample variables to copy to Limesurvey participant table") . ""; + + print ""; + foreach($svars as $sv) { + print ""; + print ""; + } + print "
" . T_("Sample variable") . "" . T_("Limesurvey participant variable") . "
" + +?> +
- add_participants($limeKey,$lime_id,array(array('firstname'=>$dtoken,'lastname'=>$dtoken))); + } catch (Exception $e) { + limerpc_close(); + return false; + } + + if (isset($np[0]['tid'])) { + $ret = array_keys($np[0]); //array of data + $limeRPC->delete_participants($limeKey,$lime_id,array($np[0]['tid'])); + } + } + + limerpc_close(); + return $ret; +} function lime_add_token($qid,$params) { diff --git a/functions/functions.operator.php b/functions/functions.operator.php index 28500b26..d5470e96 100644 --- a/functions/functions.operator.php +++ b/functions/functions.operator.php @@ -447,55 +447,28 @@ function add_case($sample_id,$questionnaire_id,$operator_id = "NULL",$testing = if ($lime_sid) { - $lfirstname = ""; - $llastname = ""; - $lemail = ""; + $params = array('token' => $token); - $params = array('firstname' => "", - 'lastname' => "", - 'email' => "", - 'token' => $token); + //get remote sample fields for this questionaire/sample only + $sql = "SELECT rv.var_id,rv.field + FROM remote_sample_var as rv + JOIN sample as s ON (s.sample_id = $sample_id) + JOIN sample_import_var_restrict as sv ON (s.import_id = sv.sample_import_id AND rv.var_id = sv.var_id) + WHERE questionnaire_id = $questionnaire_id"; - $params['firstname'] = ($db->GetOne("SELECT sv.val - FROM sample_var as sv, sample_import_var_restrict as s - WHERE sv.var_id = s.var_id - AND sv.sample_id = '$sample_id' - AND s.type = '6'")); + $ps = $db->GetAll($sql); - $params['lastname'] = ($db->GetOne("SELECT sv.val - FROM sample_var as sv, sample_import_var_restrict as s - WHERE sv.var_id = s.var_id - AND sv.sample_id = '$sample_id' - AND s.type = '7'")); - - $params['email'] = ($db->GetOne("SELECT sv.val - FROM sample_var as sv, sample_import_var_restrict as s - WHERE sv.var_id = s.var_id - AND sv.sample_id = '$sample_id' - AND s.type = '8'")); + //copy across all selected variables to matching Limesurvey fields + foreach($ps as $p) { + $params[$p['field']] = $db->GetOne("SELECT val + FROM sample_var + WHERE var_id = {$p['var_id']} + AND sample_id = '$sample_id'"); + } //include limesurvey functions include_once(dirname(__FILE__).'/functions.limesurvey.php'); - if ($addlimeattributes) - { - $sql = "SELECT sv.val - FROM sample_var as sv, sample_import_var_restrict as s - WHERE sv.var_id = s.var_id - AND sv.sample_id = '$sample_id' - AND s.type = '1' - ORDER BY s.var_id ASC"; - - $vars = $db->GetAll($sql); - - $att = 1; - - foreach($vars as $v) { - $params['attribute_' . $att] = $v['val']; - $att++; - } - } - $ret = lime_add_token($questionnaire_id,$params); //fail to create case if can't add remote token