Advertisement
Guest User

Untitled

a guest
Dec 6th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 9.03 KB | None | 0 0
  1. #!/usr/bin/perl
  2.  
  3. use DBI;
  4. use JSON;
  5. use Number;
  6. use strict;
  7. use Asterisk::AGI;
  8. use LWP::UserAgent;
  9. use constant TIMEOUT => 5;
  10.  
  11. my $AGI = new Asterisk::AGI;
  12. my %input = $AGI->ReadParse();
  13. my $callerid = $input{'callerid'};
  14. $callerid =~ s/^7//g;
  15.  
  16. my ($db_failed, $skeep);
  17. my $db_bill   = DBI->connect("DBI:mysql:database=bill;host=xxxx","xxx","xxx", {mysql_connect_timeout => 3}) or $db_failed = 1;
  18. my $db_convex = DBI->connect("DBI:mysql:database=traffstat;host=xxxx","xxx","xxx", {mysql_connect_timeout => 3}) or $db_failed = 1;
  19.  
  20. if ($db_failed) {
  21.         $AGI->verbose("Db connect failed");
  22.         $AGI->exec('Goto', "cl_Callcenter,3820382,1");
  23.         exit(0);
  24. }
  25.  
  26. if (!(($callerid =~ /343\d{7}/) || ($callerid =~ /9\d{9}/))) {
  27.         $AGI->verbose("Invalid Number");
  28.         $AGI->exec('Goto', "cl_Callcenter,3820382,1");
  29.         exit(0);
  30. }
  31.  
  32. my $limit_input = 0;
  33. my ($buh_id) = getBuhId($callerid);
  34. unless ($buh_id) {
  35.         INPUT_BUHID:
  36.         $AGI->exec('Playback', 'ivr_new/Наберите_9_цифр');
  37.         $buh_id = $AGI->get_data('beep',10000,9);
  38.         $AGI->verbose("Input digits: $buh_id");
  39.         $skeep = 1;
  40.         $limit_input++;
  41. }
  42.  
  43. if (!$skeep) {
  44.         $AGI->exec('Background', "ivr_new/Приветствие&ivr_new/Все_разговоры_записываются");
  45. }
  46.  
  47. my ($address_building_id, $client_contract_id) = getInfo($buh_id);
  48. my ($ip) = getClientIp($address_building_id, $client_contract_id);
  49. my ($node_status) = getNodeStatus($ip);
  50. my ($node_order) = getOrderOnNode($address_building_id);
  51. my ($av_funds, $balance) = getBalance($buh_id);
  52.  
  53.  
  54. if (!$address_building_id) {
  55.         $AGI->verbose("Not found buh_id");
  56.         if ($limit_input >= 3) {
  57.                 $AGI->verbose("Input limit exceeded");
  58.                 $AGI->exec('Goto', "cl_Callcenter,3820382,1");
  59.                 exit(0);
  60.         }
  61.         goto INPUT_BUHID;
  62. }
  63.  
  64. $AGI->verbose("buh_id: $buh_id, ip: $ip, node_status: $node_status, ab_id: $address_building_id, cc_id: $client_contract_id, balance: $balance");
  65.  
  66. #если узел абона лежит
  67. if ($node_status eq 'CRITICAL') {
  68.         createOrder($buh_id, $callerid);
  69.         $AGI->exec('Goto', "cl_Callcenter,3820382,1");
  70.         exit(0);
  71. }
  72.  
  73. #если нет лавэшки
  74. if ($av_funds <= 0) {
  75.         playBalance($buh_id, $balance);
  76.         $AGI->exec('Goto', "cl_Callcenter,3820382,1");
  77.         exit(0);
  78. }
  79.  
  80. #если узел ОК & баланс OK
  81. $AGI->exec('Background', "ivr_new/Заявка_в_автоматическом_режиме&ivr_new/2");
  82. my $step = $AGI->wait_for_digit(5000);
  83. $step = chr($step);
  84. if ($step == 2) {
  85.         $AGI->exec('Goto', 'ivr_test,s,1');
  86.         exit(0);
  87. }
  88.  
  89. #redirect к ТП2
  90. $AGI->exec('Goto', "cl_Callcenter,5666,1");
  91. exit(0);
  92.  
  93. sub createOrder() {
  94.         my ($buh_id, $callerid) = @_;
  95.         my $browser = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 },);
  96.         my $res = $browser->post("https://xxxxx/rpc?func=order_add_ivr",
  97.                 [
  98.                         'ls'       => $buh_id,
  99.                         'phone'    => $callerid,
  100.                         'contact'  => $callerid,
  101.                         'serv'     => 1,
  102.                         'do_sms_inform' => 1,
  103.                         'rpc_passwd'    => 'xxxx',
  104.                 ]
  105.         );
  106.         if ($res->is_success) {
  107.                 my $orders_id = $res->content;
  108.                 if ($orders_id =~ m/^\d+$/) {
  109.                         $AGI->exec('Playback', 'ivr_new/Зафиксирована_авария');
  110.                         my @orders_id_digits = split //, $orders_id;
  111.                         foreach my $digit (@orders_id_digits) {
  112.                                 $AGI->exec('Playback', "ivr_new/$digit");
  113.                         }
  114.                 }
  115.         } else {
  116.                 $AGI->exec('Goto', "cl_Callcenter,3820382,1");
  117.                 exit(0);
  118.         }
  119. }
  120.  
  121. sub playBalance() {
  122.         my ($buh_id, $balance) = @_;
  123.         $AGI->exec('Playback', 'ivr_new/Номер_лицевого_счёта');
  124.         if ($buh_id =~ /(\d{3})(\d{3})(\d{3})/) {
  125.                 my $part1 = $1;
  126.                 my $part2 = $2;
  127.                 my $part3 = $3;
  128.                 my @buh_id_parts = ($part1, $part2, $part3);
  129.                 foreach my $part (@buh_id_parts) {
  130.                         $AGI->verbose("Buh_id part: $part");
  131.                         my $buh_id_word   = Number::in_words($part, undef);
  132.                         my @buh_id_digits =  split / /, $buh_id_word;
  133.                         foreach my $digit (@buh_id_digits) {
  134.                                 $AGI->exec('Playback', "$digit");
  135.                         }
  136.                 }
  137.         }
  138.  
  139.         $AGI->exec('Playback', 'ivr_new/Недостаточно_средств');
  140.         $AGI->exec('Playback', 'ivr_new/Ваш_баланс');
  141.  
  142.         $balance =~ s/-//g;
  143.         my $balance_word   = Number::in_words($balance, 1);
  144.         my @balance_digits =  split / /, $balance_word;
  145.  
  146.         $AGI->exec('Playback', "minus") unless ($balance == 0);
  147.         foreach my $digit (@balance_digits) {
  148.                 $AGI->exec('Playback', "$digit");
  149.         }
  150.         $AGI->exec('Playback', 'ivr_new/Необходимо_пополнить_баланс');
  151. }
  152.  
  153.  
  154. sub getBuhId() {
  155.         my $callerid = shift;
  156.         my $q_get_buhid = $db_bill->prepare("
  157.                SELECT
  158.                        cc.buh_id
  159.                FROM client_tel ct
  160.                JOIN client_contract cc ON cc.client_id=ct.client_id
  161.                WHERE (tel = ? OR tel1 = ? OR tel2 = ? OR tel3 = ? OR tel4 = ?)
  162.                AND (
  163.                        cc.buh_id LIKE '11%'
  164.                        OR cc.buh_id LIKE '13%'
  165.                        OR cc.buh_id LIKE '15%'
  166.                        OR cc.buh_id LIKE '17%'
  167.                        OR cc.buh_id LIKE '43%'
  168.                        OR cc.buh_id LIKE '19%'
  169.                        OR cc.buh_id LIKE '31%'
  170.                        OR cc.buh_id LIKE '35%'
  171.                        OR cc.buh_id LIKE '39%'
  172.                        OR cc.buh_id LIKE '37%'
  173.                )
  174.                GROUP BY cc.address_building_id");
  175.         $q_get_buhid->execute( $callerid, $callerid, $callerid, $callerid, $callerid );
  176.         my @result = $q_get_buhid->fetchrow_array();
  177.         return '' if (!@result);
  178.         return @result;
  179. }
  180.  
  181. sub getInfo() {
  182.         my $buh_id = shift;
  183.         return '' unless($buh_id);
  184.         my $q_get_info = $db_bill->prepare("
  185.                SELECT
  186.                        address_building_id, client_contract_id
  187.                FROM client_contract where buh_id = ?");
  188.         $q_get_info->execute( $buh_id );
  189.         my @result = $q_get_info->fetchrow_array();
  190.         return '' if (!@result);
  191.         return @result;
  192. }
  193.  
  194.  
  195. sub getClientIp() {
  196.         my ($address_building_id, $client_contract_id) = @_;
  197.         my $q_get_ip = $db_bill->prepare("
  198.                SELECT
  199.                        s_ip.addr
  200.                FROM client_contract cc
  201.                JOIN services s ON s.client_contract_id = cc.client_contract_id
  202.                LEFT JOIN services_ip s_ip ON s_ip.services_id=s.services_id
  203.                WHERE s.address_building_id = ? AND cc.client_contract_id= ? AND s_ip.addr IS NOT NULL");
  204.         $q_get_ip->execute( $address_building_id, $client_contract_id );
  205.         my @result = $q_get_ip->fetchrow_array();
  206.         return '' if (!@result);
  207.         return @result;
  208. }
  209.  
  210. sub getNodeStatus() {
  211.         my $ip = shift;
  212.         my $browser = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0, timeout => TIMEOUT });
  213.         my $res = $browser->post("https://bill.ural.ru/rpc?func=node_status",
  214.                 [
  215.                         'rpc_passwd' => 'd38e5a13',
  216.                         'ip' => $ip
  217.                 ]
  218.         );
  219.         if ($res->is_success) {
  220.                 my $result = decode_json($res->content);
  221.                 if ($result->{errno} == 0) {
  222.                         if ($result->{0} =~ /^(\w+)/) {
  223.                                 return $1;
  224.                         }
  225.                 }
  226.         } else {
  227.                 return '';
  228.         }
  229. }
  230.  
  231. sub getOrderOnNode() {
  232.         my $address_building_id = shift;
  233.         my $q_get_order = $db_bill->prepare("
  234.                SELECT
  235.                        orders_id
  236.                FROM orders
  237.                WHERE address_building_id = ?
  238.                AND orders_type_id = 534 and status not in (2,3)");
  239.         $q_get_order->execute( $address_building_id );
  240.         my @result = $q_get_order->fetchrow_array();
  241.         return '' if (!@result);
  242.         return @result;
  243. }
  244.  
  245. sub getBalance() {
  246.         my $buh_id = shift;
  247.         my $q_get_balance = $db_convex->prepare("
  248.                SELECT ROUND(SUM(account-credit)) AS av_funds, CEIL(account) AS balance
  249.                FROM firms
  250.                WHERE buh_id = ?");
  251.         $q_get_balance->execute( $buh_id );
  252.         my @result = $q_get_balance->fetchrow_array();
  253.         return '' if (!@result);
  254.         return @result;
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement