From 38d59dd4b7b4ab4ea44e386b32d7eba132cbe31f Mon Sep 17 00:00:00 2001 From: Adam Zammit Date: Mon, 9 Feb 2015 11:59:44 +1100 Subject: [PATCH] New Feature: Allow time slots to be set on a sample by sample basis as well --- CHANGELOG | 9 ++ admin/index.php | 1 + admin/questionnairecatimeslotssample.php | 172 +++++++++++++++++++++++ admin/systemsortprocess.php | 2 + database/quexs.sql | 9 ++ functions/functions.operator.php | 2 + 6 files changed, 195 insertions(+) create mode 100644 admin/questionnairecatimeslotssample.php diff --git a/CHANGELOG b/CHANGELOG index 6a13703d..21de19e3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,12 @@ +Database updates: + +CREATE TABLE `questionnaire_sample_timeslot` ( +`questionnaire_id` bigint( 20 ) NOT NULL , +`sample_import_id` bigint( 20 ) NOT NULL , +`availability_group_id` bigint( 20 ) NOT NULL , +PRIMARY KEY ( `questionnaire_id` , `availability_group_id` , `sample_import_id` ) +) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; + queXS 1.11.1 - Changes since 1.11.0 Fixed Bug: Quota priority not able to override sort of last call made diff --git a/admin/index.php b/admin/index.php index a54c34fb..48d620d5 100644 --- a/admin/index.php +++ b/admin/index.php @@ -73,6 +73,7 @@ print "
  • " . T_("Availability and shift management") . "

  • "; print "
  • " . T_("Questionnaire progress") . "

    "; diff --git a/admin/questionnairecatimeslotssample.php b/admin/questionnairecatimeslotssample.php new file mode 100644 index 00000000..49c151ba --- /dev/null +++ b/admin/questionnairecatimeslotssample.php @@ -0,0 +1,172 @@ + + * @copyright Australian Consortium for Social and Political Research Inc (ACSPRI) 2011 + * @package queXS + * @subpackage admin + * @link http://www.acspri.org.au queXS was writen for ACSPRI + * @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"); + +global $db; + + +if (isset($_GET['questionnaire_id']) && isset($_GET['sample_import_id']) && isset($_GET['availability_group'])) +{ + //need to add availability_group to questionnaire + + $questionnaire_id = bigintval($_GET['questionnaire_id']); + $sample_import_id = bigintval($_GET['sample_import_id']); + $availability_group = bigintval($_GET['availability_group']); + + $sql = "INSERT INTO questionnaire_sample_timeslot (questionnaire_id,sample_import_id,availability_group_id) + VALUES('$questionnaire_id','$sample_import_id','$availability_group')"; + + $db->Execute($sql); + +} + +if (isset($_GET['questionnaire_id']) && isset($_GET['sample_import_id']) && isset($_GET['ravailability_group'])) +{ + //need to remove rsid from questionnaire + + $questionnaire_id = bigintval($_GET['questionnaire_id']); + $sample_import_id = bigintval($_GET['sample_import_id']); + $availability_group = bigintval($_GET['ravailability_group']); + + $sql = "DELETE FROM questionnaire_sample_timeslot + WHERE questionnaire_id = '$questionnaire_id' + AND sample_import_id = '$sample_import_id' + AND availability_group_id = '$availability_group'"; + + + $db->Execute($sql); +} + + +$questionnaire_id = false; +if (isset($_GET['questionnaire_id'])) $questionnaire_id = bigintval($_GET['questionnaire_id']); + +xhtml_head(T_("Assign call attempt time slots to questionnaire sample"),true,false,array("../js/window.js")); + +print "

    " . T_("Assigning call attempt time slots to questionnaires will only allow cases to be attempted in a time slot for the n + 1th time where it has been attempted at least n times in all assigned timeslots. Please note timeslots must cover all possible time periods otherwise no cases will be available during missing timeslots.") ."

    "; + +print "

    " . T_("Select a questionnaire from the list below") . "

    "; +display_questionnaire_chooser($questionnaire_id); + + +if ($questionnaire_id != false) +{ + print "

    " . T_("Select a sample from the list below") . "

    "; + + $sample_import_id = false; + if (isset($_GET['sample_import_id'])) $sample_import_id = bigintval($_GET['sample_import_id']); + display_sample_chooser($questionnaire_id,$sample_import_id); + + if ($sample_import_id !== false) + { + + $sql = "SELECT q.availability_group_id,a.description as description + FROM questionnaire_sample_timeslot as q, availability_group as a + WHERE q.availability_group_id = a.availability_group_id + AND q.questionnaire_id = '$questionnaire_id' + AND q.sample_import_id = '$sample_import_id'"; + + $qs = $db->GetAll($sql); + + if (empty($qs)) + { + print "

    " . T_("There are no call attempt time slots selected for this questionnaire sample") . "

    "; + } + else + { + print "

    " . T_("Call attempt time slots selected for this questionnaire sample") . "

    "; + foreach($qs as $q) + { + print "

    {$q['availability_group_id']} - {$q['description']} (" . T_("Click to unassign") . ")

    "; + } + } + + $sql = "SELECT si.availability_group_id,si.description + FROM availability_group as si + LEFT JOIN questionnaire_sample_timeslot as q ON (q.sample_import_id = '$sample_import_id' AND q.questionnaire_id = '$questionnaire_id' AND q.availability_group_id = si.availability_group_id) + WHERE q.questionnaire_id is NULL"; + + $qs = $db->GetAll($sql); + + if (!empty($qs)) + { + + + print "

    " . T_("Add a call attempt time slot to this questionnaire sample:") . "

    "; + ?> +
    +


    + + + "/>

    +
    + diff --git a/admin/systemsortprocess.php b/admin/systemsortprocess.php index f043c104..8de238df 100644 --- a/admin/systemsortprocess.php +++ b/admin/systemsortprocess.php @@ -244,10 +244,12 @@ while (!is_process_killed($process_id)) //check if process killed every $sleepin LEFT JOIN case_availability AS casa ON (casa.case_id = c.case_id) LEFT JOIN availability AS ava ON (ava.availability_group_id = casa.availability_group_id) LEFT JOIN questionnaire_timeslot AS qast ON (qast.questionnaire_id = c.questionnaire_id) + LEFT JOIN questionnaire_sample_timeslot AS qasts ON (qasts.questionnaire_id = c.questionnaire_id AND quasts.sample_import_id = si.sample_import_id) WHERE c.current_operator_id IS NULL AND c.questionnaire_id = '$questionnaire_id' AND ((apn.appointment_id IS NOT NULL) OR casa.case_id IS NULL OR (ava.day_of_week = DAYOFWEEK(CONVERT_TZ(NOW(),'System',s.Time_zone_name)) AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) >= ava.start AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) <= ava.end )) AND ((apn.appointment_id IS NOT NULL) OR qast.questionnaire_id IS NULL OR ((SELECT COUNT(*) FROM availability WHERE availability.availability_group_id = qast.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(NOW(),'System',s.Time_zone_name)) AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) <= availability.end)) >= 1 AND (SELECT COUNT(call_attempt_id) FROM `call_attempt`, availability WHERE call_attempt.case_id = c.case_id AND (availability.availability_group_id = qast.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(call_attempt.start,'UTC',s.Time_zone_name)) AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) <= availability.end))) = ( SELECT (SELECT COUNT(*) FROM availability, call_attempt WHERE call_attempt.case_id = c.case_id AND availability.availability_group_id = availability_group.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(call_attempt.start,'UTC',s.Time_zone_name)) AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) <= availability.end)) as cou FROM availability_group, questionnaire_timeslot WHERE questionnaire_timeslot.questionnaire_id = c.questionnaire_id AND availability_group.availability_group_id = questionnaire_timeslot.availability_group_id ORDER BY cou ASC LIMIT 1))) + AND ((apn.appointment_id IS NOT NULL) OR qasts.questionnaire_id IS NULL OR ((SELECT COUNT(*) FROM availability WHERE availability.availability_group_id = qasts.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(NOW(),'System',s.Time_zone_name)) AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) <= availability.end)) >= 1 AND (SELECT COUNT(call_attempt_id) FROM `call_attempt`, availability WHERE call_attempt.case_id = c.case_id AND (availability.availability_group_id = qasts.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(call_attempt.start,'UTC',s.Time_zone_name)) AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) <= availability.end))) = ( SELECT (SELECT COUNT(*) FROM availability, call_attempt WHERE call_attempt.case_id = c.case_id AND availability.availability_group_id = availability_group.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(call_attempt.start,'UTC',s.Time_zone_name)) AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) <= availability.end)) as cou FROM availability_group, questionnaire_sample_timeslot WHERE questionnaire_sample_timeslot.questionnaire_id = c.questionnaire_id AND questionnaire_sample_timeslot.sample_import_id = si.sample_import_id AND availability_group.availability_group_id = questionnaire_sample_timeslot.availability_group_id ORDER BY cou ASC LIMIT 1))) 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 ((qsep.questionnaire_id is NULL) or qsep.exclude = 0) diff --git a/database/quexs.sql b/database/quexs.sql index 1e443b29..f8ba9dba 100644 --- a/database/quexs.sql +++ b/database/quexs.sql @@ -1554,6 +1554,15 @@ CREATE TABLE `questionnaire_sample_quota_row_exclude` ( -- Dumping data for table `questionnaire_sample_quota_row_exclude` -- +CREATE TABLE `questionnaire_sample_timeslot` ( +`questionnaire_id` bigint( 20 ) NOT NULL , +`sample_import_id` bigint( 20 ) NOT NULL , +`availability_group_id` bigint( 20 ) NOT NULL , +PRIMARY KEY ( `questionnaire_id` , `availability_group_id` , `sample_import_id` ) +) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci; + +-- -------------------------------------------------------- + CREATE TABLE `questionnaire_timeslot` ( diff --git a/functions/functions.operator.php b/functions/functions.operator.php index d7a31d47..4f9b2be7 100644 --- a/functions/functions.operator.php +++ b/functions/functions.operator.php @@ -625,10 +625,12 @@ function get_case_id($operator_id, $create = false) LEFT JOIN case_availability AS casa ON (casa.case_id = c.case_id) LEFT JOIN availability AS ava ON (ava.availability_group_id = casa.availability_group_id) LEFT JOIN questionnaire_timeslot AS qast ON (qast.questionnaire_id = c.questionnaire_id) + LEFT JOIN questionnaire_sample_timeslot AS qasts ON (qasts.questionnaire_id = c.questionnaire_id AND quasts.sample_import_id = si.sample_import_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 ((apn.appointment_id IS NOT NULL) OR casa.case_id IS NULL OR (ava.day_of_week = DAYOFWEEK(CONVERT_TZ(NOW(),'System',s.Time_zone_name)) AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) >= ava.start AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) <= ava.end )) AND ((apn.appointment_id IS NOT NULL) OR qast.questionnaire_id IS NULL OR ((SELECT COUNT(*) FROM availability WHERE availability.availability_group_id = qast.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(NOW(),'System',s.Time_zone_name)) AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) <= availability.end)) >= 1 AND (SELECT COUNT(call_attempt_id) FROM `call_attempt`, availability WHERE call_attempt.case_id = c.case_id AND (availability.availability_group_id = qast.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(call_attempt.start,'UTC',s.Time_zone_name)) AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) <= availability.end))) = ( SELECT (SELECT COUNT(*) FROM availability, call_attempt WHERE call_attempt.case_id = c.case_id AND availability.availability_group_id = availability_group.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(call_attempt.start,'UTC',s.Time_zone_name)) AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) <= availability.end)) as cou FROM availability_group, questionnaire_timeslot WHERE questionnaire_timeslot.questionnaire_id = c.questionnaire_id AND availability_group.availability_group_id = questionnaire_timeslot.availability_group_id ORDER BY cou ASC LIMIT 1))) + AND ((apn.appointment_id IS NOT NULL) OR qasts.questionnaire_id IS NULL OR ((SELECT COUNT(*) FROM availability WHERE availability.availability_group_id = qasts.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(NOW(),'System',s.Time_zone_name)) AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(NOW(), 'System' , s.Time_zone_name)) <= availability.end)) >= 1 AND (SELECT COUNT(call_attempt_id) FROM `call_attempt`, availability WHERE call_attempt.case_id = c.case_id AND (availability.availability_group_id = qasts.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(call_attempt.start,'UTC',s.Time_zone_name)) AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) <= availability.end))) = ( SELECT (SELECT COUNT(*) FROM availability, call_attempt WHERE call_attempt.case_id = c.case_id AND availability.availability_group_id = availability_group.availability_group_id AND (availability.day_of_week = DAYOFWEEK(CONVERT_TZ(call_attempt.start,'UTC',s.Time_zone_name)) AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) >= availability.start AND TIME(CONVERT_TZ(call_attempt.start, 'UTC' , s.Time_zone_name)) <= availability.end)) as cou FROM availability_group, questionnaire_sample_timeslot WHERE questionnaire_sample_timeslot.questionnaire_id = c.questionnaire_id AND questionnaire_sample_timeslot.sample_import_id = si.sample_import_id AND availability_group.availability_group_id = questionnaire_sample_timeslot.availability_group_id ORDER BY cou ASC LIMIT 1))) 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 ((qsep.questionnaire_id is NULL) or qsep.exclude = 0)