Location: PHPKode > projects > Lite Outbound Manager > outbound/query_server.php
<?php
#THIS FILE HANDLES QUERIES ON DB
#required by nominativo.php
#


if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

//trasforma da formato italiano data a formato per DB mysql- TODO SWITCH CASE per today, tomorrow
function makeDbDate($date) {
	
	switch($date){
		
		case "": return "00"; break;//TODO: rivedere gestione POST['data'] /ora se esito != da richiamare
		
		case "today": return  date("ymd", time()); break;
		
		case "tomorrow": return  date("ymd", time()+86400); break;
		
		default:
				list($month, $day, $year) = split('[-: /]', $date);
				$arr_date=array($year, $month, $day);
				return implode($arr_date); break;
	}
}

//gestisce la pagina di rientro dopo la modifica contatto. Se sono ADMIN, dopo l'update del contatto torno ad admin.php
$editFormAction = $_SERVER['PHP_SELF'];
if ($_GET['operatore']=='ADMIN') $editFormAction="admin.php";


//verifico che il referrer non sia la pagina corrente (è stato utilizzo refresh), altrimenti logout utente
//TODO: gestire recupero da utente
if(isset($_SESSION['uri_referer'])){
	if($_SESSION['uri_referer']==$_SERVER['PHP_SELF'])
		header("Location: index.php?call_error=true");
	}
else header("Location: index.php");		
		
//setto questa pagina come referr
$_SESSION['uri_referer'] = $_SERVER['PHP_SELF'];


//setto la ID della chiamata corrente (chiave della tabella calls)
//se la chiamata è nuova
if(!isset($_GET['id']) && !isset($_POST["MM_update"])){
	$_SESSION["CALL_ID"]=time().$_GET['operatore'];
	$call_id=$_SESSION["CALL_ID"];
//se richiedo accesso ad un contatto specifico (es. richiamare)	
}else if (isset($_GET['id']) && !isset($_POST["MM_update"])) {	
	$_SESSION['call_id']=$_GET['id'];
	$call_id=$_SESSION['call_id'];
//se sto salvando il contatto
}else if (!isset($_GET['id']) && isset($_POST["MM_update"])) $call_id=$_POST['call_id'];



//aggiorno DB con l'esito della chiamata  - solo se la pagina viene chiamata dopo aver esitato la chiamata (POST ATTIVE)
if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "esito_chiamata") && ($_POST['stato_contatto']!=$_POST['no_reply'])) {
	
	if($_POST['day']!="other_d") $_POST['date']=$_POST['day']; //seleziona se: oggi,domani o altra data(in base al radio butt)
  
  $updateSQL = sprintf("UPDATE CALLS SET IN_PROGRESS='0', STATO_CONTATTO=%s, ESITO=%s, MOTIVAZIONE=%s, NOTE=%s, IS_FINAL_STATUS=1 WHERE ID=%s",
					   GetSQLValueString($_POST['stato_contatto'], "text"),
                       GetSQLValueString($_POST['esito'], "text"),
                       GetSQLValueString($_POST['motivazione'], "text"),
					   GetSQLValueString($_POST['note'], "text"),
                       GetSQLValueString($call_id, "text"));
	
  	$Result1 = mysql_query($updateSQL, $outbound) or die('error'.mysql_error());
	
	//controllo il numero di record aggiornati, se non esiste il record della chiamata aperta è un errore
	if(mysql_affected_rows()<1)
		$no_rows_updated=true;
		
	
	//se ci sono dati per il richiamare aggiorno tabella appuntamenti
	if(isset($_POST['is_recall']) && ($_POST['is_recall']=="true")){
		
		$recall_date=makeDbDate($_POST['date']);
		$recall_hour=$_POST['hour'].$_POST['min']."00";
		$recallSQL="INSERT INTO APPOINTMENTS (CALL_ID, CUSTOMER_ID, DATA_RICHIAMARE, ORA_RICHIAMARE)
		VALUES (\"".$call_id."\", \"".$_POST['id']."\",\"".$recall_date."\", \"".$recall_hour."\")";
		
  		$insertRecall = mysql_query($recallSQL, $outbound) or die(mysql_error());
	}
	//dopo l'update del nominativo faccio redirect su desktop.php. ATTENZIONE! - Funzione header php sempre prima di <html> tag
	$insertGoTo = ($no_rows_updated==true)? "index.php?call_error=true":"desktop.php";
  	header(sprintf("Location: %s", $insertGoTo));				   
}

//chiamata senza risposta, aggiorno il contatore dei tentativi sul DB //TODO RIVEDERE CONTATORE TENETATIVI (LOGICA ERRATA!)
else if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "esito_chiamata") && ($_POST['stato_contatto']==$_POST['no_reply'])){
  $updateSQL = sprintf("UPDATE CALLS SET IN_PROGRESS='0', STATO_CONTATTO=%s, ESITO=%s, MOTIVAZIONE=%s, NOTE=%s WHERE ID=%s",
					   GetSQLValueString($_POST['stato_contatto'], "text"),
                       GetSQLValueString($_POST['esito'], "text"),
                       GetSQLValueString($_POST['motivazione'], "text"),
                       GetSQLValueString($_POST['note'], "text"),
                       GetSQLValueString($call_id, "text"));
					
 	$Result1 = mysql_query($updateSQL, $outbound) or die(mysql_error());
	if(mysql_affected_rows()<1)
		$no_rows_updated=true; 

	$insertGoTo = ($no_rows_updated==true)? "index.php?call_error=true":"desktop.php";
  	header(sprintf("Location: %s", $insertGoTo));
}


