Esempio n. 1
0
function callback_engine(&$A2B, $server, $username, $secret, $AmiVars, $destination, $tariff) {

    $A2B -> cardnumber = $AmiVars[4];

    if ($A2B -> callingcard_ivr_authenticate_light ($error_msg))
    {
	$RateEngine = new RateEngine();
	$RateEngine -> webui = 0;

//	LOOKUP RATE : FIND A RATE FOR THIS DESTINATION
	$A2B -> agiconfig['accountcode'] = $A2B -> cardnumber;
	$A2B -> agiconfig['use_dnid'] = 1;
	$A2B -> agiconfig['say_timetocall'] = 0;
	$A2B -> extension = $A2B -> dnid = $A2B -> destination = $destination;

	$resfindrate = $RateEngine->rate_engine_findrates($A2B, $destination, $tariff);

//	IF FIND RATE
	if ($resfindrate!=0)
	{
	    $res_all_calcultimeout = $RateEngine->rate_engine_all_calcultimeout($A2B, $A2B->credit);
	    if ($res_all_calcultimeout)
	    {
		$ast = new AGI_AsteriskManager();
		$res = $ast -> connect($server, $username, $secret);
		if (!$res) return -4;
//		MAKE THE CALL
		$res = $RateEngine->rate_engine_performcall(false, $destination, $A2B, 8, $AmiVars, $ast);
		$ast -> disconnect();
		if ($res !== false) return $res;
		else return -2; // not enough free trunk for make call
	    }
	    else return -3; // not have enough credit to call you back
	}
	else return -1; // no route to call back your phonenumber
    }
    else return -1; // ERROR MESSAGE IS CONFIGURE BY THE callingcard_ivr_authenticate_light
}
Esempio n. 2
0
 function Request($security_key, $called, $calling, $callerid, $callback_time, $uniqueid)
 {
     global $A2B;
     /*
     $status = 'PENDING';
     $server_ip = 'localhost';
     $num_attempt = 0;
     $channel = 'SIP/'.$phone_number.'@mylittleIP';	
     $exten = $phone_number;
     $context = 'a2billing';
     $priority = 1;
     //$timeout	callerid
     $variable = "phonenumber=$phone_number|callerid=$callerid";
     */
     $phone_number = $called;
     $insert_id_callback = 'null';
     if (strlen($uniqueid) == 0) {
         $uniqueid = MDP_STRING(5) . '-' . MDP_NUMERIC(10);
     }
     $FG_regular[] = array("^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})\$", "(YYYY-MM-DD HH:MM:SS)");
     // The wrapper variables for security
     // $security_key = API_SECURITY_KEY;
     write_log(LOG_CALLBACK, " Service_Callback( security_key={$security_key}, called={$called}, calling={$calling}, callerid={$callerid}, uniqueid={$uniqueid}, callback_time={$callback_time})");
     $mysecurity_key = API_SECURITY_KEY;
     // CHECK CALLERID
     if (strlen($callerid) < 1) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR FORMAT CALLERID AT LEAST 1 DIGIT ");
         sleep(2);
         return array($insert_id_callback, 'result=Error', " ERROR - FORMAT CALLERID AT LEAST 1 DIGIT ");
     }
     // CHECK PHONE_NUMBER
     if (strlen($phone_number) < 10) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR FORMAT PHONENUMBER AT LEAST 10 DIGITS ");
         sleep(2);
         return array($insert_id_callback, 'result=Error', " ERROR - FORMAT PHONENUMBER AT LEAST 10 DIGITS ");
     }
     // CHECK CALLBACK TIME
     if (strlen($callback_time) > 1 && !ereg($FG_regular[0][0], $callback_time)) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR FORMAT CALLBACKTIME : " . $FG_regular[0][0]);
         sleep(2);
         return array($insert_id_callback, 'result=Error', " ERROR - FORMAT CALLBACKTIME : " . $FG_regular[0][0]);
     }
     // CHECK SECURITY KEY
     if (md5($mysecurity_key) !== $security_key || strlen($security_key) == 0) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " CODE_ERROR SECURITY_KEY");
         sleep(2);
         return array($insert_id_callback, 'result=Error', ' KEY - BAD PARAMETER ');
     }
     $DBHandle = DbConnect();
     if (!$DBHandle) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR CONNECT DB");
         sleep(2);
         return array($insert_id_callback, 'result=Error', ' ERROR - CONNECT DB ');
     }
     $A2B->DBHandle = $DBHandle;
     $instance_table = new Table();
     $A2B->set_instance_table($instance_table);
     $called = ereg_replace("^\\+", "011", $called);
     $calling = ereg_replace("^\\+", "011", $calling);
     $called = ereg_replace("[^0-9]", "", $called);
     $calling = ereg_replace("[^0-9]", "", $calling);
     $called = ereg_replace("^01100", "011", $called);
     $calling = ereg_replace("^01100", "011", $calling);
     $called = ereg_replace("^00", "011", $called);
     $calling = ereg_replace("^00", "011", $calling);
     $called = ereg_replace("^0111", "1", $called);
     $calling = ereg_replace("^0111", "1", $calling);
     $A2B->credit = 1000;
     $A2B->tariff = $A2B->config["callback"]['all_callback_tariff'];
     $RateEngine = new RateEngine();
     // $RateEngine -> webui = 0;
     // LOOKUP RATE : FIND A RATE FOR THIS DESTINATION
     $A2B->dnid = $A2B->destination = $caller_areacode . $calling;
     $resfindrate = $RateEngine->rate_engine_findrates($A2B, $A2B->destination, $A2B->tariff);
     // IF FIND RATE
     if ($resfindrate != 0) {
         //$RateEngine -> debug_st = 1;
         $res_all_calcultimeout = $RateEngine->rate_engine_all_calcultimeout($A2B, $A2B->credit);
         if ($res_all_calcultimeout) {
             // MAKE THE CALL
             if ($RateEngine->ratecard_obj[0][34] != '-1') {
                 $usetrunk = 34;
                 $usetrunk_failover = 1;
                 $RateEngine->usedtrunk = $RateEngine->ratecard_obj[$k][34];
             } else {
                 $usetrunk = 29;
                 $RateEngine->usedtrunk = $RateEngine->ratecard_obj[$k][29];
                 $usetrunk_failover = 0;
             }
             $prefix = $RateEngine->ratecard_obj[0][$usetrunk + 1];
             $tech = $RateEngine->ratecard_obj[0][$usetrunk + 2];
             $ipaddress = $RateEngine->ratecard_obj[0][$usetrunk + 3];
             $removeprefix = $RateEngine->ratecard_obj[0][$usetrunk + 4];
             $timeout = $RateEngine->ratecard_obj[0]['timeout'];
             $failover_trunk = $RateEngine->ratecard_obj[0][40 + $usetrunk_failover];
             $addparameter = $RateEngine->ratecard_obj[0][42 + $usetrunk_failover];
             $destination = $A2B->destination;
             if (strncmp($destination, $removeprefix, strlen($removeprefix)) == 0) {
                 $destination = substr($destination, strlen($removeprefix));
             }
             $pos_dialingnumber = strpos($ipaddress, '%dialingnumber%');
             $ipaddress = str_replace("%cardnumber%", $A2B->cardnumber, $ipaddress);
             $ipaddress = str_replace("%dialingnumber%", $prefix . $destination, $ipaddress);
             if ($pos_dialingnumber !== false) {
                 $dialstr = "{$tech}/{$ipaddress}" . $dialparams;
             } else {
                 if ($A2B->agiconfig['switchdialcommand'] == 1) {
                     $dialstr = "{$tech}/{$prefix}{$destination}@{$ipaddress}" . $dialparams;
                 } else {
                     $dialstr = "{$tech}/{$ipaddress}/{$prefix}{$destination}" . $dialparams;
                 }
             }
             //ADDITIONAL PARAMETER 			%dialingnumber%,	%cardnumber%
             if (strlen($addparameter) > 0) {
                 $addparameter = str_replace("%cardnumber%", $A2B->cardnumber, $addparameter);
                 $addparameter = str_replace("%dialingnumber%", $prefix . $destination, $addparameter);
                 $dialstr .= $addparameter;
             }
             $channel = $dialstr;
             $exten = $calling;
             $context = $A2B->config["callback"]['context_callback'];
             $id_server_group = $A2B->config["callback"]['id_server_group'];
             $priority = 1;
             $timeout = $A2B->config["callback"]['timeout'] * 1000;
             $application = '';
             $status = 'PENDING';
             $server_ip = 'localhost';
             $num_attempt = 0;
             $variable = "MODE=CID|CALLED={$called}|CALLING={$calling}|CBID={$uniqueid}|TARIFF=" . $A2B->tariff;
             if (is_numeric($A2B->config["callback"]['sec_wait_before_callback']) && $A2B->config["callback"]['sec_wait_before_callback'] >= 1) {
                 $sec_wait_before_callback = $A2B->config["callback"]['sec_wait_before_callback'];
             } else {
                 $sec_wait_before_callback = 1;
             }
             // LIST FIELDS TO INSERT CALLBACK REQUEST
             $QUERY_FIELS = 'uniqueid, status, server_ip, num_attempt, channel, exten, context, priority, variable, id_server_group, callback_time, account, callerid, timeout';
             // DEFINE THE CORRECT VALUE FOR THE INSERT
             if (strlen($callback_time) > 1) {
                 $QUERY_VALUES = "'{$uniqueid}', '{$status}', '{$server_ip}', '{$num_attempt}', '{$channel}', '{$exten}', '{$context}', '{$priority}', '{$variable}', '{$id_server_group}', '{$callback_time}', '{$account}', '{$callerid}', '30000'";
             } else {
                 if ($A2B->config["database"]['dbtype'] != "postgres") {
                     // MYSQL
                     $QUERY_VALUES = "'{$uniqueid}', '{$status}', '{$server_ip}', '{$num_attempt}', '{$channel}', '{$exten}', '{$context}', '{$priority}', '{$variable}', '{$id_server_group}', ADDDATE( CURRENT_TIMESTAMP, INTERVAL {$sec_wait_before_callback} SECOND ), '{$account}', '{$callerid}', '30000'";
                 } else {
                     // POSTGRESQL
                     $QUERY_VALUES = "'{$uniqueid}', '{$status}', '{$server_ip}', '{$num_attempt}', '{$channel}', '{$exten}', '{$context}', '{$priority}', '{$variable}', '{$id_server_group}',  (CURRENT_TIMESTAMP + INTERVAL '{$sec_wait_before_callback} SECOND'), '{$account}', '{$callerid}', '30000'";
                 }
             }
             $insert_id_callback = $instance_table->Add_table($DBHandle, $QUERY_VALUES, $QUERY_FIELS, 'cc_callback_spool', 'id');
             if (!$insert_id_callback) {
                 // FAIL INSERT
                 write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR INSERT -> \n QUERY=" . $QUERY);
                 sleep(2);
                 return array($insert_id_callback, 'result=Error', ' ERROR - INSERT INTO DB');
             }
             // SUCCEED INSERT
             write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " CALLBACK INSERTED -> \n QUERY=" . $QUERY);
             return array($insert_id_callback, 'result=Success', " Success - Callback request has been accepted ");
         } else {
             $error_msg = 'Error : You don t have enough credit to call you back !!!';
         }
     } else {
         $error_msg = 'Error : There is no route to call back your phonenumber !!!';
     }
     // CALLBACK FAIL
     write_log(LOG_CALLBACK, "error_msg = {$error_msg}");
     return array($insert_id_callback, 'result=Error', " ERROR - {$error_msg}");
 }
 } else {
     $action = "insert";
 }
 // Search Road...
 $A2B->set_instance_table($instance_table);
 $A2B->cardnumber = $phone["username"];
 $error_msg = '';
 if ($A2B->callingcard_ivr_authenticate_light($error_msg)) {
     $RateEngine = new RateEngine();
     $RateEngine->webui = 0;
     // LOOKUP RATE : FIND A RATE FOR THIS DESTINATION
     $A2B->agiconfig['accountcode'] = $phone["username"];
     $A2B->agiconfig['use_dnid'] = 1;
     $A2B->agiconfig['say_timetocall'] = 0;
     $A2B->dnid = $A2B->destination = $phone["number"];
     $resfindrate = $RateEngine->rate_engine_findrates($A2B, $phone["number"], $phone["tariff"]);
     // IF FIND RATE
     if ($resfindrate != 0) {
         $res_all_calcultimeout = $RateEngine->rate_engine_all_calcultimeout($A2B, $A2B->credit);
         if ($res_all_calcultimeout) {
             // MAKE THE CALL
             if ($RateEngine->ratecard_obj[0][34] != '-1') {
                 $usetrunk = 34;
                 $usetrunk_failover = 1;
                 $RateEngine->usedtrunk = $RateEngine->ratecard_obj[0][34];
             } else {
                 $usetrunk = 29;
                 $RateEngine->usedtrunk = $RateEngine->ratecard_obj[0][29];
                 $usetrunk_failover = 0;
             }
             $prefix = $RateEngine->ratecard_obj[0][$usetrunk + 1];
Esempio n. 4
0
            echo "cardnumber = " . $result[0][0] . " - balance={$balance}<br>";
        }
        if ($A2B->callingcard_ivr_authenticate_light($error_msg)) {
            if ($FG_DEBUG == 1) {
                $RateEngine->debug_st = 1;
            }
            $RateEngine = new RateEngine();
            $RateEngine->webui = 1;
            $A2B->agiconfig['accountcode'] = $A2B->cardnumber;
            $A2B->agiconfig['use_dnid'] = 1;
            $A2B->agiconfig['say_timetocall'] = 0;
            $A2B->dnid = $A2B->destination = $calling;
            if ($A2B->removeinterprefix) {
                $A2B->destination = $A2B->apply_rules($A2B->destination);
            }
            $resfindrate = $RateEngine->rate_engine_findrates($A2B, $A2B->destination, $result[0][1]);
            if ($FG_DEBUG == 1) {
                echo "resfindrate={$resfindrate}";
            }
            // IF FIND RATE
            if ($resfindrate != 0) {
                $res_all_calcultimeout = $RateEngine->rate_engine_all_calcultimeout($A2B, $A2B->credit);
                if ($FG_DEBUG == 1) {
                    print_r($RateEngine->ratecard_obj);
                }
            }
        }
    }
}
/**************************************************************/
$instance_table_tariffname = new Table("cc_tariffplan", "id, tariffname");
Esempio n. 5
0
			// LOOKUP RATE : FIND A RATE FOR THIS DESTINATION

			$A2B -> agiconfig['use_dnid']=1;
			$A2B -> agiconfig['say_timetocall']=0;
			$A2B -> agiconfig['say_balance_after_auth']=0;
			$A2B -> extension = $A2B -> dnid = $A2B -> destination = $caller_areacode.$A2B -> apply_rules($A2B -> CallerID);
			
			$QUERY = "SELECT callback FROM cc_callerid WHERE cid=$A2B->destination AND (callback=0 OR activated='f')";
			$result = $A2B -> instance_table -> SQLExec ($A2B->DBHandle, $QUERY);

			$instance_table = new Table("cc_callback_spool");
			$FG_TABLE_CLAUSE = "callerid='{$A2B->config['callback']['callerid']}' and exten_leg_a='{$A2B->destination}' and timediff(now(),entry_time)<{$A2B->config['callback']['sec_avoid_repeate']}";
			$FG_NB_RECORD = $instance_table -> Table_count ($A2B -> DBHandle, $FG_TABLE_CLAUSE);

			if (!is_array($result) && $FG_NB_RECORD == 0) {
			    $resfindrate = $RateEngine->rate_engine_findrates($A2B, $A2B -> destination, $A2B -> tariff);

			    // IF FIND RATE
			    if ($resfindrate!=0) {
				//$RateEngine -> debug_st = 1;
				$res_all_calcultimeout = $RateEngine->rate_engine_all_calcultimeout($A2B, $A2B->credit);

				if ($res_all_calcultimeout){
				    // MAKE THE CALL
				    $channeloutcid = $RateEngine->rate_engine_performcall($agi, $A2B->destination, $A2B, 9);
				    if ($channeloutcid) {
					$channel = $channeloutcid[0];
					$sep = ($A2B->config['global']['asterisk_version'] == "1_2" || $A2B->config['global']['asterisk_version'] == "1_4")?'|':',';
					if (isset($A2B -> cidphonenumber) && $A2B -> cidphonenumber) {
					    $exten = $A2B -> cidphonenumber;
					    $variable = '';
Esempio n. 6
0
}
if ($callback) {
    if (strlen($called) > 1 && strlen($calling) > 1 && is_numeric($called) && is_numeric($calling)) {
        $A2B->DBHandle = DbConnect();
        $instance_table = new Table();
        $A2B->set_instance_table($instance_table);
        $A2B->cardnumber = $_SESSION["pr_login"];
        if ($A2B->callingcard_ivr_authenticate_light($error_msg)) {
            $RateEngine = new RateEngine();
            $RateEngine->webui = 0;
            // LOOKUP RATE : FIND A RATE FOR THIS DESTINATION
            $A2B->agiconfig['accountcode'] = $_SESSION["pr_login"];
            $A2B->agiconfig['use_dnid'] = 1;
            $A2B->agiconfig['say_timetocall'] = 0;
            $A2B->extension = $A2B->dnid = $A2B->destination = $called;
            $resfindrate = $RateEngine->rate_engine_findrates($A2B, $called, $_SESSION["tariff"]);
            // IF FIND RATE
            if ($resfindrate != 0) {
                $res_all_calcultimeout = $RateEngine->rate_engine_all_calcultimeout($A2B, $A2B->credit);
                if ($res_all_calcultimeout) {
                    // MAKE THE CALL
                    if ($RateEngine->ratecard_obj[0][34] != '-1') {
                        $usetrunk = 34;
                        $usetrunk_failover = 1;
                        $RateEngine->usedtrunk = $RateEngine->ratecard_obj[0][34];
                    } else {
                        $usetrunk = 29;
                        $RateEngine->usedtrunk = $RateEngine->ratecard_obj[0][29];
                        $usetrunk_failover = 0;
                    }
                    $prefix = $RateEngine->ratecard_obj[0][$usetrunk + 1];
 public function Request($security_key, $called, $calling, $callerid, $callback_time, $uniqueid, $accountnumber)
 {
     // $called : PHONE NUMBER PERSON CALLING
     // $calling : DESTINATION PHONE NUMBER
     global $A2B;
     /*
     $status = 'PENDING';
     $server_ip = 'localhost';
     $num_attempt = 0;
     $channel = 'SIP/'.$phone_number.'@mylittleIP';
     $exten = $phone_number;
     $context = 'a2billing';
     $priority = 1;
     //$timeout	callerid
     $variable = "phonenumber=$phone_number|callerid=$callerid";
     */
     $phone_number = $called;
     $insert_id_callback = 'null';
     if (strlen($uniqueid) == 0) {
         $uniqueid = MDP_STRING(5) . '-' . MDP_NUMERIC(5) . MDP_STRING(10) . MDP_NUMERIC(5);
     }
     $FG_regular[] = array("^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})\$", "(YYYY-MM-DD HH:MM:SS)");
     // The wrapper variables for security
     // $security_key = API_SECURITY_KEY;
     write_log(LOG_CALLBACK, " Service_Callback( security_key={$security_key}, called={$called}, calling={$calling}, callerid={$callerid}, uniqueid={$uniqueid}, callback_time={$callback_time})");
     $mysecurity_key = API_SECURITY_KEY;
     // CHECK CALLERID
     if (strlen($callerid) < 1) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR FORMAT CALLERID AT LEAST 1 DIGIT ");
         return array($insert_id_callback, 'result=Error', " ERROR - FORMAT CALLERID AT LEAST 1 DIGIT ");
     }
     // CHECK PHONE_NUMBER
     if (strlen($phone_number) < 10) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR FORMAT PHONENUMBER AT LEAST 10 DIGITS ");
         return array($insert_id_callback, 'result=Error', " ERROR - FORMAT PHONENUMBER AT LEAST 10 DIGITS ");
     }
     // CHECK DESTINATION NUMBER
     if (strlen($calling) < 2) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR FORMAT DESTINATION NUMBER AT LEAST 2 DIGITS ");
         return array($insert_id_callback, 'result=Error', " ERROR - FORMAT DESTINATION NUMBER AT LEAST 2 DIGITS ");
     }
     // CHECK CALLBACK TIME
     if (strlen($callback_time) > 1 && !preg_match("/" . $FG_regular[0][0] . "/", $callback_time)) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR FORMAT CALLBACKTIME : " . $FG_regular[0][0]);
         return array($insert_id_callback, 'result=Error', " ERROR - FORMAT CALLBACKTIME : " . $FG_regular[0][0]);
     }
     // CHECK SECURITY KEY
     if (md5($mysecurity_key) !== $security_key || strlen($security_key) == 0) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " CODE_ERROR SECURITY_KEY");
         sleep(2);
         return array($insert_id_callback, 'result=Error', ' KEY - BAD PARAMETER ');
     }
     $DBHandle = DbConnect();
     if (!$DBHandle) {
         write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR CONNECT DB");
         sleep(2);
         return array($insert_id_callback, 'result=Error', ' ERROR - CONNECT DB ');
     }
     $A2B->DBHandle = $DBHandle;
     $instance_table = new Table();
     $A2B->set_instance_table($instance_table);
     $A2B->credit = 1000;
     $A2B->tariff = $A2B->config["callback"]['all_callback_tariff'];
     if (strlen($accountnumber) > 1) {
         // IF WE HAVE AN ACCOUNT NUMBER DEFINED
         $QUERY = "SELECT tariff, typepaid, credit, creditlimit FROM cc_card WHERE username='******'";
         $card_data = $instance_table->SQLExec($DBHandle, $QUERY);
         if (is_array($card_data)) {
             $A2B->credit = $card_data[0]['credit'];
             if ($card_data[0]['typepaid'] == 1) {
                 $A2B->credit = $A2B->credit + $card_data[0]['creditlimit'];
             }
             $A2B->tariff = $card_data[0]['tariff'];
         }
         //Else find accountnumber from caller's CallerID
     } else {
         $QUERY .= "SELECT cc_card.tariff, cc_card.typepaid, cc_card.credit, cc_card.creditlimit, cc_card.username" . " FROM cc_card " . " JOIN cc_callerid" . " ON cc_card.id=cc_callerid.id_cc_card " . " WHERE cc_callerid.cid='" . $phone_number . "'";
         $QUERY .= "ORDER BY 1";
         $card_data = $instance_table->SQLExec($DBHandle, $QUERY);
         if (!is_array($card_data)) {
             return array($insert_id_callback, 'result=Error', "CALLING'S PARTY CALLERID DOES NOT EXIST IN DATABASE");
         }
         $accountnumber = $card_data[0]['username'];
         if (is_array($card_data)) {
             $A2B->credit = $card_data[0]['credit'];
             if ($card_data[0]['typepaid'] == 1) {
                 $A2B->credit = $A2B->credit + $card_data[0]['creditlimit'];
             }
             $A2B->tariff = $card_data[0]['tariff'];
         }
     }
     $RateEngine = new RateEngine();
     $A2B->extension = $A2B->dnid = $A2B->destination = $called;
     // LOOKUP RATE : FIND A RATE FOR THIS DESTINATION
     $resfindrate = $RateEngine->rate_engine_findrates($A2B, $A2B->destination, $A2B->tariff);
     if ($resfindrate != 0) {
         //$RateEngine -> debug_st = 1;
         $res_all_calcultimeout = $RateEngine->rate_engine_all_calcultimeout($A2B, $A2B->credit);
         if ($res_all_calcultimeout) {
             // MAKE THE CALL
             if ($RateEngine->ratecard_obj[0][34] != '-1') {
                 $usetrunk = 34;
                 $usetrunk_failover = 1;
                 $RateEngine->usedtrunk = $RateEngine->ratecard_obj[0][34];
             } else {
                 $usetrunk = 29;
                 $RateEngine->usedtrunk = $RateEngine->ratecard_obj[0][29];
                 $usetrunk_failover = 0;
             }
             $prefix = $RateEngine->ratecard_obj[0][$usetrunk + 1];
             $tech = $RateEngine->ratecard_obj[0][$usetrunk + 2];
             $ipaddress = $RateEngine->ratecard_obj[0][$usetrunk + 3];
             $removeprefix = $RateEngine->ratecard_obj[0][$usetrunk + 4];
             $timeout = $RateEngine->ratecard_obj[0]['timeout'];
             $failover_trunk = $RateEngine->ratecard_obj[0][40 + $usetrunk_failover];
             $addparameter = $RateEngine->ratecard_obj[0][42 + $usetrunk_failover];
             $destination = $A2B->destination;
             if (strncmp($destination, $removeprefix, strlen($removeprefix)) == 0) {
                 $destination = substr($destination, strlen($removeprefix));
             }
             $pos_dialingnumber = strpos($ipaddress, '%dialingnumber%');
             $ipaddress = str_replace("%cardnumber%", $A2B->cardnumber, $ipaddress);
             $ipaddress = str_replace("%dialingnumber%", $prefix . $destination, $ipaddress);
             $dialparams = '';
             if ($pos_dialingnumber !== false) {
                 $dialstr = "{$tech}/{$ipaddress}" . $dialparams;
             } else {
                 if ($A2B->agiconfig['switchdialcommand'] == 1) {
                     $dialstr = "{$tech}/{$prefix}{$destination}@{$ipaddress}" . $dialparams;
                 } else {
                     $dialstr = "{$tech}/{$ipaddress}/{$prefix}{$destination}" . $dialparams;
                 }
             }
             //ADDITIONAL PARAMETER 			%dialingnumber%,	%cardnumber%
             if (strlen($addparameter) > 0) {
                 $addparameter = str_replace("%cardnumber%", $A2B->cardnumber, $addparameter);
                 $addparameter = str_replace("%dialingnumber%", $prefix . $destination, $addparameter);
                 $dialstr .= $addparameter;
             }
             $channel = $dialstr;
             $exten = $calling;
             $context = $A2B->config["callback"]['context_callback'];
             $id_server_group = $A2B->config["callback"]['id_server_group'];
             $priority = 1;
             $timeout = $A2B->config["callback"]['timeout'] * 1000;
             $application = '';
             $status = 'PENDING';
             $server_ip = 'localhost';
             $num_attempt = 0;
             $sep = $A2B->config['global']['asterisk_version'] == "1_2" || $A2B->config['global']['asterisk_version'] == "1_4" ? '|' : ',';
             $variable = "CALLED={$called}" . $sep . "CALLING={$calling}" . $sep . "CBID={$uniqueid}" . $sep . "TARIFF=" . $A2B->tariff;
             if (is_numeric($A2B->config["callback"]['sec_wait_before_callback']) && $A2B->config["callback"]['sec_wait_before_callback'] >= 1) {
                 $sec_wait_before_callback = $A2B->config["callback"]['sec_wait_before_callback'];
             } else {
                 $sec_wait_before_callback = 1;
             }
             // LIST FIELDS TO INSERT CALLBACK REQUEST
             $QUERY_FIELS = 'uniqueid, status, server_ip, num_attempt, channel, exten, context, priority, variable, id_server_group, callback_time, account, callerid, timeout';
             // DEFINE THE CORRECT VALUE FOR THE INSERT
             if (strlen($callback_time) > 1) {
                 $QUERY_VALUES = "'{$uniqueid}', '{$status}', '{$server_ip}', '{$num_attempt}', '{$channel}', '{$exten}', '{$context}', '{$priority}', '{$variable}', '{$id_server_group}', '{$callback_time}', '{$accountnumber}', '{$callerid}', '30000'";
             } else {
                 $QUERY_VALUES = "'{$uniqueid}', '{$status}', '{$server_ip}', '{$num_attempt}', '{$channel}', '{$exten}', '{$context}', '{$priority}', '{$variable}', '{$id_server_group}', ADDDATE( CURRENT_TIMESTAMP, INTERVAL {$sec_wait_before_callback} SECOND ), '{$accountnumber}', '{$callerid}', '30000'";
             }
             $insert_id_callback = $instance_table->Add_table($DBHandle, $QUERY_VALUES, $QUERY_FIELS, 'cc_callback_spool', 'id');
             if (!$insert_id_callback) {
                 // FAIL INSERT
                 write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " ERROR INSERT -> \n QUERY= {$QUERY_FIELS} :: {$QUERY_VALUES}");
                 sleep(2);
                 return array($insert_id_callback, 'result=Error', ' ERROR - INSERT INTO DB');
             }
             // SUCCEED INSERT
             write_log(LOG_CALLBACK, basename(__FILE__) . ' line:' . __LINE__ . "[" . date("Y/m/d G:i:s", mktime()) . "] " . " CALLBACK INSERTED -> \n QUERY= {$QUERY_FIELS} :: {$QUERY_VALUES}");
             return array($insert_id_callback, 'result=Success', " Success - Callback request has been accepted ");
         } else {
             $error_msg = 'Error : You don t have enough credit to call you back !!!';
         }
     } else {
         $error_msg = 'Error : There is no route to call back your phonenumber !!!';
     }
     // CALLBACK FAIL
     write_log(LOG_CALLBACK, "error_msg = {$error_msg}");
     return array($insert_id_callback, 'result=Error', " ERROR - {$error_msg}");
 }