2
0
mirror of https://github.com/ACSPRI/queXS synced 2024-04-02 12:12:16 +00:00

Allow for single row quotas to be updated on editing

This commit is contained in:
Adam Zammit
2014-02-19 15:58:34 +11:00
parent ed6b89f1d9
commit 942464768e
3 changed files with 218 additions and 198 deletions

View File

@@ -178,13 +178,12 @@ if ($questionnaire_id)
$report[] = array("strata" => T_("Total sample"), "quota" => $drawn + $remain, "sample" => $drawn + $remain, "sampleused" => $drawn, "sampleremain" => $remain, "completions" => $completions, "perc" => ROUND(($completions / ($drawn + $remain)) * 100,2)); $report[] = array("strata" => T_("Total sample"), "quota" => $drawn + $remain, "sample" => $drawn + $remain, "sampleused" => $drawn, "sampleremain" => $remain, "completions" => $completions, "perc" => ROUND(($completions / ($drawn + $remain)) * 100,2));
//a. (Standard quota) Monitor outcomes of questions in completed questionnaires, and exclude selected sample records when completion limit is reached //a. (Standard quota) Monitor outcomes of questions in completed questionnaires, and exclude selected sample records when completion limit is reached
//b. (Replicate quota) Exclude selected sample records (where lime_sgqa == -1) //b. (Replicate quota) Exclude selected sample records (where no qsqr_question rows)
$sql = "SELECT qsq.questionnaire_sample_quota_row_id,qsqr_question.lime_sgqa,completions,quota_reached,lime_sid,qsq.description,current_completions, priority, autoprioritise $sql = "SELECT qsq.questionnaire_sample_quota_row_id,completions,quota_reached,lime_sid,qsq.description,current_completions, priority, autoprioritise
FROM questionnaire_sample_quota_row as qsq, questionnaire as q, qsqr_question FROM questionnaire_sample_quota_row as qsq, questionnaire as q
WHERE qsq.questionnaire_id = '$questionnaire_id' WHERE qsq.questionnaire_id = '$questionnaire_id'
AND qsq.sample_import_id = '$sample_import_id' AND qsq.sample_import_id = '$sample_import_id'
AND q.questionnaire_id = '$questionnaire_id' AND q.questionnaire_id = '$questionnaire_id'";
AND qsqr_question.questionnaire_sample_quota_row_id = qsq.questionnaire_sample_quota_row_id";
$r = $db->GetAll($sql); $r = $db->GetAll($sql);
@@ -198,15 +197,8 @@ if ($questionnaire_id)
$qsqr = $v['questionnaire_sample_quota_row_id']; $qsqr = $v['questionnaire_sample_quota_row_id'];
if ($v['lime_sgqa'] == -1)
{
$v['completions'] = "";
$perc = "";
}
else
{
$perc = ($v['completions'] <= 0 ? 0 : ROUND(($completions / ($v['completions'])) * 100,2)); $perc = ($v['completions'] <= 0 ? 0 : ROUND(($completions / ($v['completions'])) * 100,2));
}
//We need to calc Sample size, Sample drawn, Sample remain //We need to calc Sample size, Sample drawn, Sample remain
$sql = "SELECT (c.sample_id is not null) as type, count(*) as count $sql = "SELECT (c.sample_id is not null) as type, count(*) as count
@@ -242,7 +234,7 @@ if ($questionnaire_id)
if ($r['type'] == 0) $remain = $r['count']; if ($r['type'] == 0) $remain = $r['count'];
} }
if ($completions < $v['completions'] || $v['lime_sgqa'] == -1) //if completions less than the quota, allow for closing/opening if ($completions < $v['completions']) //if completions less than the quota, allow for closing/opening
{ {
if ($v['quota_reached'] == 1) if ($v['quota_reached'] == 1)
$status = "<a href='?questionnaire_id=$questionnaire_id&amp;sample_import_id=$sample_import_id&amp;rowquota=$qsqr&amp;open=open'>" . T_("closed") . "</a>"; $status = "<a href='?questionnaire_id=$questionnaire_id&amp;sample_import_id=$sample_import_id&amp;rowquota=$qsqr&amp;open=open'>" . T_("closed") . "</a>";

View File

@@ -72,12 +72,17 @@ global $db;
if (isset($_GET['delete'])) if (isset($_GET['delete']))
{ {
$qsqri = bigintval($_GET['qsqri']);
if (isset($_GET['qsqrqi'])) if (isset($_GET['qsqrqi']))
{ {
$qsqrqi = bigintval($_GET['qsqrqi']); $qsqrqi = bigintval($_GET['qsqrqi']);
$sql = "DELETE FROM qsqr_question $sql = "DELETE FROM qsqr_question
WHERE qsqr_question_id = $qsqrqi"; WHERE qsqr_question_id = $qsqrqi";
$db->Execute($sql); $db->Execute($sql);
//Make sure to calculate on the spot
update_single_row_quota($qsqri);
} }
if (isset($_GET['qsqrsi'])) if (isset($_GET['qsqrsi']))
{ {
@@ -85,6 +90,9 @@ if (isset($_GET['delete']))
$sql = "DELETE FROM qsqr_sample $sql = "DELETE FROM qsqr_sample
WHERE qsqr_sample_id = $qsqrsi"; WHERE qsqr_sample_id = $qsqrsi";
$db->Execute($sql); $db->Execute($sql);
//Make sure to calculate on the spot
update_single_row_quota($qsqri);
} }
} }
@@ -105,8 +113,10 @@ if (isset($_POST['add_quota']))
$db->Execute($sql); $db->Execute($sql);
$qq = $db->Insert_ID();
//Make sure to calculate on the spot //Make sure to calculate on the spot
//update_quotas($questionnaire_id); update_single_row_quota($qq);
} }
if (isset($_POST['edit_quota'])) if (isset($_POST['edit_quota']))
@@ -129,8 +139,9 @@ if (isset($_POST['edit_quota']))
$_GET['qsqri'] = $qsqri; $_GET['qsqri'] = $qsqri;
$_GET['edit'] = "edit"; $_GET['edit'] = "edit";
//Make sure to calculate on the spot //Make sure to calculate on the spot
//update_quotas($questionnaire_id); update_single_row_quota($qsqri);
} }
@@ -165,6 +176,9 @@ if (isset($_GET['qsqri']) & isset($_GET['edit']))
VALUES ($qsqri,$exvar,$exval,$comparison)"; VALUES ($qsqri,$exvar,$exval,$comparison)";
$db->Execute($sql); $db->Execute($sql);
//Make sure to calculate on the spot
update_single_row_quota($qsqri);
} }
if (isset($_POST['addq'])) if (isset($_POST['addq']))
@@ -177,6 +191,9 @@ if (isset($_GET['qsqri']) & isset($_GET['edit']))
VALUES ($qsqri,$sgqa,$value,$comparison)"; VALUES ($qsqri,$sgqa,$value,$comparison)";
$db->Execute($sql); $db->Execute($sql);
//Make sure to calculate on the spot
update_single_row_quota($qsqri);
} }
} }

