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

merged rev.448

!! requires check and update to operate with samle_var_id, exclude_var_id, 

Required  layout rework to prev. model + bootstrap
This commit is contained in:
Alex
2015-06-26 16:28:10 +03:00
8 changed files with 2420 additions and 1616 deletions

View File

@@ -1466,6 +1466,17 @@ function open_row_quota($questionnaire_sample_quota_row_id,$delete = true)
WHERE questionnaire_sample_quota_row_id = '$questionnaire_sample_quota_row_id'";
$db->Execute($sql);
$sql = "DELETE FROM qsqr_sample
WHERE questionnaire_sample_quota_row_id = '$questionnaire_sample_quota_row_id'";
$db->Execute($sql);
$sql = "DELETE FROM qsqr_question
WHERE questionnaire_sample_quota_row_id = '$questionnaire_sample_quota_row_id'";
$db->Execute($sql);
}
$sql = "DELETE FROM questionnaire_sample_quota_row_exclude
@@ -1506,16 +1517,28 @@ function close_row_quota($questionnaire_sample_quota_row_id,$update = true)
$rs = $db->GetRow($sql);
if (isset($coun['c']) && $coun['c'] == 0)
{
//store list of sample records to exclude
$sql = "INSERT INTO questionnaire_sample_quota_row_exclude (questionnaire_sample_quota_row_id,questionnaire_id,sample_id)
SELECT $questionnaire_sample_quota_row_id,qs.questionnaire_id,s.sample_id
FROM sample as s, sample_var as sv, questionnaire_sample_quota_row as qs
WHERE s.import_id = qs.sample_import_id
AND qs.questionnaire_sample_quota_row_id = $questionnaire_sample_quota_row_id
AND s.sample_id = sv.sample_id
AND sv.var_id = qs.exclude_var_id
AND qs.exclude_val LIKE sv.val";
{
$sql2 = "SELECT exclude_val,exclude_var,exclude_var_id,comparison
FROM qsqr_sample
WHERE questionnaire_sample_quota_row_id = $questionnaire_sample_quota_row_id";
$rev = $db->GetAll($sql2);
//store list of sample records to exclude
$sql = "INSERT INTO questionnaire_sample_quota_row_exclude (questionnaire_sample_quota_row_id,questionnaire_id,sample_id)
SELECT $questionnaire_sample_quota_row_id,qs.questionnaire_id,s.sample_id
FROM sample as s ";
//reduce sample by every item in the qsqr_sample table
$x = 1;
foreach($rev as $ev)
{
$sql .= " JOIN sample_var as sv$x ON (sv$x.sample_id = s.sample_id AND sv$x.var_id = '{$ev['exclude_var_id']}' AND sv$x.val {$ev['comparison']} '{$ev['exclude_val']}') ";
$x++;
}
$sql = "JOIN questionnaire_sample_quota_row as qs ON (qs.questionnaire_sample_quota_row_id = $questionnaire_sample_quota_row_id)
WHERE s.import_id = qs.sample_import_id";
$db->Execute($sql);
@@ -1539,22 +1562,35 @@ function close_row_quota($questionnaire_sample_quota_row_id,$update = true)
* @param int $questionnaire_id
* @param int $sample_import_id
* @param int $copy_sample_import_id The sample_import_id to copy to
* @param bool $blocking Block (copy quota)?
*/
function copy_row_quota($questionnaire_id,$sample_import_id,$copy_sample_import_id)
function copy_row_quota($questionnaire_id,$sample_import_id,$copy_sample_import_id, $block = false)
{
global $db;
$db->StartTrans();
//Set quota_reached to 0 always
//Set quota_reached to 0 always if not blocking
$b = 0;
if ($block == true)
$b = "quota_reached";
$sql = "INSERT INTO questionnaire_sample_quota_row (questionnaire_id,sample_import_id,lime_sgqa,value,comparison,completions,exclude_var_id,exclude_var,exclude_val,quota_reached,description)
SELECT questionnaire_id, $copy_sample_import_id, lime_sgqa,value,comparison,completions,exclude_var_id,exclude_var,exclude_val,0,description
$sql = "INSERT INTO questionnaire_sample_quota_row (questionnaire_id,sample_import_id,completions,quota_reached,description)
SELECT questionnaire_id, $copy_sample_import_id, completions,$b,description
FROM questionnaire_sample_quota_row
WHERE questionnaire_id = '$questionnaire_id'
AND sample_import_id = '$sample_import_id'";
$db->Execute($sql);
$db->Execute($sql);
$nqsqr = $db->Insert_ID();
$sql = "INSERT INTO qsqr_sample (questionnaire_sample_quota_row_id,exclude_var_id,exclude_var,exclude_val,comparison,description)
SELECT $nqsqr, qs.exclude_var_id, qs.exclude_var, qs.exclude_val, qs.comparison, qs.description
FROM qsqr_sample as qs, questionnaire_sample_quota_row as q
WHERE qs.questionnaire_sample_quota_row_id = q.questionnaire_sample_quota_row_id
AND q.questionnaire_id = '$questionnaire_id'
AND q.sample_import_id = '$sample_import_id'";
update_quotas($questionnaire_id);
@@ -1571,22 +1607,7 @@ function copy_row_quota($questionnaire_id,$sample_import_id,$copy_sample_import_
*/
function copy_row_quota_with_blocking($questionnaire_id,$sample_import_id,$copy_sample_import_id)
{
global $db;
$db->StartTrans();
//Set quota_reached to 0 always
$sql = "INSERT INTO questionnaire_sample_quota_row (questionnaire_id,sample_import_id,lime_sgqa,value,comparison,completions,exclude_var_id,exclude_var,exclude_val,quota_reached,description)
SELECT questionnaire_id, $copy_sample_import_id, lime_sgqa,value,comparison,completions, exclude_var_id,exclude_var,exclude_val, quota_reached,description
FROM questionnaire_sample_quota_row
WHERE questionnaire_id = '$questionnaire_id'
AND sample_import_id = '$sample_import_id'";
$db->Execute($sql);
update_quotas($questionnaire_id);
copy_row_quota($questionnaire_id,$sample_import_id,$copy_sample_import_id,true);
$db->CompleteTrans();
}
@@ -1605,6 +1626,7 @@ function copy_row_quota_with_adjusting($questionnaire_id,$sample_import_id,$copy
// Copy quotas (defalt Quexs function)
copy_row_quota_with_blocking($questionnaire_id,$sample_import_id,$copy_sample_import_id);
/*
$db->StartTrans();
// Select quotas from the old sample rows and calculate
@@ -1645,7 +1667,186 @@ function copy_row_quota_with_adjusting($questionnaire_id,$sample_import_id,$copy
}
}
$db->CompleteTrans();
$db->CompleteTrans();
*/
}
/**
* Update a single row quota
*
* @param int $qsqri The quota row id
* @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_single_row_quota($qsqri,$case_id = false)
{
global $db;
$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";
$rs = $db->GetRow($sql);
$lime_sid = $rs['lime_sid'];
$questionnaire_id = $rs['questionnaire_id'];
$sample_import_id = $rs['sample_import_id'];
$target_completions = $rs['completions'];
$autoprioritise = $rs['autoprioritise'];
//all variables to exclude for this row quota
$sql2 = "SELECT exclude_val,exclude_var,exclude_var_id,comparison
FROM qsqr_sample
WHERE questionnaire_sample_quota_row_id = $qsqri";
$rev = $db->GetAll($sql2);
//all variables to check in limesurvey for this row quota
$sql2 = "SELECT lime_sgqa,value,comparison
FROM qsqr_question
WHERE questionnaire_sample_quota_row_id = $qsqri";
$qev = $db->GetAll($sql2);
//whether a completion was changed for this quota
$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
//the quota criteria, and if so, increment the quota completions counter
if ($case_id != false)
{
if (empty($qev))
{
//just determine if this case is linked to a matching sample record
$sql2 = "SELECT count(*) as c
FROM " . LIME_PREFIX . "survey_$lime_sid as s
JOIN `case` as c ON (c.case_id = '$case_id')
JOIN `sample` as sam ON (c.sample_id = sam.sample_id) ";
$x = 1;
foreach($rev as $ev)
{
$sql2 .= " JOIN sample_var as sv$x ON (sv$x.sample_id = sam.sample_id AND sv$x.var_id = '{$ev['exclude_var_id']}' AND sv$x.val {$ev['comparison']} '{$ev['exclude_val']}') ";
$x++;
}
$sql2 .= " WHERE s.token = c.token";
$match = $db->GetOne($sql2);
}
else
{
//determine if the case is linked to a matching limesurvey record
$sql2 = "SELECT count(*) as c
FROM " . LIME_PREFIX . "survey_$lime_sid as s
JOIN `case` as c ON (c.case_id = '$case_id')
JOIN `sample` as sam ON (c.sample_id = sam.sample_id)
WHERE s.token = c.token
";
foreach($qev as $ev)
$sql2 .= " AND s.`{$ev['lime_sgqa']}` {$ev['comparison']} '{$ev['value']}' ";
$match = $db->GetOne($sql2);
}
if ($match == 1)
{
//increment completions
$sql = "SELECT (current_completions + 1) as c
FROM questionnaire_sample_quota_row
WHERE questionnaire_sample_quota_row_id = '$qsqri'";
$cc = $db->GetRow($sql);
$completions = $cc['c'];
$updatequota = true;
}
}
else
{
if (empty($qev))
{
//find all completions from cases with matching sample records
$sql2 = "SELECT count(*) as c
FROM " . LIME_PREFIX . "survey_$lime_sid as s
JOIN `case` as c ON (c.questionnaire_id = '$questionnaire_id')
JOIN `sample` as sam ON (c.sample_id = sam.sample_id AND sam.import_id = '$sample_import_id')";
$x = 1;
foreach($rev as $ev)
{
$sql2 .= " JOIN sample_var as sv$x ON (sv$x.sample_id = sam.sample_id AND sv$x.var_id = '{$ev['exclude_var_id']}' AND sv$x.val {$ev['comparison']} '{$ev['exclude_val']}') ";
$x++;
}
$sql2 .= " WHERE s.submitdate IS NOT NULL
AND s.token = c.token";
$completions = $db->GetOne($sql2);
}
else
{
//find all completions from cases with matching limesurvey records
$sql2 = "SELECT count(*) as c
FROM " . LIME_PREFIX . "survey_$lime_sid as s
JOIN `case` as c ON (c.questionnaire_id = '$questionnaire_id')
JOIN `sample` as sam ON (c.sample_id = sam.sample_id AND sam.import_id = '$sample_import_id')
WHERE s.submitdate IS NOT NULL
AND s.token = c.token ";
foreach($qev as $ev)
$sql2 .= " AND s.`{$ev['lime_sgqa']}` {$ev['comparison']} '{$ev['value']}' ";
$completions = $db->GetOne($sql2);
}
$updatequota = true;
}
if ($updatequota)
{
if ($completions >= $target_completions)
{
//set row quota to reached
$sql = "UPDATE questionnaire_sample_quota_row
SET quota_reached = '1', current_completions = '$completions'
WHERE questionnaire_sample_quota_row_id = '$qsqri'";
$db->Execute($sql);
close_row_quota($qsqri,false); //don't update priorires just yet
$update = true;
}
else
{
$sql = "UPDATE questionnaire_sample_quota_row
SET current_completions = '$completions' ";
//If autopriority is set update it here
if ($autoprioritise == 1)
{
//priority is 100 - the percentage of completions
$pr = 100 - round(100 * ($completions / $target_completions));
$sql .= ", priority = '$pr' ";
//need to update quotas now
$update = true;
}
$sql .= " WHERE questionnaire_sample_quota_row_id = '$qsqri'";
$db->Execute($sql);
}
}
return $update;
}
@@ -1663,106 +1864,30 @@ function update_row_quota($questionnaire_id,$case_id = false)
$db->StartTrans();
$sql = "SELECT questionnaire_sample_quota_row_id,q.questionnaire_id,sample_import_id,lime_sgqa,value,comparison,completions,quota_reached,q.lime_sid, qsq.exclude_var_id,qsq.exclude_var,qsq.exclude_val,qsq.current_completions,qsq.priority,qsq.autoprioritise
FROM questionnaire_sample_quota_row as qsq, questionnaire as q
$sql = "SELECT qsq.questionnaire_sample_quota_row_id
FROM questionnaire_sample_quota_row as qsq
WHERE qsq.questionnaire_id = '$questionnaire_id'
AND q.questionnaire_id = '$questionnaire_id'
AND qsq.lime_sgqa != -1";
AND qsq.quota_reached != '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)
{
//whether a completion was changed for this quota
$updatequota = false;
//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
if ($case_id != false)
{
if ($r['lime_sgqa'] == -2)
$match = limesurvey_quota_replicate_match($r['lime_sid'],$case_id,$r['exclude_val'],$r['exclude_var_id'],$r['sample_import_id']);
else
$match = limesurvey_quota_match($r['lime_sgqa'],$r['lime_sid'],$case_id,$r['value'],$r['comparison'],$r['sample_import_id']);
if ($match == 1)
{
//increment completions
$sql = "SELECT (current_completions + 1) as c
FROM questionnaire_sample_quota_row
WHERE questionnaire_sample_quota_row_id = {$r['questionnaire_sample_quota_row_id']}";
$cc = $db->GetRow($sql);
$completions = $cc['c'];
$updatequota = true;
}
}
else
{
if ($r['lime_sgqa'] == -2)
$completions = limesurvey_quota_replicate_completions($r['lime_sid'],$r['questionnaire_id'],$r['sample_import_id'],$r['exclude_val'],$r['exclude_var_id']);
else
$completions = limesurvey_quota_completions($r['lime_sgqa'],$r['lime_sid'],$r['questionnaire_id'],$r['sample_import_id'],$r['value'],$r['comparison']);
$updatequota = true;
}
if ($updatequota)
{
if ($completions >= $r['completions'])
{
//set row quota to reached
$sql = "UPDATE questionnaire_sample_quota_row
SET quota_reached = '1', current_completions = '$completions'
WHERE questionnaire_sample_quota_row_id = {$r['questionnaire_sample_quota_row_id']}";
$db->Execute($sql);
close_row_quota($r['questionnaire_sample_quota_row_id'],false); //don't update priorires just yet
$update = true;
}
else
{
$sql = "UPDATE questionnaire_sample_quota_row
SET current_completions = '$completions' ";
//If autopriority is set update it here
if ($r['autoprioritise'] == 1)
{
//priority is 100 - the percentage of completions
$pr = 100 - round(100 * ($completions / $r['completions']));
if ($pr < 0)
$pr = 0;
$sql .= ", priority = '$pr' ";
//need to update quotas now
$update = true;
}
$sql .= " WHERE questionnaire_sample_quota_row_id = {$r['questionnaire_sample_quota_row_id']}";
$db->Execute($sql);
}
}
}
if ($update) update_quota_priorities($questionnaire_id);
}
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);
$db->CompleteTrans();
return false;
}
/**
@@ -1825,16 +1950,39 @@ function update_quota_priorities($questionnaire_id)
$qsqri = $r['questionnaire_sample_quota_row_id'];
$priority = $r['priority'];
$sql2 = "SELECT exclude_val,exclude_var,exclude_var_id,comparison
FROM qsqr_sample
WHERE questionnaire_sample_quota_row_id = $qsqri";
$rev = $db->GetAll($sql2);
//find all cases that match this quota, and update it to the new priority
$sql = "UPDATE sample as s, sample_var as sv, questionnaire_sample_quota_row as qs, questionnaire_sample_exclude_priority as qsep
$sql = "UPDATE sample as s, questionnaire_sample_quota_row as qs, questionnaire_sample_exclude_priority as qsep ";
//reduce sample by every item in the qsqr_sample table
$x = 1;
foreach ($rev as $ev)
{
$sql .= ", sample_var as sv$x";
$x++;
}
$sql .= "
SET qsep.priority = '$priority'
WHERE s.import_id = qs.sample_import_id
AND qs.questionnaire_sample_quota_row_id = '$qsqri'
AND s.sample_id = sv.sample_id
AND sv.var_id = qs.exclude_var_id
AND qs.exclude_val LIKE sv.val
AND s.sample_id = sv$x.sample_id
AND sv$x.var_id = qs.exclude_var_id
AND qsep.questionnaire_id = qs.questionnaire_id
AND qsep.sample_id = s.sample_id";
AND qsep.sample_id = s.sample_id ";
$x = 1;
foreach ($rev as $ev)
{
$sql .= " AND sv$x.sample_id = s.sample_id AND sv$x.var_id = '{$ev['exclude_var_id']}' AND sv$x.val {$ev['comparison']} '{$ev['exclude_val']}' ";
$x++;
}
$db->Execute($sql);