From 7d6758e92440932c7b06631fc49fa6596d303635 Mon Sep 17 00:00:00 2001 From: azammitdcarf Date: Thu, 28 May 2009 22:32:57 +0000 Subject: [PATCH] Changed method of quota row calculation to be by listing in database --- admin/quotarow.php | 9 +++++++ database/quexs.sql | 17 +++++++++++++ functions/functions.operator.php | 43 ++++++++++++++++++++++++++++---- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/admin/quotarow.php b/admin/quotarow.php index b954c750..4105cb5e 100755 --- a/admin/quotarow.php +++ b/admin/quotarow.php @@ -99,11 +99,20 @@ if (isset($_GET['questionnaire_id']) && isset($_GET['questionnaire_sample_quota_ $questionnaire_id = bigintval($_GET['questionnaire_id']); $questionnaire_sample_quota_row_id = bigintval($_GET['questionnaire_sample_quota_row_id']); + $db->StartTrans(); + $sql = "DELETE FROM questionnaire_sample_quota_row WHERE questionnaire_sample_quota_row_id = '$questionnaire_sample_quota_row_id'"; $db->Execute($sql); + $sql = "DELETE FROM questionnaire_sample_quota_row_exclude + WHERE questionnaire_sample_quota_row_id = '$questionnaire_sample_quota_row_id'"; + + $db->Execute($sql); + + $db->CompleteTrans(); + } $questionnaire_id = false; diff --git a/database/quexs.sql b/database/quexs.sql index 1b152414..c4dc9ea8 100644 --- a/database/quexs.sql +++ b/database/quexs.sql @@ -540,6 +540,23 @@ CREATE TABLE IF NOT EXISTS `questionnaire_sample_quota_row` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; +-- -------------------------------------------------------- + +-- +-- Table structure for table `questionnaire_sample_quota_row_exclude` +-- + +CREATE TABLE IF NOT EXISTS `questionnaire_sample_quota_row_exclude` ( + `questionnaire_sample_quota_row_id` bigint(20) NOT NULL, + `questionnaire_id` bigint(20) NOT NULL, + `sample_id` bigint(20) NOT NULL, + PRIMARY KEY (`questionnaire_sample_quota_row_id`,`questionnaire_id`,`sample_id`), + KEY `questionnaire_id` (`questionnaire_id`), + KEY `sample_id` (`sample_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; + + + -- -------------------------------------------------------- -- diff --git a/functions/functions.operator.php b/functions/functions.operator.php index 1ba37809..9981543a 100644 --- a/functions/functions.operator.php +++ b/functions/functions.operator.php @@ -293,16 +293,17 @@ function get_case_id($operator_id, $create = false) LEFT JOIN appointment as ap on (ap.case_id = c.case_id AND ap.completed_call_id is NULL AND (ap.start > CONVERT_TZ(NOW(),'System','UTC'))) LEFT JOIN appointment as apn on (apn.case_id = c.case_id AND apn.completed_call_id is NULL AND (CONVERT_TZ(NOW(),'System','UTC') >= apn.start) AND (CONVERT_TZ(NOW(),'System','UTC') <= apn.end)) LEFT JOIN call_restrict as cr on (cr.day_of_week = DAYOFWEEK(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) and TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) >= cr.start and TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) <= cr.end) + LEFT JOIN questionnaire_sample_quota_row_exclude AS qsqre ON (qsqre.questionnaire_id = c.questionnaire_id AND qsqre.sample_id = c.sample_id) JOIN operator_skill as os on (os.operator_id = op.operator_id and os.outcome_type_id = ou.outcome_type_id) WHERE c.current_operator_id IS NULL AND (a.call_id is NULL or (a.end < CONVERT_TZ(DATE_SUB(NOW(), INTERVAL ou.default_delay_minutes MINUTE),'System','UTC'))) AND ap.case_id is NULL + AND qsqre.questionnaire_id is NULL AND !(q.restrict_work_shifts = 1 AND sh.shift_id IS NULL AND os.outcome_type_id != 2) AND !(si.call_restrict = 1 AND cr.day_of_week IS NULL AND os.outcome_type_id != 2) 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"; @@ -333,11 +334,13 @@ function get_case_id($operator_id, $create = false) LEFT JOIN `case` as c on (c.sample_id = s.sample_id and c.questionnaire_id = qs.questionnaire_id) LEFT JOIN call_restrict as cr on (cr.day_of_week = DAYOFWEEK(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) and TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) >= cr.start and TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) <= cr.end) LEFT JOIN shift as sh on (sh.questionnaire_id = q.questionnaire_id and (CONVERT_TZ(NOW(),'System','UTC') >= sh.start) AND (CONVERT_TZ(NOW(),'System','UTC') <= sh.end)) + LEFT JOIN questionnaire_sample_quota_row_exclude AS qsqre ON (qsqre.questionnaire_id = qs.questionnaire_id AND qsqre.sample_id = s.sample_id) + WHERE c.case_id is NULL + AND qsqre.questionnaire_id IS NULL 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"; @@ -974,7 +977,8 @@ function update_quota($questionnaire_id) $sql = "SELECT questionnaire_sample_quota_id,q.questionnaire_id,sample_import_id,lime_sgqa,value,comparison,completions,quota_reached,q.lime_sid FROM questionnaire_sample_quota as qsq, questionnaire as q WHERE qsq.questionnaire_id = '$questionnaire_id' - AND q.questionnaire_id = '$questionnaire_id'"; + AND q.questionnaire_id = '$questionnaire_id' + and qsq.quota_reached != '1'"; $rs = $db->GetAll($sql); @@ -1014,10 +1018,13 @@ 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 + $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,qsq.exclude_val FROM questionnaire_sample_quota_row as qsq, questionnaire as q WHERE qsq.questionnaire_id = '$questionnaire_id' - AND q.questionnaire_id = '$questionnaire_id'"; + AND q.questionnaire_id = '$questionnaire_id' + AND qsq.quota_reached != '1'"; $rs = $db->GetAll($sql); @@ -1039,10 +1046,36 @@ function update_row_quota($questionnaire_id) WHERE questionnaire_sample_quota_row_id = {$r['questionnaire_sample_quota_row_id']}"; $db->Execute($sql); + + + //only insert where we have to + $sql = "SELECT count(*) as c + FROM questionnaire_sample_quota_row_exclude + WHERE questionnaire_sample_quota_row_id = '{$r['questionnaire_sample_quota_row_id']}'"; + + $coun = $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 {$r['questionnaire_sample_quota_row_id']},'$questionnaire_id',s.sample_id + FROM sample as s, sample_var as sv + WHERE s.import_id = '{$r['sample_import_id']}' + AND s.sample_id = sv.sample_id + AND sv.var = '{$r['exclude_var']}' + AND '{$r['exclude_val']}' LIKE sv.val"; + + $db->Execute($sql); + } + } + } } + $db->CompleteTrans(); + return false; }