Upgrade 3CX to v18 and get it hosted free!

PERL-ZAPOUTGOING-AGI

Author image
#!/usr/bin/perl
// zap call outging by imran ( Pakistan )

use Asterisk::AGI;
use lib "/var/www/cgi-bin/modules";
use Db;

$AGI = new Asterisk::AGI;
$|=1;
my %input = $AGI->ReadParse();
($calleridnum, $phoneno, $quiet) = @ARGV;

$phoneno =~ s/^9//gsi;

my @Result=Db->ExecuteQuery("select co_no,outgoing_prefix  from codetail");
my %CoPrHash;
my $ZapStr;
my $g_Cents;
my $d_path	 = "/var/www/html/recordings";
my $gsm_file;
my $wav_file;
my $CALLSTATUS;
my $callstart;
my $answeredtime;
my %g_DATA;
my $AvailChan;
my $Co;
my $prefix;

 // NOTE DIAL STRING SHOULD BE AS >>>>>/zap/1&Zap/2&Zap
	
	for($i=1;$i<=$#Result;$i++)
	{	
		$Co						=$Result[$i][0];
		$prefix				=$Result[$i][1];
		
		$CoPrHash{$Co} = $prefix;		
		
		$ZapStr .=	"Zap/$Co";
		if($i != $#Result)
		{
			$ZapStr .= "&"	;
		}
		
	}
	
$res = $AGI->exec("ChanIsAvail $ZapStr");

$AvailChan 		= $AGI->get_variable("AVAILCHAN");


if($AvailChan !~ /Zap/gsi)
{
		$AGI->stream_file('all-circuits-busy-now');	
		exit;
}

my ($OrderId,$callrate) = setup_billing($calleridnum);
if ( $OrderId eq '-1')
{
		#No Talk time balance in ur account
		$AGI->stream_file('not-enough-credit'); #disconnected
		$AGI->hangup();
		exit;
}


$AvailChan =~s/-(.*)$//gsi;

$dialstr = "$AvailChan/" . $CoPrHash{$LineNo} . $phoneno ;


#.... gloable variable
my $strSQL	= "
				select 
				call_recording,
				local_calling,
				international_calling,
				international_calling_ww35,
				international_calling_all,
				call_forwarding,
				
				extension_busy,
				extension_answered,
				extension_logged
				 
				from buddies_relation
				where name=\"$calleridnum\"
				";
my @Result	= Db->ExecuteQuery($strSQL);

$g_DATA{CALLRECORDING} = $Result[1][0];
$g_DATA{LOCALCALLING}  = $Result[1][1];
$g_DATA{INTCALL}			 = $Result[1][2];
$g_DATA{INTCALLWW35} 	 = $Result[1][3];
$g_DATA{INTCALLALL}    = $Result[1][4];
$g_DATA{CALLFORWARDING}= $Result[1][5];
$g_DATA{EXTBUAY}		   = $Result[1][6];
$g_DATA{EXTANSWER}	   = $Result[1][7];
$g_DATA{EXTLOG}				 = $Result[1][8];

my @r	= Db->ExecuteQuery("select min(name), max(name) from sip_buddies");
$g_DATA{MINEXT}				 = $r[1][0];
$g_DATA{MAXEXT}				 = $r[1][1];

				
			if( ( $g_DATA{LOCALCALLING} eq 'Y' )  &&  not( $g_DATA{MINEXT} <= $phoneno && $g_DATA{MAXEXT} >= $phoneno ) )#local calling
			{
						if ( $g_DATA{CALLRECORDING} eq 'Y' )
						{
								callrecording($phoneno);		
						}

						# execute local call
						$res = $AGI->exec("DIAL $dialstr");
						
						$CALLSTATUS = $AGI->get_variable(DIALSTATUS);
						
						if ( not( $CALLSTATUS eq 'ANSWER' || $CALLSTATUS eq 'ANSWERED' ) )
						{
							# the number u have dialed is not responding please call later
							$AGI->stream_file('pls-try-call-later');	
							
						}	
						else
						{
								$answeredtime = $AGI->get_variable(ANSWEREDTIME);
								#savecdr($calleridnum, $phoneno, "", $CALLSTATUS, $answeredtime, "",$callstart,"");
	 							#CutBalance($OrderId,$callrate,$answeredtime);
						}

						if ( $g_DATA{CALLRECORDING} eq 'Y' )
						{
							my $C 	= $AGI->get_variable(CHANNEL);
							my $t = $AGI->exec("StopMonitor $C");
							$AGI->hangup();
							sleep(2);
							system("sox $d_path/$gsm_file $d_path/$wav_file");
						}		
			}
			else
			{
					# sorry you r not authoriezed to have a local call
					$AGI->stream_file('not-auth-pstn');	
					$AGI->hangup();
			}

exit;
sub callrecording
{
		my ($phoneno) =@_;
		my $CalledNumber = $phoneno;
		my $CurDate;
		
			$callstart= currentDbDate();	
			$CurDate 	= $AGI->get_variable("DATETIME");
			$CurDate 	=~ s/://gsi;
			$CurDate	=substr($CurDate,4,4) . substr($CurDate,2,2) .substr($CurDate,0,2) .substr($CurDate,8,7);
			$gsm_file = "Callfrom-$calleridnum-CallTo-$CalledNumber-at-$CurDate.gsm";
			$wav_file = "Callfrom-$calleridnum-CallTo-$CalledNumber-at-$CurDate.WAV";
			$res = $AGI->exec("Monitor gsm|$d_path/Callfrom-$calleridnum-CallTo-$CalledNumber-at-$CurDate|m");
			#system("sox $d_path/$wav_file -r 8000 $d_path/$gsm_file resample -ql");
			#$AGI->verbose("imran sox  = ( sox $d_path/$wav_file -r 8000 $d_path/$gsm_file )\n",3);
} 

sub currentDbDate
{
	
		my $strSQL	= "
				select curdate()

					";
					
	my @Result	= Db->ExecuteQuery($strSQL);
	return $Result[1][0];
}

sub myVerbose
{
	my ($pStr)=@_;
	
	return;
	$pStr =~ s/\n/ /ige;
	
	$AGI->verbose("$pStr\n", 3);

}

sub savecdr() 
{
	my ($callerid, $callednum, $trunk, $disposition, $billseconds, $billcost,$callstart,$resellerrate) = @_;
	my $strSQL	= "	
	INSERT INTO cdrs (callerid,callednum,trunk,disposition,billseconds,billcost,callstart,resellerrate) VALUES 
	(
	\"$callerid\",
	\"$callednum\",
	\"$trunk\",
	\"$disposition\",
	\"$billseconds\",
	\"$billcost\",
	\"$callstart\",
	\"$resellerrate\"
	)
	";	
	myVerbose($strSQL);
	
	my @Result	= Db->ExecuteQuery($strSQL);
	
}

sub setup_billing
{
		my ( $Exten ) =@_;

		my @Result	= Db->ExecuteQuery("select id,talktime from buddies_relation where name='$Exten'");
		my $Cents		= $Result[1][1];
		$g_Cents    = $Result[1][1];
		if($Cents<=0)
		{
			$Cents=0;
			return ('-1','-1');
		}

		my $bal=$Cents/100;
		my $DollarBal			=sprintf("%d",$bal);
		my $CentsBal			=sprintf("%d",(sprintf("%d",$bal*100)%100));
		my $Totalcents 		=$DollarBal*100 +  $CentsBal;
		
		my %Hash;
		
		$Hash{Rates} =0.002;
		
		my $totalCents	=$Totalcents ;
		my $callrate		=sprintf("%d",$Hash{Rates}*100);
		my $totalMinutes=sprintf("%d",$totalCents/$callrate);                   
		my $totalSeconds=sprintf("%d",((($totalCents%$callrate)/$callrate)*60));
		
		
		return ($Result[1][0],$callrate);
}

sub CutBalance
{
	
		my ($id,$Rate,$CallSec) = @_;
		my $min=sprintf("%d",$CallSec/60);
		my $Sec=sprintf("%d",$CallSec%60);		
		if($Sec>0)
		{
		$min++;
		}
		
		my $Cut=	$min*$Rate;
			
		my $amount = $g_Cents - $Cut;
		
		my $strSQL	= "Update buddies_relation set talktime =\"$amount\" where id=\"$id\" ";
			
		Db->ExecuteQuery($strSQL);
}


Article Reviews

Write a Review

Your email address will not be published. Required fields are marked *

Required Field. Minimum 5 characters.

Required Field. Minimum 5 characters, maximum 50.

Required field.There is an error with this field.

Required Field.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

There are no reviews for this article. Be the first one to write a review.
Get 3CX - Absolutely Free!
Link up your team and customers Phone System Live Chat Video Conferencing

Hosted or Self-managed. Up to 10 users free forever. No credit card. Try risk free.

3CX
A 3CX Account with that email already exists. You will be redirected to the Customer Portal to sign in or reset your password if you've forgotten it.