View File

@@ -1668,43 +1668,29 @@ function copy_row_quota_with_adjusting($questionnaire_id,$sample_import_id,$copy
*/ */
} }
/** /**
* Update the row quota table * Update a single row quota
* *
* @param int $questionnaire_id The questionnaire ID to update * @param int $qsqri The quota row id
* @param int|bool $case_id The case id if known to limit the scope of the search * @param int|bool $case_id The case id if known to limit the scope of the search
* @return bool If priorities need to be updated or not
*/ */
function update_row_quota($questionnaire_id,$case_id = false) function update_single_row_quota($qsqri,$case_id = false)
{ {
global $db; global $db;
$update = false; //whether to update priorities (only if changed) $sql = "SELECT q.lime_sid, qs.questionnaire_id, qs.sample_import_id, qs.completions, qs.autoprioritise
FROM questionnaire as q, questionnaire_sample_quota_row as qs
WHERE q.questionnaire_id = qs.questionnaire_id
AND qs.questionnaire_sample_quota_row_id = $qsqri";
$db->StartTrans(); $rs = $db->GetRow($sql);
$sql = "SELECT qsq.questionnaire_sample_quota_row_id,q.questionnaire_id,sample_import_id,completions,quota_reached,q.lime_sid,qsq.current_completions,qsq.priority,qsq.autoprioritise,qq.lime_sgqa $lime_sid = $rs['lime_sid'];
FROM questionnaire_sample_quota_row as qsq, questionnaire as q, qsqr_question as qq $questionnaire_id = $rs['questionnaire_id'];
WHERE qsq.questionnaire_id = '$questionnaire_id' $sample_import_id = $rs['sample_import_id'];
AND q.questionnaire_id = '$questionnaire_id' $target_completions = $rs['completions'];
AND qsq.quota_reached != '1' $autoprioritise = $rs['autoprioritise'];
AND qq.questionnaire_sample_quota_row_id = qsq.questionnaire_sample_quota_row_id
AND qq.lime_sgqa != -1
GROUP BY qsq.questionnaire_sample_quota_row_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)
{
$lime_sid = $r['lime_sid'];
$sample_import_id = $r['sample_import_id'];
$qsqri = $r['questionnaire_sample_quota_row_id'];
//all variables to exclude for this row quota //all variables to exclude for this row quota
$sql2 = "SELECT exclude_val,exclude_var,comparison $sql2 = "SELECT exclude_val,exclude_var,comparison
@@ -1722,15 +1708,18 @@ function update_row_quota($questionnaire_id,$case_id = false)
//whether a completion was changed for this quota //whether a completion was changed for this quota
$updatequota = false; $updatequota = false;
//whether priorites need to be updated
$update = false;
//default completions at 0
$completions = 0;
//if a case_Id is specified, we can just check if this case matches //if a case_Id is specified, we can just check if this case matches
//the quota criteria, and if so, increment the quota completions counter //the quota criteria, and if so, increment the quota completions counter
if ($case_id != false) if ($case_id != false)
{ {
if ($r['lime_sgqa'] == -2) if (empty($qev))
{ {
//just determine if this case is linked to a matching sample record //just determine if this case is linked to a matching sample record
$sql2 = "SELECT count(*) as c $sql2 = "SELECT count(*) as c
FROM " . LIME_PREFIX . "survey_$lime_sid as s FROM " . LIME_PREFIX . "survey_$lime_sid as s
JOIN `case` as c ON (c.case_id = '$case_id') JOIN `case` as c ON (c.case_id = '$case_id')
@@ -1746,12 +1735,10 @@ function update_row_quota($questionnaire_id,$case_id = false)
$sql2 .= " WHERE s.token = c.token"; $sql2 .= " WHERE s.token = c.token";
$match = $db->GetOne($sql2); $match = $db->GetOne($sql2);
//$match = limesurvey_quota_replicate_match($r['lime_sid'],$case_id,$r['exclude_val'],$r['exclude_var']);
} }
else else
{ {
//determine if the case is linked to a matching limesurvey record //determine if the case is linked to a matching limesurvey record
$sql2 = "SELECT count(*) as c $sql2 = "SELECT count(*) as c
FROM " . LIME_PREFIX . "survey_$lime_sid as s FROM " . LIME_PREFIX . "survey_$lime_sid as s
JOIN `case` as c ON (c.case_id = '$case_id') JOIN `case` as c ON (c.case_id = '$case_id')
@@ -1763,8 +1750,6 @@ function update_row_quota($questionnaire_id,$case_id = false)
$sql2 .= " AND s.`{$ev['lime_sgqa']}` {$ev['comparison']} '{$ev['value']}' "; $sql2 .= " AND s.`{$ev['lime_sgqa']}` {$ev['comparison']} '{$ev['value']}' ";
$match = $db->GetOne($sql2); $match = $db->GetOne($sql2);
//$match = limesurvey_quota_match($r['lime_sgqa'],$r['lime_sid'],$case_id,$r['value'],$r['comparison']);
} }
if ($match == 1) if ($match == 1)
@@ -1772,18 +1757,17 @@ function update_row_quota($questionnaire_id,$case_id = false)
//increment completions //increment completions
$sql = "SELECT (current_completions + 1) as c $sql = "SELECT (current_completions + 1) as c
FROM questionnaire_sample_quota_row FROM questionnaire_sample_quota_row
WHERE questionnaire_sample_quota_row_id = {$r['questionnaire_sample_quota_row_id']}"; WHERE questionnaire_sample_quota_row_id = '$qsqri'";
$cc = $db->GetRow($sql); $cc = $db->GetRow($sql);
$completions = $cc['c']; $completions = $cc['c'];
$updatequota = true; $updatequota = true;
} }
} }
else else
{ {
if ($r['lime_sgqa'] == -2) if (empty($qev))
{ {
//find all completions from cases with matching sample records //find all completions from cases with matching sample records
@@ -1803,8 +1787,6 @@ function update_row_quota($questionnaire_id,$case_id = false)
AND s.token = c.token"; AND s.token = c.token";
$completions = $db->GetOne($sql2); $completions = $db->GetOne($sql2);
//$completions = limesurvey_quota_replicate_completions($r['lime_sid'],$r['questionnaire_id'],$r['sample_import_id'],$r['exclude_val'],$r['exclude_var']);
} }
else else
{ {
@@ -1820,8 +1802,6 @@ function update_row_quota($questionnaire_id,$case_id = false)
$sql2 .= " AND s.`{$ev['lime_sgqa']}` {$ev['comparison']} '{$ev['value']}' "; $sql2 .= " AND s.`{$ev['lime_sgqa']}` {$ev['comparison']} '{$ev['value']}' ";
$completions = $db->GetOne($sql2); $completions = $db->GetOne($sql2);
// $completions = limesurvey_quota_completions($r['lime_sgqa'],$r['lime_sid'],$r['questionnaire_id'],$r['sample_import_id'],$r['value'],$r['comparison']);
} }
$updatequota = true; $updatequota = true;
@@ -1829,16 +1809,16 @@ function update_row_quota($questionnaire_id,$case_id = false)
if ($updatequota) if ($updatequota)
{ {
if ($completions >= $r['completions']) if ($completions >= $target_completions)
{ {
//set row quota to reached //set row quota to reached
$sql = "UPDATE questionnaire_sample_quota_row $sql = "UPDATE questionnaire_sample_quota_row
SET quota_reached = '1', current_completions = '$completions' SET quota_reached = '1', current_completions = '$completions'
WHERE questionnaire_sample_quota_row_id = {$r['questionnaire_sample_quota_row_id']}"; WHERE questionnaire_sample_quota_row_id = '$qsqri'";
$db->Execute($sql); $db->Execute($sql);
close_row_quota($r['questionnaire_sample_quota_row_id'],false); //don't update priorires just yet close_row_quota($qsqri,false); //don't update priorires just yet
$update = true; $update = true;
} }
else else
@@ -1847,33 +1827,64 @@ function update_row_quota($questionnaire_id,$case_id = false)
SET current_completions = '$completions' "; SET current_completions = '$completions' ";
//If autopriority is set update it here //If autopriority is set update it here
if ($r['autoprioritise'] == 1) if ($autoprioritise == 1)
{ {
//priority is 100 - the percentage of completions //priority is 100 - the percentage of completions
$pr = 100 - round(100 * ($completions / $r['completions'])); $pr = 100 - round(100 * ($completions / $target_completions));
$sql .= ", priority = '$pr' "; $sql .= ", priority = '$pr' ";
//need to update quotas now //need to update quotas now
$update = true; $update = true;
} }
$sql .= " WHERE questionnaire_sample_quota_row_id = {$r['questionnaire_sample_quota_row_id']}"; $sql .= " WHERE questionnaire_sample_quota_row_id = '$qsqri'";
$db->Execute($sql); $db->Execute($sql);
} }
}
return $update;
} }
/**
* Update the row quota table
*
* @param int $questionnaire_id The questionnaire ID to update
* @param int|bool $case_id The case id if known to limit the scope of the search
*/
function update_row_quota($questionnaire_id,$case_id = false)
{
global $db;
$update = false; //whether to update priorities (only if changed)
$db->StartTrans();
$sql = "SELECT qsq.questionnaire_sample_quota_row_id
FROM questionnaire_sample_quota_row as qsq
WHERE qsq.questionnaire_id = '$questionnaire_id'
AND qsq.quota_reached != '1'
GROUP BY qsq.questionnaire_sample_quota_row_id";
$rs = $db->GetAll($sql);
if (isset($rs) && !empty($rs))
{
foreach ($rs as $r)
{
$tmp = update_single_row_quota($r['questionnaire_sample_quota_row_id'],$case_id);
if ($tmp)
$update = true;
} }
if ($update) update_quota_priorities($questionnaire_id);
} }
if ($update)
update_quota_priorities($questionnaire_id);
$db->CompleteTrans(); $db->CompleteTrans();
return false; return false;
} }
/** /**