TT#64001 .ama: process User-To-User instead of $ivr_duration_limit

Change-Id: Ib118e8f543cf67fabde75e12bdda71653df277f8
changes/39/32039/6
Rene Krenn 7 years ago
parent 2e8dd9f54d
commit 70b5b93596

@ -0,0 +1,115 @@
package NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_direction;
use strict;
## no critic
use NGCP::BulkProcessor::Logging qw(
getlogger
);
use NGCP::BulkProcessor::ConnectorPool qw(
get_accounting_db
destroy_dbs
);
use NGCP::BulkProcessor::SqlProcessor qw(
checktableinfo
copy_row
);
use NGCP::BulkProcessor::SqlRecord qw();
require Exporter;
our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord);
our @EXPORT_OK = qw(
gettablename
check_table
findall
$SOURCE
$DESTINATION
);
my $tablename = 'cdr_direction';
my $get_db = \&get_accounting_db;
my $expected_fieldnames = [
"id",
"type",
];
our $SOURCE = 'source';
our $DESTINATION = 'destination';
my $indexes = {};
my $insert_unique_fields = [];
sub new {
my $class = shift;
my $self = NGCP::BulkProcessor::SqlRecord->new($class,$get_db,
$tablename,$expected_fieldnames,$indexes);
copy_row($self,shift,$expected_fieldnames);
return $self;
}
sub findall {
my ($load_recursive) = @_;
check_table();
my $db = &$get_db();
my $table = $db->tableidentifier($tablename);
my $stmt = 'SELECT * FROM ' . $table;
my @params = ();
my $rows = $db->db_get_all_arrayref($stmt,@params);
return buildrecords_fromrows($rows,$load_recursive);
}
sub buildrecords_fromrows {
my ($rows,$load_recursive) = @_;
my @records = ();
my $record;
if (defined $rows and ref $rows eq 'ARRAY') {
foreach my $row (@$rows) {
$record = __PACKAGE__->new($row);
# transformations go here ...
push @records,$record;
}
}
return \@records;
}
sub gettablename {
return $tablename;
}
sub check_table {
return checktableinfo($get_db,
__PACKAGE__,$tablename,
$expected_fieldnames,
$indexes);
}
1;

@ -0,0 +1,117 @@
package NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_provider;
use strict;
## no critic
use NGCP::BulkProcessor::Logging qw(
getlogger
);
use NGCP::BulkProcessor::ConnectorPool qw(
get_accounting_db
destroy_dbs
);
use NGCP::BulkProcessor::SqlProcessor qw(
checktableinfo
copy_row
);
use NGCP::BulkProcessor::SqlRecord qw();
require Exporter;
our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord);
our @EXPORT_OK = qw(
gettablename
check_table
findall
$CUSTOMER
$RESELLER
$CARRIER
);
my $tablename = 'cdr_provider';
my $get_db = \&get_accounting_db;
my $expected_fieldnames = [
"id",
"type",
];
our $CUSTOMER = 'customer';
our $RESELLER = 'reseller';
our $CARRIER = 'carrier';
my $indexes = {};
my $insert_unique_fields = [];
sub new {
my $class = shift;
my $self = NGCP::BulkProcessor::SqlRecord->new($class,$get_db,
$tablename,$expected_fieldnames,$indexes);
copy_row($self,shift,$expected_fieldnames);
return $self;
}
sub findall {
my ($load_recursive) = @_;
check_table();
my $db = &$get_db();
my $table = $db->tableidentifier($tablename);
my $stmt = 'SELECT * FROM ' . $table;
my @params = ();
my $rows = $db->db_get_all_arrayref($stmt,@params);
return buildrecords_fromrows($rows,$load_recursive);
}
sub buildrecords_fromrows {
my ($rows,$load_recursive) = @_;
my @records = ();
my $record;
if (defined $rows and ref $rows eq 'ARRAY') {
foreach my $row (@$rows) {
$record = __PACKAGE__->new($row);
# transformations go here ...
push @records,$record;
}
}
return \@records;
}
sub gettablename {
return $tablename;
}
sub check_table {
return checktableinfo($get_db,
__PACKAGE__,$tablename,
$expected_fieldnames,
$indexes);
}
1;

