* @copyright Deakin University 2007,2008 * @package queXS * @subpackage user * @link http://www.deakin.edu.au/dcarf/ queXS was writen for DCARF - Deakin Computer Assisted Research Facility * @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"); /** * Authentication */ require ("auth-interviewer.php"); /** * XHTML functions */ include ("functions/functions.xhtml.php"); /** * Calendar functions */ include("functions/functions.calendar.php"); /** * Operator functions */ include("functions/functions.operator.php"); /** * Input functions */ include("functions/functions.input.php"); /** * LimeSurvey functions */ include("functions/functions.limesurvey.php"); /** * Display appropriate outcomes based on current call attempt status * * @param int $contacted 0 for not contacted, 1 for contacted (a person on the phone) * @param int $ca Call attempt id * @param int $case_id The Case id * */ function display_outcomes($contacted,$ca,$case_id) { global $db; $completed = limesurvey_is_completed($case_id); //see if the case is completed if ($completed) { $sql = "SELECT outcome_id,description FROM outcome WHERE outcome_id = 10"; } else if (limesurvey_is_quota_full($case_id)) { $sql = "SELECT outcome_id,description FROM outcome WHERE outcome_id = 32"; } else { //see if we have made an appointment on this call attempt $sql = "SELECT appointment_id FROM appointment WHERE completed_call_id IS NULL AND call_attempt_id = '$ca'"; $rs = $db->GetAll($sql); $outcomes = $db->GetOne("SELECT q.outcomes FROM `questionnaire` as q JOIN `case` as c ON (c.questionnaire_id =q.questionnaire_id) WHERE c.case_id = $case_id"); if (!empty($rs)) { //we have an appointment made ... only select appointment ID's $sql = "SELECT outcome_id,description FROM outcome WHERE outcome_type_id = '5' AND outcome_id IN ($outcomes)"; } else { if ($contacted === false) $ctd = ""; else { $contacted = bigintval($contacted); $ctd = "AND contacted = '$contacted'"; } $sql = "SELECT outcome_id,description FROM outcome WHERE outcome_type_id != '5' $ctd AND outcome_id IN ($outcomes) AND outcome_id NOT IN(10,32,42,43,44,45)"; //don't show completed if not, Lime_Quota_full if not, hide max calls as they supposed to be automatic or admin-privileged } } $rs = $db->GetAll($sql); print "
"; if (!empty($rs)) { $lime_sid = get_limesurvey_id(get_operator_id()); //Check to see if we have sent an email on this call and set the default outcome $sql = "SELECT 41 FROM `case` as c, " . LIME_PREFIX . "tokens_$lime_sid as t WHERE t.sent = '$ca' AND c.case_id = $case_id AND t.token = c.token"; $do = $db->GetOne($sql); if (isset($_GET['defaultoutcome'])) $do = bigintval($_GET['defaultoutcome']); foreach($rs as $r) { if ($do == $r['outcome_id']) $selected = "checked='checked'"; else $selected = ""; print "
"; } } print "
"; } //display the respondents phone numbers as a drop down list for this call global $db; $db->StartTrans(); $operator_id = get_operator_id(); if (isset($_POST['submit'])) { if (isset($_POST['contact_phone'])) { $contact_phone_id = bigintval($_POST['contact_phone']); $call_attempt_id = get_call_attempt($operator_id,false); $respondent_id = get_respondent_id($call_attempt_id); $call_id = get_call($operator_id,$respondent_id,$contact_phone_id,true); if ($call_id) { if (is_voip_enabled($operator_id)) { include("functions/functions.voip.php"); $v = new voip(); $v->connect(VOIP_SERVER); $v->dial(get_extension($operator_id),get_call_number($call_id)); } $btext = "onload='openParentObject(\"main-content\",\"" . get_respondentselection_url($operator_id) . "\"); parent.closePopup();'"; $js = "js/window.js"; if (browser_ie()) $js = "js/window_ie6.js"; xhtml_head(T_("Call"),true,array("css/call.css"),array($js),$btext,false,false,false,false); } } else if (isset($_POST['outcome'])) { $outcome_id = bigintval($_POST['outcome']); end_call($operator_id,$outcome_id); if (is_voip_enabled($operator_id)) { include("functions/functions.voip.php"); $v = new voip(); $v->connect(VOIP_SERVER); $v->hangup(get_extension($operator_id)); } //disable recording $newtext = T_("Start REC"); $js = "js/window.js"; if (browser_ie()) $js = "js/window_ie6.js"; xhtml_head(T_("Call"),true,array("css/call.css"),array($js),"onload='toggleRec(\"$newtext\",\"record.php?start=start\",\"offline\"); openParentObject(\"main-content\",\"" . get_respondentselection_url($operator_id) . "\"); parent.closePopup();'",false,false,false,false); } else { //if no outcome selected, just hang up the call if (is_voip_enabled($operator_id)) { include("functions/functions.voip.php"); $v = new voip(); $v->connect(VOIP_SERVER); $v->hangup(get_extension($operator_id)); } //disable recording $newtext = T_("Start REC"); $js = "js/window.js"; if (browser_ie()) $js = "js/window_ie6.js"; xhtml_head(T_("Call"),true,array("css/call.css"),array($js),"onload='toggleRec(\"$newtext\",\"record.php?start=start\",\"offline\"); openParentObject(\"main-content\",\"" . get_respondentselection_url($operator_id) . "\"); parent.closePopup();'",false,false,false,false); } print "

"; //for XHTML xhtml_foot(); $db->CompleteTrans(); exit(); } $call_attempt_id = get_call_attempt($operator_id,false); $case_id = get_case_id($operator_id); /** * Set the state manually if necessary (i.e if VOIP state is playing up) */ if (isset($_GET['newstate'])) { $ns = bigintval($_GET['newstate']); $sql = "UPDATE `call` SET state = '$ns' WHERE case_id = '$case_id' AND operator_id = '$operator_id' AND call_attempt_id = '$call_attempt_id' AND outcome_id = '0'"; $db->Execute($sql); } $js = "js/window.js"; if (browser_ie()) $js = "js/window_ie6.js"; xhtml_head(T_("Call"),true,array("css/call.css"),array($js,"include/jquery/jquery-1.4.2.min.js"),false,false,false,false,false); $state = is_on_call($operator_id); switch($state) { case false: //no call made case 0: //not called -- shouldn't come here as we should create requesting call immediately print "
" . T_("Not on a call") . "
"; //if we are on an appointment, we will just call the specified number for the appointment $appointment_id = is_on_appointment($call_attempt_id); if ($appointment_id) { if (isset($_GET['end'])) { //end the case if (!isset($_GET['end'])) print "
" . T_("End work") . "
"; print "

" . T_("End case") . "

"; print "

" . T_("End work") . "

"; } else { //determine whether to begin calling based on extension status $es = 1; if (is_voip_enabled($operator_id)) { if (get_extension_status($operator_id)) $es = 1; else $es = 0; } if ($es) { $sql = "SELECT c.* FROM contact_phone as c, appointment as a WHERE a.appointment_id = '$appointment_id' AND a.contact_phone_id = c.contact_phone_id"; $r = $db->GetRow($sql); print "
" . T_("Press the call button to dial the number for this appointment:") . "
"; print "
"; print "

" . T_("Number to call:") . " {$r['phone']} - {$r['description']}

"; print "
"; } else print "
" . T_("Your VoIP extension is not enabled. Please close this window and enable VoIP by clicking once on the red button that says 'VoIP Off'") . "
"; } } else { //determine whether we should make any more calls based on the last call outcome $sql = "SELECT o.tryanother, o.require_note FROM `call` as c, `outcome` as o WHERE c.call_attempt_id = '$call_attempt_id' AND c.outcome_id = o.outcome_id ORDER BY call_id DESC LIMIT 1"; $rs = $db->GetRow($sql); if (!isset($_GET['end']) && (empty($rs) || $rs['tryanother'] == 1)) //dial another number only when available and not ending { $rn = 0; if (!empty($rs) && $rs['require_note'] == 1) $rn = 1; //an exclusion left join $sql = "SELECT c. * FROM contact_phone AS c LEFT JOIN ( SELECT contact_phone.contact_phone_id FROM contact_phone LEFT JOIN `call` ON ( call.contact_phone_id = contact_phone.contact_phone_id ) LEFT JOIN outcome ON ( call.outcome_id = outcome.outcome_id ) WHERE contact_phone.case_id = '$case_id' AND outcome.tryagain =0 ) AS l ON l.contact_phone_id = c.contact_phone_id LEFT JOIN ( SELECT contact_phone_id FROM `call` WHERE call_attempt_id = '$call_attempt_id' AND outcome_id != 18 ) as ca on ca.contact_phone_id = c.contact_phone_id WHERE c.case_id = '$case_id' AND l.contact_phone_id IS NULL AND ca.contact_phone_id IS NULL"; //only select numbers that should be tried again and have not been tried in this attempt which are not the accidental hang up outcome //could be updated to take in to account the time delay and outcome $rs = $db->GetAll($sql); if (!empty($rs)) { //determine whether to begin calling based on extension status $es = 1; if (is_voip_enabled($operator_id)) { if (get_extension_status($operator_id)) $es = 1; else $es = 0; } if ($es) { print "
" . T_("Select phone number to dial:") . "
"; print "
"; } else print "
" . T_("Your VoIP extension is not enabled. Please close this window and enable VoIP by clicking once on the red button that says 'VoIP Off'") . "
"; } else //no phone numbers left { //end the case print "
" . T_("The last call completed this call attempt") . "
"; if ($rn) // a note is required to be entered { print "




"; //give focus on load print ''; //put these lower on the screen so they don't get "automatically" clicked print "

" . T_("End case") . "

"; print "

" . T_("End work") . "

"; } else { print "

" . T_("End case") . "

"; print "

" . T_("End work") . "



"; print ''; print "

" . T_("End case") . "

"; print "

" . T_("End work") . "

"; } else { if (!isset($_GET['end'])) print "
" . T_("The last call completed this call attempt") . "
"; print "

" . T_("End case") . "

"; print "

" . T_("End work") . "

"; } } } break; case 1: //requesting call print "
" . T_("Requesting call") . "
"; print "
" . T_("Call Answered") . "
"; print "
"; display_outcomes(0,$call_attempt_id,$case_id); print "
"; break; case 2: //ringing print "
" . T_("Ringing") . "
"; print "
" . T_("Call Answered") . "
"; print "
"; display_outcomes(0,$call_attempt_id,$case_id); print "
"; break; case 3: //answered print "
" . T_("Answered") . "
"; print "
" . T_("Not Answered") . "
"; print "
"; display_outcomes(1,$call_attempt_id,$case_id); print "
"; break; case 4: //requires coding case 6: print "
" . T_("Requires coding") . "
"; print "
"; display_outcomes(false,$call_attempt_id,$case_id); print "
"; break; case 5: //done -- shouldn't come here as should be coded + done default: print "
" . T_("Error: Close window") . "
"; break; } xhtml_foot(); $db->CompleteTrans(); ?>