class.rateengine.php

来自「asterisk用 的voip记费软件」· PHP 代码 · 共 1,109 行 · 第 1/3 页

PHP
1,109
字号
			} 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;			}			else {				$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 + =
减小字号Ctrl + -
显示快捷键?