@ -0,0 +1,121 @@
package NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag;
use strict;
## no critic
use NGCP::BulkProcessor::Logging qw(
getlogger
);
use NGCP::BulkProcessor::ConnectorPool qw(
get_accounting_db
destroy_dbs
);
use NGCP::BulkProcessor::SqlProcessor qw(
checktableinfo
copy_row
);
use NGCP::BulkProcessor::SqlRecord qw();
require Exporter;
our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord);
our @EXPORT_OK = qw(
gettablename
check_table
findall
$CALLING_PARTY_CATEGORY
$FURNISHED_CHARGING_INFO
$HEADER_DIVERSION
$HEADER_P_ASSERTED_IDENTITY
$HEADER_USER_TO_USER
);
my $tablename = 'cdr_tag';
my $get_db = \&get_accounting_db;
my $expected_fieldnames = [
"id",
"type",
];
our $CALLING_PARTY_CATEGORY = 'calling_party_category';
our $FURNISHED_CHARGING_INFO = 'furnished_charging_info';
our $HEADER_DIVERSION = 'header=Diversion';
our $HEADER_P_ASSERTED_IDENTITY = 'header=P-Asserted-Identity';
our $HEADER_USER_TO_USER = 'header=User-to-User';
my $indexes = {};
my $insert_unique_fields = [];
sub new {
my $class = shift;
my $self = NGCP::BulkProcessor::SqlRecord->new($class,$get_db,
$tablename,$expected_fieldnames,$indexes);
copy_row($self,shift,$expected_fieldnames);
return $self;
}
sub findall {
my ($load_recursive) = @_;
check_table();
my $db = &$get_db();
my $table = $db->tableidentifier($tablename);
my $stmt = 'SELECT * FROM ' . $table;
my @params = ();
my $rows = $db->db_get_all_arrayref($stmt,@params);
return buildrecords_fromrows($rows,$load_recursive);
}
sub buildrecords_fromrows {
my ($rows,$load_recursive) = @_;
my @records = ();
my $record;
if (defined $rows and ref $rows eq 'ARRAY') {
foreach my $row (@$rows) {
$record = __PACKAGE__->new($row);
# transformations go here ...
push @records,$record;
}
}
return \@records;
}
sub gettablename {
return $tablename;
}
sub check_table {
return checktableinfo($get_db,
__PACKAGE__,$tablename,
$expected_fieldnames,
$indexes);
}
1;

@ -0,0 +1,135 @@
package NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag_data;
use strict;
## no critic
use NGCP::BulkProcessor::Logging qw(
getlogger
);
use NGCP::BulkProcessor::ConnectorPool qw(
get_accounting_db
destroy_dbs
);
use NGCP::BulkProcessor::SqlProcessor qw(
checktableinfo
copy_row
);
use NGCP::BulkProcessor::SqlRecord qw();
require Exporter;
our @ISA = qw(Exporter NGCP::BulkProcessor::SqlRecord);
our @EXPORT_OK = qw(
gettablename
check_table
findby_cdrproviderdirectiontag
);
my $tablename = 'cdr_tag_data';
my $get_db = \&get_accounting_db;
my $expected_fieldnames = [
"cdr_id",
"provider_id",
"direction_id",
"tag_id",
"val",
"cdr_start_time",
];
my $indexes = {};
my $insert_unique_fields = [];
sub new {
my $class = shift;
my $self = NGCP::BulkProcessor::SqlRecord->new($class,$get_db,
$tablename,$expected_fieldnames,$indexes);
copy_row($self,shift,$expected_fieldnames);
return $self;
}
sub findby_cdrproviderdirectiontag {
my ($xa_db,$cdrid,$providerid,$directionid,$tagid,$load_recursive) = @_;
check_table();
my $db = &$get_db();
$xa_db //= $db;
my $table = $db->tableidentifier($tablename);
my $stmt = 'SELECT * FROM ' . $table . ' WHERE ' .
$db->columnidentifier('cdr_id') . ' = ?' .
' AND ' . $db->columnidentifier('provider_id') . ' = ?' .
' AND ' . $db->columnidentifier('direction_id') . ' = ?' .
' AND ' . $db->columnidentifier('tag_id') . ' = ?';
my @params = ($cdrid,$providerid,$directionid,$tagid);
my $rows = $xa_db->db_get_all_arrayref($stmt,@params);
return buildrecords_fromrows($rows,$load_recursive);
}
sub findby_callid {
my ($xa_db,$callid,$load_recursive) = @_;
check_table();
my $db = &$get_db();
$xa_db //= $db;
my $table = $db->tableidentifier($tablename);
my $stmt = 'SELECT * FROM ' . $table . ' WHERE ' .
$db->columnidentifier('call_id') . ' = ?';
my @params = ($callid);
my $rows = $xa_db->db_get_all_arrayref($stmt,@params);
return buildrecords_fromrows($rows,$load_recursive);
}
sub buildrecords_fromrows {
my ($rows,$load_recursive) = @_;
my @records = ();
my $record;
if (defined $rows and ref $rows eq 'ARRAY') {
foreach my $row (@$rows) {
$record = __PACKAGE__->new($row);
# transformations go here ...
push @records,$record;
}
}
return \@records;
}
sub gettablename {
return $tablename;
}
sub check_table {
return checktableinfo($get_db,
__PACKAGE__,$tablename,
$expected_fieldnames,
$indexes);
}
1;

@ -25,7 +25,7 @@ use NGCP::BulkProcessor::Projects::Export::Ama::Ccs::Settings qw(
$ama_originating_digits_cdr_field
$ama_terminating_digits_cdr_field
$ivr_duration_limit
$primary_alias_pattern
$switch_number_pattern
@ -39,6 +39,7 @@ use NGCP::BulkProcessor::Projects::Export::Ama::Ccs::Settings qw(
$terminating_open_digits_6001
);
#$ivr_duration_limit
use NGCP::BulkProcessor::Logging qw (
getlogger
@ -55,6 +56,10 @@ use NGCP::BulkProcessor::Dao::Trunk::accounting::cdr qw();
use NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_export_status qw();
use NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_export_status_data qw();
use NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_group qw();
use NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_provider qw();
use NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_direction qw();
use NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag qw();
use NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag_data qw();
use NGCP::BulkProcessor::Dao::Trunk::accounting::mark qw();
use NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_subscribers qw();
@ -92,6 +97,7 @@ use NGCP::BulkProcessor::ConnectorPool qw(
use NGCP::BulkProcessor::Utils qw(threadid kbytes2gigs); # stringtobool check_ipnet trim);
use NGCP::BulkProcessor::Calendar qw(from_epoch);
use NGCP::BulkProcessor::Array qw(array_to_map);
require Exporter;
our @ISA = qw(Exporter);
@ -363,12 +369,17 @@ sub _export_cdrs_init_context {
and ($scenario->{ccs_subscriber}->{primary_alias} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_dbaliases::findby_subscriberidisprimary($scenario->{ccs_subscriber}->{id},1)->[0])
and (not defined $primary_alias_pattern or $scenario->{ccs_subscriber}->{primary_alias}->{username} =~ $primary_alias_pattern)
) {
my $ivr_duration = abs($parent_cdrs->[0]->{start_time} - $parent_cdrs->[1]->{init_time});
if ($ivr_duration < $ivr_duration_limit) {
$scenario->{code} = $BLIND_TRANSFER_NO_IVR;
} else {
if (get_u2u_header($context,$parent_cdrs->[0])) {
$scenario->{code} = $BLIND_TRANSFER;
} else {
$scenario->{code} = $BLIND_TRANSFER_NO_IVR;
}
#my $ivr_duration = abs($parent_cdrs->[0]->{start_time} - $parent_cdrs->[1]->{init_time});
#if ($ivr_duration < $ivr_duration_limit) {
# $scenario->{code} = $BLIND_TRANSFER_NO_IVR;
#} else {
# $scenario->{code} = $BLIND_TRANSFER;
#}
$result = 1;
#no transfer:
} elsif ((scalar @$parent_cdrs) == 1
@ -379,12 +390,17 @@ sub _export_cdrs_init_context {
and ($scenario->{ccs_subscriber}->{primary_alias} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_dbaliases::findby_subscriberidisprimary($scenario->{ccs_subscriber}->{id},1)->[0])
and (not defined $primary_alias_pattern or $scenario->{ccs_subscriber}->{primary_alias}->{username} =~ $primary_alias_pattern)
) {
my $ivr_duration = $parent_cdrs->[0]->{duration};
if ($ivr_duration < $ivr_duration_limit) {
$scenario->{code} = $NO_TRANSFER_NO_IVR;
} else {
if (get_u2u_header($context,$parent_cdrs->[0])) {
$scenario->{code} = $NO_TRANSFER;
} else {
$scenario->{code} = $NO_TRANSFER_NO_IVR;
}
#my $ivr_duration = $parent_cdrs->[0]->{duration};
#if ($ivr_duration < $ivr_duration_limit) {
# $scenario->{code} = $NO_TRANSFER_NO_IVR;
#} else {
# $scenario->{code} = $NO_TRANSFER;
#}
$result = 1;
#attn transfer:
} elsif ((scalar @$parent_cdrs) == 2
@ -396,13 +412,18 @@ sub _export_cdrs_init_context {
and ($scenario->{ccs_subscriber}->{primary_alias} = NGCP::BulkProcessor::Dao::Trunk::provisioning::voip_dbaliases::findby_subscriberidisprimary($scenario->{ccs_subscriber}->{id},1)->[0])
and (not defined $primary_alias_pattern or $scenario->{ccs_subscriber}->{primary_alias}->{username} =~ $primary_alias_pattern)
) {
my $correlated_cdr = $parent_cdrs->[1]->{_correlated_cdrs}->[0];
my $ivr_duration = abs($correlated_cdr->{start_time} - $parent_cdrs->[1]->{init_time});
if ($ivr_duration < $ivr_duration_limit) {
$scenario->{code} = $ATTN_TRANSFER_NO_IVR;
} else {
if (get_u2u_header($context,$parent_cdrs->[1])) {
$scenario->{code} = $ATTN_TRANSFER;
} else {
$scenario->{code} = $ATTN_TRANSFER_NO_IVR;
}
#my $correlated_cdr = $parent_cdrs->[1]->{_correlated_cdrs}->[0];
#my $ivr_duration = abs($correlated_cdr->{start_time} - $parent_cdrs->[1]->{init_time});
#if ($ivr_duration < $ivr_duration_limit) {
# $scenario->{code} = $ATTN_TRANSFER_NO_IVR;
#} else {
# $scenario->{code} = $ATTN_TRANSFER;
#}
$result = 1;
#cfu:
} elsif ((scalar @$parent_cdrs) == 2
@ -938,9 +959,65 @@ sub _export_cdrs_create_context {
$file_sequence_number = $fsn;
}
eval {
($context->{cdr_provider_map}, my $types, my $ids) = array_to_map(NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_provider::findall(),
sub { return shift->{type}; }, sub { return shift->{id}; }, 'last');
};
if ($@) {
_error($context,"failed to load cdr_provider enum: " . $@);
$result = 0;
} elsif (not exists $context->{cdr_provider_map}->{$NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_provider::CUSTOMER}) {
_error($context,"cannot find cdr_provider '" . $NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_provider::CUSTOMER . "'");
$result = 0;
} else {
_info($context,"cdr_provider '" . $NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_provider::CUSTOMER . "' found");
}
eval {
($context->{cdr_direction_map}, my $types, my $ids) = array_to_map(NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_direction::findall(),
sub { return shift->{type}; }, sub { return shift->{id}; }, 'last');
};
if ($@) {
_error($context,"failed to load cdr_direction enum: " . $@);
$result = 0;
} elsif (not exists $context->{cdr_direction_map}->{$NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_direction::SOURCE}) {
_error($context,"cannot find cdr_direction '" . $NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_direction::SOURCE . "'");
$result = 0;
} else {
_info($context,"cdr_direction '" . $NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_direction::SOURCE . "' found");
}
eval {
($context->{cdr_tag_map}, my $types, my $ids) = array_to_map(NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag::findall(),
sub { return shift->{type}; }, sub { return shift->{id}; }, 'last');
};
if ($@) {
_error($context,"failed to load cdr_tag enum: " . $@);
$result = 0;
} elsif (not exists $context->{cdr_tag_map}->{$NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag::HEADER_USER_TO_USER}) {
_error($context,"cannot find cdr_tag '" . $NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag::HEADER_USER_TO_USER . "'");
$result = 0;
} else {
_info($context,"cdr_tag '" . $NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag::HEADER_USER_TO_USER . "' found");
}
return $result;
}
sub get_u2u_header {
my ($context,$cdr) = @_;
my $cdr_tag = NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag_data::findby_cdrproviderdirectiontag($context->{db},$cdr->{id},
$context->{cdr_provider_map}->{$NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_provider::CUSTOMER},
$context->{cdr_direction_map}->{$NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_direction::SOURCE},
$context->{cdr_tag_map}->{$NGCP::BulkProcessor::Dao::Trunk::accounting::cdr_tag::HEADER_USER_TO_USER})->[0];
if ($cdr_tag) {
return $cdr_tag->{val};
} else {
return undef;
}
}
sub _error {
my ($context,$message) = @_;

@ -61,7 +61,7 @@ our @EXPORT_OK = qw(
$ama_originating_digits_cdr_field
$ama_terminating_digits_cdr_field
$ivr_duration_limit
$primary_alias_pattern
$switch_number_pattern
@ -75,6 +75,7 @@ our @EXPORT_OK = qw(
$terminating_open_digits_6001
);
#$ivr_duration_limit
our $defaultconfig = 'config.cfg';
our $defaultsettings = 'settings.cfg';
@ -101,7 +102,7 @@ our $ama_outgoing_trunk_group_number;
our $ama_originating_digits_cdr_field;
our $ama_terminating_digits_cdr_field;
our $ivr_duration_limit = 5;
#our $ivr_duration_limit = 5;
our $primary_alias_pattern = undef;
our $switch_number_pattern = undef;
our $switch_number_replacement = undef;
@ -151,7 +152,7 @@ sub update_settings {
configurationerror($configfile,'unknown ama_terminating_digits_cdr_field',getlogger(__PACKAGE__));
}
$ivr_duration_limit = $data->{ivr_duration_limit} if exists $data->{ivr_duration_limit};
#$ivr_duration_limit = $data->{ivr_duration_limit} if exists $data->{ivr_duration_limit};
my $regexp_result;
$primary_alias_pattern = $data->{primary_alias_pattern} if exists $data->{primary_alias_pattern};

@ -29,7 +29,7 @@ ama_outgoing_trunk_group_number = 2014
ama_originating_digits_cdr_field = source_cli
ama_terminating_digits_cdr_field = destination_user_in
ivr_duration_limit = 5
#ivr_duration_limit = 5
primary_alias_pattern = 431976
switch_number_pattern = ^43
@ -43,7 +43,7 @@ terminating_replacement =
terminating_open_digits_6001 = 4319558290
#international_destination_pattern =
#international_destination_pattern =
#domestic_destination_pattern =
#international_destination_not_pattern =
#domestic_destination_not_pattern =

@ -31,7 +31,7 @@ ama_outgoing_trunk_group_number = 2014
ama_originating_digits_cdr_field = source_cli
ama_terminating_digits_cdr_field = destination_user_in
ivr_duration_limit = 5
#ivr_duration_limit = 5
#primary_alias_pattern = 431976
switch_number_pattern = ^43
@ -45,7 +45,7 @@ terminating_replacement =
terminating_open_digits_6001 = 4319558290
#international_destination_pattern =
international_destination_pattern = abc
#domestic_destination_pattern =
#international_destination_not_pattern =
#domestic_destination_not_pattern =
Loading…
Cancel
Save