//se il parametro ID non è passato nella get e non stiamo esitando la chiamata allora carica un nuovo nome dalla tabella
if(!isset($_GET['id']) && !isset($_POST["MM_update"])){
	//to do: aggiungere variabile per gestire campagne
	//<---selezione treatment
	
	//pesca in modo casuale solo tra i mai contattati
	$solo_nuovi="SELECT * FROM CUSTOMERS as c WHERE NOT EXISTS (SELECT * FROM CALLS WHERE c.id = CUSTOMER_ID) ORDER BY RAND() LIMIT 1";
	
	$solo_nuovi_ver2="SELECT c.ID, NUM_TEL, NOME, COGNOME, STATO_CONTATTO, TENTATIVO, IN_PROGRESS, VALORE_CAMPO_1, VALORE_CAMPO_2, VALORE_CAMPO_3, NOTE, TENTATIVO FROM CUSTOMERS c left join CALLS cl ON c.id = cl.CUSTOMER_ID WHERE STATO_CONTATTO IS NULL AND IN_PROGRESS IS NULL";
	
	//seleziono solo clienti contattati una volta senza risposta, ordino dal più vecchio
	/*$contattati_una_volta="Select * FROM (SELECT c.ID, NUM_TEL, NOME, COGNOME, STATO_CONTATTO, TENTATIVO, IN_PROGRESS, IN_PROGRESS_TIMESTAMP, IS_FINAL_STATUS, VALORE_CAMPO_1, VALORE_CAMPO_2, VALORE_CAMPO_3, NOTE, count(c.id) as 'num' from CUSTOMERS c, CALLS cl where c.id= customer_id group by customer_id) as res where res.num = 1 and res.IS_final_status = 0 and res.in_progress = 0 order by in_progress_timestamp asc limit 1";*/
	
	
	//seleziono conttattati due volte senza risposta, ordina dal più vecchio
	/*$contattati_due_volte="SELECT * FROM (SELECT c.ID, NUM_TEL, NOME, COGNOME, STATO_CONTATTO, TENTATIVO, IN_PROGRESS, IN_PROGRESS_TIMESTAMP, IS_FINAL_STATUS, VALORE_CAMPO_1, VALORE_CAMPO_2, VALORE_CAMPO_3, NOTE, count(c.id) as 'num' from CUSTOMERS c, (Select * from CALLS where 1 order by in_progress desc, is_final_status desc,in_progress_timestamp DESC) as cl where c.id= customer_id group by customer_id) as res WHERE res.num =2 and res.in_progress =0 and res.is_final_status= 0 order by res.num ASC, res.in_progress_timestamp ASC LIMIT 1";*/
	
	//ordina i nessuna risposta da quello con il tentativo più VECCHIO, prende il primo della lista
	//TODO: Non Richiamare quelli già contattattati oggi???
	$max_no_reply= 5;
	$no_reply_general_treatment="SELECT * FROM (SELECT c.ID, NUM_TEL, NOME, COGNOME, STATO_CONTATTO, TENTATIVO, IN_PROGRESS, IN_PROGRESS_TIMESTAMP, IS_FINAL_STATUS, VALORE_CAMPO_1, VALORE_CAMPO_2, VALORE_CAMPO_3, NOTE, count(c.id) as 'num' from CUSTOMERS c, (Select * from CALLS order by in_progress desc, is_final_status desc,in_progress_timestamp DESC) as cl where c.id= customer_id group by customer_id) as res WHERE res.in_progress =0 AND res.is_final_status= 0 AND res.num < '".$max_no_reply."' order by res.in_progress_timestamp ASC LIMIT 1";
	
	//metti in testa mai contattati (RAND) poi i  nessuna risposta da quello con MENO tentativi più VECCHIO, prende il primo della lista TODO:RIVEDERE - campo num non presente nella prima tabella!
	/*$general_treatment="(SELECT c.ID, NUM_TEL, NOME, COGNOME, STATO_CONTATTO, TENTATIVO, IN_PROGRESS, VALORE_CAMPO_1, VALORE_CAMPO_2, VALORE_CAMPO_3, NOTE, TENTATIVO FROM CUSTOMERS c left join CALLS cl ON c.id = cl.CUSTOMER_ID WHERE STATO_CONTATTO IS NULL AND IN_PROGRESS IS NULL) UNION (SELECT * FROM (SELECT c.ID, NUM_TEL, NOME, COGNOME, STATO_CONTATTO, TENTATIVO, IN_PROGRESS, IN_PROGRESS_TIMESTAMP, IS_FINAL_STATUS, VALORE_CAMPO_1, VALORE_CAMPO_2, VALORE_CAMPO_3, NOTE, count(c.id) as 'num' from CUSTOMERS c, (Select * from CALLS where 1 order by in_progress desc, is_final_status desc,in_progress_timestamp DESC) as cl where c.id= customer_id group by customer_id) as res WHERE res.in_progress =0 AND res.is_final_status= 0 AND res.num < '".$max_no_reply."' order by res.num ASC, res.in_progress_timestamp ASC LIMIT 1) ORDER BY num";*/
	
	
	
	
	//fine treatments--->
	
	//seleziono il treatment scelto in fase di login
	if($_SESSION['only_new'])
		$query_nuovo_nominativo = $solo_nuovi;
	else $query_nuovo_nominativo = $no_reply_general_treatment;
	
	
	$nuovo_nominativo = mysql_query($query_nuovo_nominativo, $outbound) or die(mysql_error());
	$row_nuovo_nominativo = mysql_fetch_assoc($nuovo_nominativo);
	$totalRows_nuovo_nominativo = mysql_num_rows($nuovo_nominativo);
	if($totalRows_nuovo_nominativo==0){
		$insertGoTo = "desktop.php?finished_campaign=true"; //passo parametro al desktop per visualizzare messaggio fine campagna
   		header(sprintf("Location: %s", $insertGoTo));
   }
	
}else {
//...altrimenti carica il nome con la ID selezionata (ADMIN ha richiesto l'accesso al nominativo oppure appuntamento)
	$query_appuntamento_nominativo = "SELECT c.ID, cl.ID, NUM_TEL, NOME, COGNOME, STATO_CONTATTO, TENTATIVO, IN_PROGRESS, IN_PROGRESS_OPERATOR, IN_PROGRESS_TIMESTAMP, VALORE_CAMPO_1, VALORE_CAMPO_2, VALORE_CAMPO_3, NOTE, TENTATIVO FROM CUSTOMERS c left join CALLS cl ON c.id = cl.CUSTOMER_ID WHERE cl.ID=\"". $_GET['id']."\" ";
	$nuovo_nominativo = mysql_query($query_appuntamento_nominativo, $outbound) or die(mysql_error());
	$row_nuovo_nominativo = mysql_fetch_assoc($nuovo_nominativo);
	$totalRows_nuovo_nominativo = mysql_num_rows($nuovo_nominativo);
	//TODO:salva parametro per interview (caso richiamare)
	
	//se la chiamata è un appuntamento richiamare:
	if(isset($_GET['recall']) && $_GET['recall']==true){ 
		//aggiorno il campo DONE_BY in appointments per marcare i richiamare già fatti
		$set_recall_done_SQL="UPDATE APPOINTMENTS SET DONE_BY='".$_GET['operatore']."' WHERE CALL_ID='".$call_id."'";
		//setto in_progress il contatto
		$set_in_progress_SQL="UPDATE CALLS SET in_progress_operator='".$_GET['operatore']."', in_progress=1 WHERE id='".$call_id."'";
		
		$set_in_progress=mysql_query($set_in_progress_SQL, $outbound) or die(mysql_error());
		$set_recall_done=mysql_query($set_recall_done_SQL, $outbound) or die(mysql_error());
		
	}
}


 
//inserisce un nuovo record in calls se NON ESISTE il  parametro get o i post
if(!isset($_GET['id']) && !isset($_POST["MM_update"] )&& $totalRows_nuovo_nominativo > 0){
	//flagga a 1 il campo per prenotare il nominativo ed evitare che venga richiamato da altri
	$query_lock_nominativo = "INSERT INTO CALLS (ID, CUSTOMER_ID, IN_PROGRESS, IN_PROGRESS_OPERATOR)
	VALUES (\"".$call_id."\", \"".$row_nuovo_nominativo['ID']."\",'1', \"".$_GET['operatore']."\")";
	
	//salvo l'id del contatto corrente per u possibile uso in interview...
	$_SESSION['customer_id']=$row_nuovo_nominativo['ID'];
	
	$lock_nominativo = mysql_query($query_lock_nominativo, $outbound) or die(mysql_error());
 
}

##START INTERVISTA: inserisce il risultato dell'intervista 
//TODO RIORGANIZZARE l'ARRAY POST per identificare l'intervista
if(isset($_POST["MM_interview"])){
	$interview=array();
	$i=0;	
	$flag=0;
	$customer_id=$_SESSION['customer_id'];
	
	foreach($_POST as $posted_val){
			
			if($posted_val=="MM_end")
				$flag=0;
			
			if($flag){
				if($posted_val!='question_end'){
					if($posted_val!='')//solo se vuoto?
					 $interview[$i][]=$posted_val;
				}else $i++;
			}
			
			if($posted_val=="MM_start")
				$flag=1;
		}		
		//fb($interview);	
	


	foreach($interview as $question){
		
		$detail_index=0;
		
		foreach($question as $question_detail){
						
				if($detail_index==0) //risultato TODO - check!!OBBLIGATORIO! se non inserito causa l'inserimento delle note come QA_ID 
					$detail=explode(";", $question_detail);
				else if($detail_index==1){ //note TODO - check !OPZIONALE!	
					$detail[]=$question_detail;
					}	
				$detail_index++;
			}
		//se sono inserite le note ($detail[3]) inserisco nel DB..
		if(isset($detail[3])){
			$query_insert_interview = "INSERT INTO INTERVIEWS (CALL_ID, QA_ID , TYPE, OUTCOME, NOTE)
			VALUES (\"".$call_id."\",\"".$detail[0]."\", \"".$detail[1]."\" , \"".$detail[2]."\", \"".$detail[3]."\" )";
		}else{
			$query_insert_interview = "INSERT INTO INTERVIEWS (CALL_ID, QA_ID , TYPE, OUTCOME, NOTE)
			VALUES (\"".$call_id."\",\"".$detail[0]."\", \"".$detail[1]."\" , \"".$detail[2]."\", '' )";
		}			
					
		$insert_interview = mysql_query($query_insert_interview, $outbound) or die(mysql_error());
					
	} 
	
}
##END INTERVISTA
?>
Return current item: Lite Outbound Manager