?? class.rateengine.php
字號:
} else { $sortarr[$i] = $arg; } $msortline .= "\$sortarr[".$i."],"; } $msortline .= "\$marray));"; eval($msortline); return $marray; } /* RATE ENGINE - UPDATE SYSTEM (DURATIONCALL) * CALCUL THE DURATION ALLOWED FOR THE CALLER TO THIS NUMBER */ function rate_engine_updatesystem (&$A2B, &$agi, $calledstation, $doibill = 1, $didcall=0, $callback=0){ $K = $this->usedratecard; // **************** PACKAGE PARAMETERS **************** $freetimetocall_package_offer = $this -> ratecard_obj[$K][45]; $freetimetocall = $this -> ratecard_obj[$K][46]; $id_cc_package_offer = $this -> ratecard_obj[$K][50]; if ($A2B -> CC_TESTING){ $sessiontime = 120; $dialstatus = 'ANSWERED'; }else{ $sessiontime = $this -> answeredtime; $dialstatus = $this -> dialstatus; } $id_card_package_offer = 0; if ($sessiontime > 0){ // HANDLE FREETIME BEFORE CALCULATE THE COST $freetimetocall_used = 0; $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "ft2c_package_offer : $freetimetocall_package_offer ; $freetimetocall ; ".$this -> freetimetocall_left[$K]); if ($this -> debug_st) print_r($this -> freetimetocall_left[$K]); if (($freetimetocall_package_offer==1) && ($freetimetocall > 0) && ($this -> freetimetocall_left[$K] > 0)){ if ($this -> freetimetocall_left[$K] >= $sessiontime){ $freetimetocall_used = $sessiontime; }else{ $freetimetocall_used = $this -> freetimetocall_left[$K]; } $QUERY_FIELS = 'id_cc_card,id_cc_package_offer,used_secondes'; $QUERY_VALUES = "'".$A2B -> id_card."', '$id_cc_package_offer', '$freetimetocall_used'"; $id_card_package_offer = $A2B -> instance_table -> Add_table ($A2B -> DBHandle, $QUERY_VALUES, $QUERY_FIELS, 'cc_card_package_offer', 'id'); $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, ":[ID_CARD_PACKAGE_OFFER CREATED : $id_card_package_offer]:[$QUERY_VALUES]"); } $this->rate_engine_calculcost($A2B, $sessiontime, 0, $freetimetocall_used); }else{ $sessiontime=0; } $calldestination = $this -> ratecard_obj[$K][5]; $id_tariffgroup = $this -> ratecard_obj[$K][2]; $id_tariffplan = $this -> ratecard_obj[$K][3]; $id_ratecard = $this -> ratecard_obj[$K][6]; $buycost = 0; if ($doibill==0 || $sessiontime < $A2B->agiconfig['min_duration_2bill']) $cost = 0; else{ $cost = $this -> lastcost; $buycost = abs($this -> lastbuycost); } //else $cost = abs($this -> lastcost); if ($cost<0){ $signe='-'; $signe_cc_call ='+'; }else{ $signe='+'; $signe_cc_call ='-'; } $buyrateapply = $this -> ratecard_obj[$K][9]; $rateapply = $this -> ratecard_obj[$K][12]; $A2B -> debug( WRITELOG, $agi, __FILE__, __LINE__, "[CC_RATE_ENGINE_UPDATESYSTEM: usedratecard K=$K - (sessiontime=$sessiontime :: dialstatus=$dialstatus :: buycost=$buycost :: cost=$cost : signe_cc_call=$signe_cc_call: signe=$signe)]"); // CALLTYPE - 0 = NORMAL CALL ; 1 = VOIP CALL (SIP/IAX) ; 2= DIDCALL + TRUNK ; 3 = VOIP CALL DID ; 4 = CALLBACK call if ($didcall) $calltype = 2; elseif ($callback) $calltype = 4; else $calltype = 0; // MYSQL SELECT now() - INTERVAL 300 SECOND; // PGSQL SELECT now() - interval '300 seconds' $QUERY = "INSERT INTO cc_call (uniqueid,sessionid,username,nasipaddress,starttime,sessiontime, calledstation, ". " terminatecause, stoptime, calledrate, sessionbill, calledcountry, calledsub, destination, id_tariffgroup, id_tariffplan, id_ratecard, id_trunk, src, sipiax, buyrate, buycost, id_card_package_offer) VALUES ". "('".$A2B->uniqueid."', '".$A2B->channel."', '".$A2B->username."', '".$A2B->hostname."', "; if ($A2B->config["database"]['dbtype'] == "postgres"){ $QUERY .= "CURRENT_TIMESTAMP - interval '$sessiontime seconds' "; }else{ $QUERY .= "CURRENT_TIMESTAMP - INTERVAL $sessiontime SECOND "; } $QUERY .= ", '$sessiontime', '$calledstation', '$dialstatus', now(), '$rateapply', '$signe_cc_call".round(abs($cost),4)."', ". " '', '', '$calldestination', '$id_tariffgroup', '$id_tariffplan', '$id_ratecard', '".$this -> usedtrunk."', '".$A2B->CallerID."', '$calltype', '$buyrateapply', '$buycost', '$id_card_package_offer')"; $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "[CC_asterisk_stop QUERY = $QUERY]"); $result = $A2B->instance_table -> SQLExec ($A2B -> DBHandle, $QUERY, 0); $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "[CC_asterisk_stop 1.1: SQL: DONE : result=".$result."]"); if ($sessiontime>0){ //Update the global credit $A2B -> credit = $A2B -> credit + $cost; if ($didcall==0 && $callback==0) $myclause_nodidcall = " , redial='".$calledstation."' "; else $myclause_nodidcall=''; if ($A2B->nbused>0){ $QUERY = "UPDATE cc_card SET credit= credit$signe".round(abs($cost),4)." $myclause_nodidcall, lastuse=now(), nbused=nbused+1 WHERE username='".$A2B->username."'"; }else{ $QUERY = "UPDATE cc_card SET credit= credit$signe".round(abs($cost),4)." $myclause_nodidcall, lastuse=now(), firstusedate=now(), nbused=nbused+1 WHERE username='". $A2B->username."'"; } $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "[CC_asterisk_stop 1.2: SQL: $QUERY]"); $result = $A2B->instance_table -> SQLExec ($A2B -> DBHandle, $QUERY, 0); $QUERY = "UPDATE cc_trunk SET secondusedreal = secondusedreal + $sessiontime WHERE id_trunk='".$this -> usedtrunk."'"; $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, $QUERY); $result = $A2B->instance_table -> SQLExec ($A2B -> DBHandle, $QUERY, 0); $QUERY = "UPDATE cc_tariffplan SET secondusedreal = secondusedreal + $sessiontime WHERE id='$id_tariffplan'"; $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, $QUERY); $result = $A2B->instance_table -> SQLExec ($A2B -> DBHandle, $QUERY, 0); } } /* RATE ENGINE - PERFORM CALLS $typecall = 1 -> predictive dialer */ function rate_engine_performcall ($agi, $destination, &$A2B, $typecall=0){ $old_destination = $destination; for ($k=0;$k<count($this -> ratecard_obj);$k++){ $destination=$old_destination; if ($this -> ratecard_obj[$k][34]!='-1'){ $usetrunk=34; $this -> usedtrunk = $this -> ratecard_obj[$k][34]; $usetrunk_failover=1; } $usetrunk=29; $this -> usedtrunk = $this -> ratecard_obj[$k][29]; $usetrunk_failover=0; } $prefix = $this -> ratecard_obj[$k][$usetrunk+1]; $tech = $this -> ratecard_obj[$k][$usetrunk+2]; $ipaddress = $this -> ratecard_obj[$k][$usetrunk+3]; $removeprefix = $this -> ratecard_obj[$k][$usetrunk+4]; $timeout = $this -> ratecard_obj[$k]['timeout']; $musiconhold = $this -> ratecard_obj[$k][39]; $failover_trunk = $this -> ratecard_obj[$k][40+$usetrunk_failover]; $addparameter = $this -> ratecard_obj[$k][42+$usetrunk_failover]; $cidgroupid = $this -> ratecard_obj[$k][44]; if (strncmp($destination, $removeprefix, strlen($removeprefix)) == 0) $destination= substr($destination, strlen($removeprefix)); if ($typecall==1) $timeout = $A2B -> config["callback"]['predictivedialer_maxtime_tocall']; $dialparams = str_replace("%timeout%", $timeout *1000, $A2B->agiconfig['dialcommand_param']); //$dialparams = "|30|HS($timeout)"; // L(".$timeout*1000.":61000:30000) if (strlen($musiconhold)>0 && $musiconhold!="selected"){ $dialparams.= "m"; $myres = $agi->exec("SETMUSICONHOLD $musiconhold"); $A2B -> debug( WRITELOG, $agi, __FILE__, __LINE__, "EXEC SETMUSICONHOLD $musiconhold"); } if ($A2B -> agiconfig['record_call'] == 1){ $myres = $agi->exec("MONITOR ".$A2B->agiconfig['monitor_formatfile']."|".$A2B->uniqueid."|mb"); $A2B -> debug( WRITELOG, $agi, __FILE__, __LINE__, "EXEC MONITOR ".$A2B->agiconfig['monitor_formatfile']."|".$A2B->uniqueid."|mb"); } $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; } $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "app_callingcard: Dialing '$dialstr' with timeout of '$timeout'.\n"); //# Channel: technology/number@ip_of_gw_to PSTN //# Channel: SIP/3465078XXXXX@11.150.54.xxx / SIP/phone1@192.168.1.6 // exten => 1879,1,Dial(SIP/34650XXXXX@255.XX.7.XX,20,tr) // Dial(IAX2/guest@misery.digium.com/s@default) //$myres = $agi->agi_exec("EXEC DIAL SIP/3465078XXXXX@254.20.7.28|30|HL(" . ($timeout * 60 * 1000) . ":60000:30000)"); if ($A2B->config["database"]['dbtype'] == "postgres"){ $QUERY = "SELECT cid FROM cc_outbound_cid_list WHERE activated = 1 AND outbound_cid_group = $cidgroupid ORDER BY RANDOM() LIMIT 1"; } else { $QUERY = "SELECT cid FROM cc_outbound_cid_list WHERE activated = 1 AND outbound_cid_group = $cidgroupid ORDER BY RAND() LIMIT 1"; } $A2B->instance_table = new Table(); $cidresult = $A2B->instance_table -> SQLExec ($A2B -> DBHandle, $QUERY); $outcid = 0; if (is_array($cidresult) && count($cidresult)>0){ $outcid = $cidresult[0][0]; $A2B -> CallerID = $outcid; $agi -> set_callerid($outcid); $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "[EXEC SetCallerID : $outcid]"); } $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "app_callingcard: CIDGROUPID='$cidgroupid' OUTBOUND CID SELECTED IS '$outcid'."); $myres = $agi->exec("Dial $dialstr"); //exec('Dial', trim("$type/$identifier|$timeout|$options|$url", '|')); $A2B -> debug( WRITELOG, $agi, __FILE__, __LINE__, "DIAL $dialstr"); if ($A2B -> agiconfig['record_call'] == 1){ // Monitor(wav,kiki,m) $myres = $agi->exec("STOPMONITOR"); $A2B -> debug( WRITELOG, $agi, __FILE__, __LINE__, "EXEC StopMonitor (".$A2B->uniqueid."-".$A2B->cardnumber.")"); } $answeredtime = $agi->get_variable("ANSWEREDTIME"); $this->answeredtime = $answeredtime['data']; $dialstatus = $agi->get_variable("DIALSTATUS"); $this->dialstatus = $dialstatus['data']; //$this->answeredtime='60'; //$this->dialstatus='ANSWERED'; // LOOOOP FOR THE FAILOVER LIMITED TO failover_recursive_limit $loop_failover = 0; while ( $loop_failover <= $A2B->agiconfig['failover_recursive_limit'] && is_numeric($failover_trunk) && $failover_trunk>=0 && (($this->dialstatus == "CHANUNAVAIL") || ($this->dialstatus == "CONGESTION")) ){ $loop_failover++; $this->answeredtime=0; $this -> usedtrunk = $failover_trunk; $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "[K=$k]:[ANSWEREDTIME=".$this->answeredtime."-DIALSTATUS=".$this->dialstatus."]"); $destination=$old_destination; $QUERY = "SELECT trunkprefix, providertech, providerip, removeprefix, failover_trunk FROM cc_trunk WHERE id_trunk='$failover_trunk'"; $A2B->instance_table = new Table(); $result = $A2B->instance_table -> SQLExec ($A2B -> DBHandle, $QUERY); if (is_array($result) && count($result)>0){ //DO SELECT WITH THE FAILOVER_TRUNKID $prefix = $result[0][0]; $tech = $result[0][1]; $ipaddress = $result[0][2]; $removeprefix = $result[0][3]; $next_failover_trunk = $result[0][4]; $pos_dialingnumber = strpos($ipaddress, '%dialingnumber%' ); $ipaddress = str_replace("%cardnumber%", $A2B->cardnumber, $ipaddress); $ipaddress = str_replace("%dialingnumber%", $prefix.$destination, $ipaddress); if (strncmp($destination, $removeprefix, strlen($removeprefix)) == 0) $destination= substr($destination, strlen($removeprefix)); $dialparams = str_replace("%timeout%", $timeout *1000, $A2B->agiconfig['dialcommand_param']); 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; } } $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "FAILOVER app_callingcard: Dialing '$dialstr' with timeout of '$timeout'.\n"); $myres = $agi->exec("DIAL $dialstr"); $A2B -> debug( WRITELOG, $agi, __FILE__, __LINE__, "DIAL FAILOVER $dialstr"); $answeredtime = $agi->get_variable("ANSWEREDTIME"); $this->answeredtime = $answeredtime['data']; $dialstatus = $agi->get_variable("DIALSTATUS"); $this->dialstatus = $dialstatus['data']; $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "[FAILOVER K=$k]:[ANSTIME=".$this->answeredtime."-DIALSTATUS=".$this->dialstatus."]"); } // IF THE FAILOVER TRUNK IS SAME AS THE ACTUAL TRUNK WE BREAK if ($next_failover_trunk == $failover_trunk) break; else $failover_trunk = $next_failover_trunk; } // END FOR LOOP FAILOVER if (($this->dialstatus == "CHANUNAVAIL") || ($this->dialstatus == "CONGESTION")) continue; //# Ooh, something actually happend! if ($this->dialstatus == "BUSY") { $this->answeredtime=0; //$agi->agi_exec("STREAM FILE prepaid-isbusy #"); $agi-> stream_file('prepaid-isbusy', '#'); } elseif ($this->dialstatus == "NOANSWER") { $this->answeredtime=0; //$agi->agi_exec("STREAM FILE prepaid-noanswer #"); $agi-> stream_file('prepaid-noanswer', '#'); } elseif ($this->dialstatus == "CANCEL") { $this->answeredtime=0; } elseif ($this->dialstatus == "ANSWER") { $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "-> dialstatus : ".$this->dialstatus.", answered time is ".$this->answeredtime." \n"); } $this->usedratecard = $k; $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "[USEDRATECARD=".$this->usedratecard."]"); return true; } // End for $this->usedratecard=$k-1; $A2B -> debug( VERBOSE | WRITELOG, $agi, __FILE__, __LINE__, "[USEDRATECARD - FAIL =".$this->usedratecard."]"); return false; } };?>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -