+added contract_balance_id's +fix: get_call_costs calculates total call costs for cash_balance_interval only if no balance is available. which is not mandatory for post-paid *still under discussion* REMOVED FOR THIS CHANGE +option to shuffle cdr batch to reduce lock waits when running multiple rateomats against same cdr table +fix: free cash carry over calculation was wrong (typos only) +fix: provider profile selection is now caller-IP based, so roaming should be properly supported here now as well +reworked and cleanup provider "info" retrieval (billing profile and package, balance records) +balance underrun checks that are performed after call costs were calculated will skip applying subscriber lock and adding underrun profile mappings, if preapid && out direction && a call cost record from swrate exists. this should avoid polluting the billing mappings table in the first. +.t now use run_rateomat_threaded to work with perl's "prove" +update/create statements are modified to be make it safe if multiple rateomat's are processing the same accounting.cdr table at the same time: UPDATE CDR .. WHERE id = ? AND rating_status = 'unrated'" +rateomat termination behaviour: do not exit upon the first but a given number of failed cdrs +reworked prepaid cost table preloading +option to disable prepaid preference flag update +prepared to take prepaid flag values from cdr, not profile +prepaid costs processing testcase +onnet full-scale testcase +offnet full-scale testcase +test case order and comments +rateomat parallel execution testcase +fix missing source/destination_lnp_prefix columns for duplication stmt +writing profile package id, contract balance id, cash balance before/after, free time balance before/after fields to EAV tables +extended onnet testcase to verify written EAV values +extended offnet testcase to verify written EAV values +freetime testcase Change-Id: I3b08b2bb04adf2272d9400048ce45e3b709e7971changes/91/4491/20
parent
698ee371d2
commit
19382e59e1
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,22 @@
|
||||
|
||||
use strict;
|
||||
|
||||
use Utils::Api qw();
|
||||
use Utils::Rateomat qw();
|
||||
use Test::More;
|
||||
|
||||
### testcase outline:
|
||||
### rate-o-mat.pl invocation test
|
||||
###
|
||||
### this test verifies that ratomat can be properly invoked
|
||||
### by the .t test scripts here. any further testcases can
|
||||
### be skipped unless this one succeeds.
|
||||
|
||||
{
|
||||
|
||||
ok(Utils::Rateomat::run_rateomat_threads(1,5),"rate-o-mat executed");
|
||||
|
||||
}
|
||||
|
||||
done_testing();
|
||||
exit;
|
@ -0,0 +1,121 @@
|
||||
|
||||
use strict;
|
||||
|
||||
use Utils::Api qw();
|
||||
use Utils::Rateomat qw();
|
||||
use Test::More;
|
||||
|
||||
### testcase outline:
|
||||
### onnet calls between subscribers of multiple resellers
|
||||
### are rated by multiple rateomat instances running
|
||||
### concurrently
|
||||
###
|
||||
### this tests verify that ratomat can be run safely against
|
||||
### one and the same accounting.cdr table.
|
||||
|
||||
{
|
||||
|
||||
my $number_of_rateomat_threads = 3;
|
||||
my $rateomat_timeout = 60;
|
||||
my $number_of_providers = 3;
|
||||
my $number_of_subscribers_per_provider = 3;
|
||||
my $balance = 0.0;
|
||||
my %subscribers = ();
|
||||
foreach (1..$number_of_providers) {
|
||||
my $rate_interval = 30 + int(rand(31));
|
||||
my $provider = create_provider($rate_interval);
|
||||
|
||||
my $caller_fee = $provider->{subscriber_fees}->[0];
|
||||
|
||||
foreach (1..$number_of_subscribers_per_provider) {
|
||||
my $subscriber = Utils::Api::setup_subscriber($provider,$caller_fee->{profile},$balance,{ cc => 888, ac => '3<n>', sn => '<t>' });
|
||||
$subscriber->{provider} = $provider;
|
||||
$subscriber->{fee} = $caller_fee;
|
||||
$subscriber->{rate_interval} = $rate_interval;
|
||||
$subscribers{$subscriber->{customer}->{id}} = $subscriber;
|
||||
}
|
||||
}
|
||||
|
||||
my @caller_callee_matrix = ();
|
||||
# add calls from each subscriber to each subscriber except itself:
|
||||
Utils::Api::cartesian_product(sub {
|
||||
my ($caller,$callee) = @_;
|
||||
push(@caller_callee_matrix,{ caller => $caller, callee => $callee }) unless $caller->{customer}->{id} == $callee->{customer}->{id};
|
||||
},[ values %subscribers ],[ values %subscribers ]);
|
||||
## add calls from each subscriber to itself:
|
||||
#Utils::Api::cartesian_product(sub {
|
||||
# my ($caller,$callee) = @_;
|
||||
# push(@caller_callee_matrix,{ caller => $caller, callee => $callee }) if $caller->{customer}->{id} == $callee->{customer}->{id};
|
||||
#},[ values %subscribers ],[ values %subscribers ]);
|
||||
|
||||
# place calls by generating cdrs:
|
||||
my @cdr_ids = map { $_->{id}; } @{ Utils::Rateomat::create_cdrs([ map {
|
||||
Utils::Rateomat::prepare_cdr($_->{caller}->{subscriber},undef,$_->{caller}->{reseller},
|
||||
$_->{callee}->{subscriber},undef,$_->{callee}->{reseller},
|
||||
'192.168.0.1',Utils::Api::current_unix(),$_->{caller}->{rate_interval} + 1);
|
||||
} @caller_callee_matrix ]) };
|
||||
my $number_of_calls = ($number_of_providers * $number_of_subscribers_per_provider) * ($number_of_providers * $number_of_subscribers_per_provider - 1);
|
||||
$ENV{RATEOMAT_BATCH_SIZE} = $number_of_calls; # ensure all rateomats grab all cdrs at once
|
||||
|
||||
$ENV{RATEOMAT_SHUFFLE_BATCH} = 1; # enable and see the speedup
|
||||
|
||||
if (ok((scalar @cdr_ids) == $number_of_calls,'there are '.$number_of_calls.' calls to rate')
|
||||
&& ok(Utils::Rateomat::run_rateomat_threads($number_of_rateomat_threads, $rateomat_timeout),'rate-o-mat threads executed')) {
|
||||
|
||||
ok(Utils::Rateomat::check_cdrs('',
|
||||
map {
|
||||
my $cdr = Utils::Rateomat::get_cdrs($_);
|
||||
my $caller = $subscribers{$cdr->{source_account_id}};
|
||||
my $call_costs = $caller->{fee}->{fees}->[0]->{onpeak_init_rate} *
|
||||
$caller->{fee}->{fees}->[0]->{onpeak_init_interval} +
|
||||
$caller->{fee}->{fees}->[0]->{onpeak_follow_rate} *
|
||||
$caller->{fee}->{fees}->[0]->{onpeak_follow_interval};
|
||||
$caller->{call_costs} += $call_costs;
|
||||
$_ => {
|
||||
id => $_,
|
||||
rating_status => 'ok',
|
||||
source_customer_cost => Utils::Rateomat::decimal_to_string($call_costs),
|
||||
destination_customer_cost => Utils::Rateomat::decimal_to_string(0.0),
|
||||
source_reseller_cost => Utils::Rateomat::decimal_to_string(0.0),
|
||||
destination_reseller_cost => Utils::Rateomat::decimal_to_string(0.0),
|
||||
};
|
||||
} @cdr_ids
|
||||
),'cdrs were all processed');
|
||||
|
||||
foreach (keys %subscribers) {
|
||||
my $caller = $subscribers{$_};
|
||||
Utils::Api::check_interval_history("caller $_: ",$_,[
|
||||
{ #cash => (100.0 * $balance - $caller->{call_costs})/100.0,
|
||||
debit => $caller->{call_costs}/100.0,
|
||||
},
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
done_testing();
|
||||
exit;
|
||||
|
||||
sub create_provider {
|
||||
my $rate_interval = shift;
|
||||
$rate_interval //= 60;
|
||||
return Utils::Api::setup_provider('test<n>.com',
|
||||
[ #rates:
|
||||
{ #any
|
||||
onpeak_init_rate => 2,
|
||||
onpeak_init_interval => $rate_interval,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $rate_interval,
|
||||
offpeak_init_rate => 2,
|
||||
offpeak_init_interval => $rate_interval,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $rate_interval,
|
||||
},
|
||||
],
|
||||
[ #billing networks:
|
||||
]
|
||||
);
|
||||
}
|
@ -0,0 +1,77 @@
|
||||
use strict;
|
||||
|
||||
use Utils::Api qw();
|
||||
use Utils::Rateomat qw();
|
||||
use Test::More;
|
||||
|
||||
### testcase outline:
|
||||
### onnet prepaid calls with costs from prepaid costs
|
||||
### table
|
||||
###
|
||||
### this tests verify that prepaid costs are properly
|
||||
### cached and cleaned up.
|
||||
|
||||
my $provider = Utils::Api::setup_provider('test.com',
|
||||
[ #rates:
|
||||
{
|
||||
prepaid => 1,
|
||||
onpeak_init_rate => 2,
|
||||
onpeak_init_interval => 60,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => 30,
|
||||
offpeak_init_rate => 2,
|
||||
offpeak_init_interval => 60,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => 30,
|
||||
},
|
||||
],
|
||||
);
|
||||
|
||||
my $call_costs = ($provider->{subscriber_fees}->[0]->{fee}->{onpeak_init_rate} *
|
||||
$provider->{subscriber_fees}->[0]->{fee}->{onpeak_init_interval} +
|
||||
$provider->{subscriber_fees}->[0]->{fee}->{onpeak_follow_rate} *
|
||||
$provider->{subscriber_fees}->[0]->{fee}->{onpeak_follow_interval})/100.0;
|
||||
|
||||
my $call_count = 3;
|
||||
my $balance = $call_count * $call_costs;
|
||||
my $profiles_setup = $provider->{subscriber_fees}->[0]->{profile};
|
||||
my $caller = Utils::Api::setup_subscriber($provider,$profiles_setup,$balance,{ cc => 888, ac => '1<n>', sn => '<t>' });
|
||||
#my $caller2 = Utils::Api::setup_subscriber($provider,$profiles_setup,$balance,{ cc => 888, ac => '1<n>', sn => '<t>' });
|
||||
#my $caller3 = Utils::Api::setup_subscriber($provider,$profiles_setup,$balance,{ cc => 888, ac => '1<n>', sn => '<t>' });
|
||||
my $callee = Utils::Api::setup_subscriber($provider,$profiles_setup,$balance,{ cc => 888, ac => '2<n>', sn => '<t>' });
|
||||
|
||||
foreach my $cache_size (($call_count - 1,$call_count)) {
|
||||
diag('rateomat prepaid costs cache size: '.$cache_size);
|
||||
$ENV{RATEOMAT_PREPAID_COSTS_CACHE} = $cache_size;
|
||||
|
||||
my @cdr_ids = map { $_->{cdr}->{id}; } @{ Utils::Rateomat::create_prepaid_costs_cdrs([ map {
|
||||
Utils::Rateomat::prepare_prepaid_costs_cdr($caller->{subscriber},undef,$caller->{reseller},
|
||||
$callee->{subscriber},undef,$callee->{reseller},
|
||||
'192.168.0.1',Utils::Api::current_unix(),
|
||||
$provider->{subscriber_fees}->[0]->{fee}->{onpeak_init_interval} + 1,
|
||||
$call_costs,0);
|
||||
} (1..$call_count)]) };
|
||||
|
||||
ok(Utils::Rateomat::check_prepaid_costs_cdrs('',1,
|
||||
map { $_ => {
|
||||
id => $_,
|
||||
rating_status => 'unrated',
|
||||
}; } @cdr_ids
|
||||
),'cdrs and prepaid costs were all prepared');
|
||||
|
||||
if (ok((scalar @cdr_ids) > 0 && Utils::Rateomat::run_rateomat_threads(1),'rate-o-mat executed')) {
|
||||
ok(Utils::Rateomat::check_prepaid_costs_cdrs('',0,
|
||||
map { $_ => {
|
||||
id => $_,
|
||||
rating_status => 'ok',
|
||||
source_customer_cost => Utils::Rateomat::decimal_to_string($call_costs),
|
||||
}; } @cdr_ids
|
||||
),'cdrs were all processed');
|
||||
Utils::Api::check_interval_history('',$caller->{customer}->{id},[
|
||||
{ cash => $balance }, # rateomat must not touch balance
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
done_testing();
|
||||
exit;
|
@ -0,0 +1,296 @@
|
||||
use strict;
|
||||
|
||||
use Utils::Api qw();
|
||||
use Utils::Rateomat qw();
|
||||
use Test::More;
|
||||
|
||||
### testcase outline:
|
||||
### onnet prepaid/postpaid calls of callers to callees with both using
|
||||
### dedicated reseller fees.
|
||||
###
|
||||
### this tests verify all combinations of prepaid/postpaid subscriber customers with
|
||||
### balance > 0.0/no balance produce correct customer/reseller call cost, cash balance
|
||||
### and cash balance interval values.
|
||||
|
||||
my $init_secs = 60;
|
||||
my $follow_secs = 30;
|
||||
my $provider_a = create_provider('testa.com');
|
||||
my $provider_b = create_provider('testb.com');
|
||||
|
||||
my $total_caller_reseller_call_costs = 0.0;
|
||||
my $total_callee_reseller_call_costs = 0.0;
|
||||
|
||||
# full matrix:
|
||||
foreach my $prepaid ((0,1)) { # prepaid, postpaid
|
||||
foreach my $balance ((0.0,10.0)) { # zero balance, enough balance
|
||||
foreach my $prepaid_costs (0..1) { # prepaid: with prepaid_costs records and without (swrate down)
|
||||
next if (!$prepaid && $prepaid_costs);
|
||||
my $caller_fee = ($prepaid ? $provider_a->{subscriber_fees}->[1] : $provider_a->{subscriber_fees}->[0]);
|
||||
my $caller1 = Utils::Api::setup_subscriber($provider_a,$caller_fee->{profile},$balance,{ cc => 888, ac => '1<n>', sn => '<t>' });
|
||||
my $caller2 = Utils::Api::setup_subscriber($provider_a,$caller_fee->{profile},$balance,{ cc => 888, ac => '1<n>', sn => '<t>' });
|
||||
my $caller3 = Utils::Api::setup_subscriber($provider_a,$caller_fee->{profile},$balance,{ cc => 888, ac => '1<n>', sn => '<t>' });
|
||||
my $callee_fee = ($prepaid ? $provider_b->{subscriber_fees}->[1] : $provider_b->{subscriber_fees}->[0]);
|
||||
my $callee = Utils::Api::setup_subscriber($provider_b,$callee_fee->{profile},$balance,{ cc => 888, ac => '2<n>', sn => '<t>' });
|
||||
|
||||
my $caller_call_costs = $caller_fee->{fees}->[0]->{onpeak_init_rate} *
|
||||
$caller_fee->{fees}->[0]->{onpeak_init_interval} +
|
||||
$caller_fee->{fees}->[0]->{onpeak_follow_rate} *
|
||||
$caller_fee->{fees}->[0]->{onpeak_follow_interval};
|
||||
my $caller_reseller_call_costs = $provider_a->{provider_fee}->{fees}->[0]->{onpeak_init_rate} *
|
||||
$provider_a->{provider_fee}->{fees}->[0]->{onpeak_init_interval} +
|
||||
$provider_a->{provider_fee}->{fees}->[0]->{onpeak_follow_rate} *
|
||||
$provider_a->{provider_fee}->{fees}->[0]->{onpeak_follow_interval};
|
||||
|
||||
my $callee_call_costs = $callee_fee->{fees}->[1]->{onpeak_init_rate} *
|
||||
$callee_fee->{fees}->[1]->{onpeak_init_interval} +
|
||||
$callee_fee->{fees}->[1]->{onpeak_follow_rate} *
|
||||
$callee_fee->{fees}->[1]->{onpeak_follow_interval};
|
||||
my $callee_reseller_call_costs = $provider_b->{provider_fee}->{fees}->[1]->{onpeak_init_rate} *
|
||||
$provider_b->{provider_fee}->{fees}->[1]->{onpeak_init_interval} +
|
||||
$provider_b->{provider_fee}->{fees}->[1]->{onpeak_follow_rate} *
|
||||
$provider_b->{provider_fee}->{fees}->[1]->{onpeak_follow_interval};
|
||||
|
||||
my @cdr_ids;
|
||||
my $start_time = Utils::Api::current_unix() - 5;
|
||||
if ($prepaid_costs) {
|
||||
@cdr_ids = map { $_->{cdr}->{id}; } @{ Utils::Rateomat::create_prepaid_costs_cdrs([ map {
|
||||
Utils::Rateomat::prepare_prepaid_costs_cdr($_->{subscriber},undef,$_->{reseller},
|
||||
$callee->{subscriber},undef,$callee->{reseller},
|
||||
'192.168.0.1',$start_time += 1,$init_secs + $follow_secs,
|
||||
$caller_call_costs,0);
|
||||
} ($caller1,$caller2,$caller3) ]) };
|
||||
} else {
|
||||
@cdr_ids = map { $_->{id}; } @{ Utils::Rateomat::create_cdrs([ map {
|
||||
Utils::Rateomat::prepare_cdr($_->{subscriber},undef,$_->{reseller},
|
||||
$callee->{subscriber},undef,$callee->{reseller},
|
||||
'192.168.0.1',$start_time += 1,$init_secs + $follow_secs);
|
||||
} ($caller1,$caller2,$caller3) ]) };
|
||||
}
|
||||
|
||||
if (ok((scalar @cdr_ids) > 0 && Utils::Rateomat::run_rateomat_threads(),'rate-o-mat executed')) {
|
||||
my $no_balance = ($balance <= 0.0);
|
||||
my $prepaid_label = ($prepaid ? ($prepaid_costs ? 'prepaid w prepaid costs, ' : 'prepaid w/o prepaid costs, ') : 'postpaid, ');
|
||||
my $no_balance_label = ($no_balance ? 'no balance' : 'balance');
|
||||
|
||||
my $caller_cdr_map = {};
|
||||
|
||||
ok(Utils::Rateomat::check_cdrs($prepaid_label.$no_balance_label.': ',
|
||||
map {
|
||||
my $cdr = Utils::Rateomat::get_cdrs($_);
|
||||
$caller_cdr_map->{$cdr->{source_account_id}} = $_;
|
||||
$_ => { id => $_,
|
||||
rating_status => 'ok',
|
||||
source_customer_cost => Utils::Rateomat::decimal_to_string((($prepaid || $no_balance) ? $caller_call_costs : 0.0)),
|
||||
destination_customer_cost => Utils::Rateomat::decimal_to_string((($prepaid || $no_balance) ? $callee_call_costs : 0.0)),
|
||||
source_reseller_cost => Utils::Rateomat::decimal_to_string($caller_reseller_call_costs),
|
||||
destination_reseller_cost => Utils::Rateomat::decimal_to_string($callee_reseller_call_costs),
|
||||
};
|
||||
} @cdr_ids
|
||||
),'cdrs were all processed');
|
||||
|
||||
my $label = $prepaid_label.$no_balance_label.', caller 1: ';
|
||||
my $contract_id = $caller1->{customer}->{id};
|
||||
my $cash_balance = 100.0 * $balance - (($no_balance || $prepaid_costs) ? 0.0 : $caller_call_costs);
|
||||
my $balance_id = Utils::Rateomat::get_cdr_relation_data($label,$caller_cdr_map->{$contract_id},'source','customer','contract_balance_id');
|
||||
Utils::Api::check_interval_history($label,$contract_id,[
|
||||
{ cash => $cash_balance/100.0,
|
||||
debit => (($no_balance && !$prepaid_costs) ? $caller_call_costs : 0.0)/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$caller_cdr_map->{$contract_id},'source','customer','cash_balance',
|
||||
{ before => ($prepaid_costs ? $cash_balance + $caller_call_costs : 100.0 * $balance), after => $cash_balance });
|
||||
|
||||
$label = $prepaid_label.$no_balance_label.', caller 2: ';
|
||||
$contract_id = $caller2->{customer}->{id};
|
||||
$balance_id = Utils::Rateomat::get_cdr_relation_data($label,$caller_cdr_map->{$contract_id},'source','customer','contract_balance_id');
|
||||
Utils::Api::check_interval_history($label,$contract_id,[
|
||||
{ cash => $cash_balance/100.0,
|
||||
debit => (($no_balance && !$prepaid_costs) ? $caller_call_costs : 0.0)/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$caller_cdr_map->{$contract_id},'source','customer','cash_balance',
|
||||
{ before => ($prepaid_costs ? $cash_balance + $caller_call_costs : 100.0 * $balance), after => $cash_balance });
|
||||
|
||||
$label = $prepaid_label.$no_balance_label.', caller 3: ';
|
||||
$contract_id = $caller3->{customer}->{id};
|
||||
$balance_id = Utils::Rateomat::get_cdr_relation_data($label,$caller_cdr_map->{$contract_id},'source','customer','contract_balance_id');
|
||||
Utils::Api::check_interval_history($label,$contract_id,[
|
||||
{ cash => $cash_balance/100.0,
|
||||
debit => (($no_balance && !$prepaid_costs) ? $caller_call_costs : 0.0)/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$caller_cdr_map->{$contract_id},'source','customer','cash_balance',
|
||||
{ before => ($prepaid_costs ? $cash_balance + $caller_call_costs : 100.0 * $balance), after => $cash_balance });
|
||||
|
||||
$label = $prepaid_label.$no_balance_label.', callee: ';
|
||||
$contract_id = $callee->{customer}->{id};
|
||||
$cash_balance = 100.0 * $balance - ($no_balance ? 0.0 : 3 * $callee_call_costs);
|
||||
$balance_id = Utils::Rateomat::get_cdr_relation_data($label,$cdr_ids[0],'destination','customer','contract_balance_id');
|
||||
Utils::Api::check_interval_history($label,$contract_id,[
|
||||
{ cash => $cash_balance/100.0,
|
||||
debit => ($no_balance ? 3 * $callee_call_costs : 0.0)/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
my $bal = 100.0 * $balance;
|
||||
my $bal_decrease = ($no_balance ? 0.0 : $callee_call_costs);
|
||||
foreach (@cdr_ids) { # ensure id also orders cdrs by start_time
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','customer','contract_balance_id',$balance_id);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','customer','cash_balance',
|
||||
{ before => $bal, after => $bal - $bal_decrease });
|
||||
$bal -= $bal_decrease;
|
||||
}
|
||||
|
||||
$label = $prepaid_label.$no_balance_label.', callers\' provider: ';
|
||||
$contract_id = $provider_a->{contract}->{id};
|
||||
$balance_id = Utils::Rateomat::get_cdr_relation_data($label,$cdr_ids[0],'source','reseller','contract_balance_id');
|
||||
$total_caller_reseller_call_costs += 3 * $caller_reseller_call_costs;
|
||||
Utils::Api::check_interval_history($label,$contract_id,[
|
||||
{ debit => $total_caller_reseller_call_costs/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
foreach (@cdr_ids) {
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','carrier','contract_balance_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','reseller','contract_balance_id',$balance_id);
|
||||
}
|
||||
|
||||
$label = $prepaid_label.$no_balance_label.', callee\'s provider: ';
|
||||
$contract_id = $callee->{reseller}->{contract_id};
|
||||
$balance_id = Utils::Rateomat::get_cdr_relation_data($label,$cdr_ids[0],'destination','reseller','contract_balance_id');
|
||||
$total_callee_reseller_call_costs += 3 * $callee_reseller_call_costs;
|
||||
Utils::Api::check_interval_history($label,$contract_id,[
|
||||
{ debit => $total_callee_reseller_call_costs/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
foreach (@cdr_ids) {
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','carrier','contract_balance_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','reseller','contract_balance_id',$balance_id);
|
||||
}
|
||||
|
||||
$label = $prepaid_label.$no_balance_label.' providers and subscriber must not have a profile package: ';
|
||||
foreach (@cdr_ids) {
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','carrier','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','reseller','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','customer','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','carrier','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','reseller','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','customer','profile_package_id',undef);
|
||||
}
|
||||
$label = $prepaid_label.$no_balance_label.' providers and subscriber must have zero free time: ';
|
||||
my $free_time_balance_before_after = { before => 0.0, after => 0.0 };
|
||||
foreach (@cdr_ids) {
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','carrier','free_time_balance',undef);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','reseller','free_time_balance',$free_time_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','customer','free_time_balance',$free_time_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','carrier','free_time_balance',undef);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','reseller','free_time_balance',$free_time_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','customer','free_time_balance',$free_time_balance_before_after);
|
||||
}
|
||||
$label = $prepaid_label.$no_balance_label.' providers must have zero balance: ';
|
||||
my $cash_balance_before_after = { before => 0.0, after => 0.0 };
|
||||
foreach (@cdr_ids) {
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','carrier','cash_balance',undef);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','reseller','cash_balance',$cash_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','carrier','cash_balance',undef);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','reseller','cash_balance',$cash_balance_before_after);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
done_testing();
|
||||
exit;
|
||||
|
||||
sub create_provider {
|
||||
my $domain = shift;
|
||||
return Utils::Api::setup_provider($domain,
|
||||
[ #subscriber rates:
|
||||
{ prepaid => 0,
|
||||
fees => [{ #outgoing:
|
||||
direction => 'out',
|
||||
destination => '^8882.+',
|
||||
onpeak_init_rate => 6,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 6,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
},
|
||||
{ #incoming:
|
||||
direction => 'in',
|
||||
destination => '.',
|
||||
source => '^8881.+',
|
||||
onpeak_init_rate => 5,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 5,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
}]},
|
||||
{ prepaid => 1,
|
||||
fees => [{ #outgoing:
|
||||
direction => 'out',
|
||||
destination => '^8882.+',
|
||||
onpeak_init_rate => 4,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 4,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
},
|
||||
{ #incoming:
|
||||
direction => 'in',
|
||||
destination => '.',
|
||||
source => '^8881.+',
|
||||
onpeak_init_rate => 3,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 3,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
}]},
|
||||
],
|
||||
undef, # no billing networks in this test suite
|
||||
# provider rate:
|
||||
{ prepaid => 0,
|
||||
fees => [{ #outgoing:
|
||||
direction => 'out',
|
||||
destination => '^888.+',
|
||||
onpeak_init_rate => 2,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 2,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
},
|
||||
{ #incoming:
|
||||
direction => 'in',
|
||||
destination => '.',
|
||||
source => '^888.+',
|
||||
onpeak_init_rate => 1,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 1,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
}]},
|
||||
);
|
||||
}
|
@ -0,0 +1,378 @@
|
||||
use strict;
|
||||
|
||||
use Utils::Api qw();
|
||||
use Utils::Rateomat qw();
|
||||
use Test::More;
|
||||
|
||||
### testcase outline:
|
||||
### prepaid/postpaid calls of onnet callers to offnet callees and
|
||||
### offnet callers to onnet callees
|
||||
###
|
||||
### this tests verify all combinations of prepaid/postpaid subscriber customers with
|
||||
### balance > 0.0/no balance produce correct customer/reseller call cost, cash balance
|
||||
### and cash balance interval values.
|
||||
|
||||
my $init_secs = 60;
|
||||
my $follow_secs = 30;
|
||||
my @offnet_subscribers = (Utils::Rateomat::prepare_offnet_subsriber_info({ cc => 999, ac => '2<n>', sn => '<t>' },'somewhere.tld'),
|
||||
Utils::Rateomat::prepare_offnet_subsriber_info({ cc => 999, ac => '2<n>', sn => '<t>' },'somewhere.tld'),
|
||||
Utils::Rateomat::prepare_offnet_subsriber_info({ cc => 999, ac => '2<n>', sn => '<t>' },'somewhere.tld'));
|
||||
|
||||
#goto SKIP;
|
||||
{
|
||||
|
||||
foreach my $ptype (('reseller')) { # 'sippeering'
|
||||
my $prefix = "onnet $ptype caller calls offnet callees - ";
|
||||
my $provider = create_subscriber($ptype);
|
||||
my $is_carrier;
|
||||
my $provider_type;
|
||||
if ($ptype ne 'reseller') {
|
||||
$provider_type = 'carrier';
|
||||
$is_carrier = 1;
|
||||
} else {
|
||||
$provider_type = 'reseller';
|
||||
$is_carrier = 0;
|
||||
}
|
||||
my $total_reseller_call_costs = 0.0;
|
||||
foreach my $prepaid ((0,1)) { # prepaid, postpaid
|
||||
foreach my $balance ((0.0,30.0)) { # zero balance, enough balance
|
||||
my $caller_fee = ($prepaid ? $provider->{subscriber_fees}->[1] : $provider->{subscriber_fees}->[0]);
|
||||
my $caller = Utils::Api::setup_subscriber($provider,$caller_fee->{profile},$balance,{ cc => 888, ac => '1<n>', sn => '<t>' });
|
||||
|
||||
my $caller_call_costs = $caller_fee->{fees}->[0]->{onpeak_init_rate} *
|
||||
$caller_fee->{fees}->[0]->{onpeak_init_interval} +
|
||||
$caller_fee->{fees}->[0]->{onpeak_follow_rate} *
|
||||
$caller_fee->{fees}->[0]->{onpeak_follow_interval};
|
||||
my $caller_reseller_call_costs = $provider->{provider_fee}->{fees}->[0]->{onpeak_init_rate} *
|
||||
$provider->{provider_fee}->{fees}->[0]->{onpeak_init_interval} +
|
||||
$provider->{provider_fee}->{fees}->[0]->{onpeak_follow_rate} *
|
||||
$provider->{provider_fee}->{fees}->[0]->{onpeak_follow_interval};
|
||||
|
||||
my $callee_call_costs = 0;
|
||||
my $callee_reseller_call_costs = 0;
|
||||
|
||||
my $start_time = Utils::Api::current_unix() - 5;
|
||||
my @cdr_ids;
|
||||
if ($prepaid) {
|
||||
@cdr_ids = map { $_->{cdr}->{id}; } @{ Utils::Rateomat::create_prepaid_costs_cdrs([ map {
|
||||
Utils::Rateomat::prepare_prepaid_costs_cdr($caller->{subscriber},undef,$caller->{reseller},
|
||||
undef, $_ ,undef,
|
||||
'192.168.0.1',$start_time += 1,$init_secs + $follow_secs,
|
||||
$caller_call_costs,0);
|
||||
} @offnet_subscribers ]) };
|
||||
} else {
|
||||
@cdr_ids = map { $_->{id}; } @{ Utils::Rateomat::create_cdrs([ map {
|
||||
Utils::Rateomat::prepare_cdr($caller->{subscriber},undef,$caller->{reseller},
|
||||
undef, $_ ,undef,
|
||||
'192.168.0.1',$start_time += 1,$init_secs + $follow_secs);
|
||||
} @offnet_subscribers ]) };
|
||||
}
|
||||
|
||||
if (ok((scalar @cdr_ids) > 0 && Utils::Rateomat::run_rateomat_threads(),'rate-o-mat executed')) {
|
||||
my $no_balance = ($balance <= 0.0);
|
||||
my $prepaid_label = ($prepaid ? 'prepaid, ' : 'postpaid, ');
|
||||
my $no_balance_label = ($no_balance ? 'no balance' : 'balance');
|
||||
|
||||
ok(Utils::Rateomat::check_cdrs($prefix.$prepaid_label.$no_balance_label.': ',
|
||||
map { $_ => {
|
||||
id => $_,
|
||||
rating_status => 'ok',
|
||||
source_customer_cost => Utils::Rateomat::decimal_to_string((($prepaid || $no_balance) ? $caller_call_costs : 0.0)),
|
||||
destination_customer_cost => Utils::Rateomat::decimal_to_string((($prepaid || $no_balance) ? $callee_call_costs : 0.0)),
|
||||
'source_'.$provider_type.'_cost' => Utils::Rateomat::decimal_to_string($caller_reseller_call_costs),
|
||||
'destination_'.$provider_type.'_cost' => Utils::Rateomat::decimal_to_string($callee_reseller_call_costs),
|
||||
}; } @cdr_ids
|
||||
),'cdrs were all processed');
|
||||
|
||||
my $label = $prefix.$prepaid_label.$no_balance_label.', caller: ';
|
||||
my $cash_balance = 100.0 * $balance - (($no_balance || $prepaid) ? 0.0 : 3 * $caller_call_costs);
|
||||
my $balance_id = Utils::Rateomat::get_cdr_relation_data($label,$cdr_ids[0],'source','customer','contract_balance_id');
|
||||
Utils::Api::check_interval_history($label,$caller->{customer}->{id},[
|
||||
{ cash => $cash_balance/100.0,
|
||||
debit => (($no_balance && !$prepaid) ? 3 * $caller_call_costs : 0.0)/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
my $bal = ($prepaid ? $cash_balance + $caller_call_costs : 100.0 * $balance);
|
||||
my $bal_decrease = (($no_balance && !$prepaid) ? 0.0 : $caller_call_costs);
|
||||
foreach (@cdr_ids) { # ensure id also orders cdrs by start_time
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','customer','contract_balance_id',$balance_id);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','customer','cash_balance',
|
||||
{ before => $bal, after => $bal - $bal_decrease });
|
||||
$bal -= $bal_decrease if !$prepaid;
|
||||
}
|
||||
|
||||
$label = $prefix.$prepaid_label.$no_balance_label.', callers\' provider: ';
|
||||
$balance_id = Utils::Rateomat::get_cdr_relation_data($label,$cdr_ids[0],'source',$provider_type,'contract_balance_id');
|
||||
$total_reseller_call_costs += 3 * $caller_reseller_call_costs;
|
||||
Utils::Api::check_interval_history($label,$provider->{contract}->{id},[
|
||||
{ debit => $total_reseller_call_costs/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
|
||||
$label = $prefix.$prepaid_label.$no_balance_label.' providers and subscriber must not have a profile package: ';
|
||||
foreach (@cdr_ids) {
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','carrier','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','reseller','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','customer','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','carrier','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','reseller','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','customer','profile_package_id',undef);
|
||||
}
|
||||
$label = $prefix.$prepaid_label.$no_balance_label.' providers and subscriber must have zero free time: ';
|
||||
my $free_time_balance_before_after = { before => 0.0, after => 0.0 };
|
||||
foreach (@cdr_ids) {
|
||||
if ($is_carrier) {
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','carrier','free_time_balance',$free_time_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','reseller','free_time_balance',undef);
|
||||
} else {
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','carrier','free_time_balance',undef);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','reseller','free_time_balance',$free_time_balance_before_after);
|
||||
}
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','customer','free_time_balance',$free_time_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','carrier','free_time_balance',undef);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','reseller','free_time_balance',undef);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','customer','free_time_balance',undef);
|
||||
}
|
||||
$label = $prefix.$prepaid_label.$no_balance_label.' providers and destination customers must have zero balance: ';
|
||||
my $cash_balance_before_after = { before => 0.0, after => 0.0 };
|
||||
foreach (@cdr_ids) {
|
||||
if ($is_carrier) {
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','carrier','cash_balance',$cash_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','reseller','cash_balance',undef);
|
||||
} else {
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','carrier','cash_balance',undef);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','reseller','cash_balance',$cash_balance_before_after);
|
||||
}
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','customer','cash_balance',undef);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','carrier','cash_balance',undef);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','reseller','cash_balance',undef);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#SKIP:
|
||||
{
|
||||
foreach my $ptype (('reseller')) { # 'sippeering'
|
||||
my $prefix = "offnet callers call onnet $ptype callee - ";
|
||||
my $provider = create_subscriber($ptype);
|
||||
my $is_carrier;
|
||||
my $provider_type;
|
||||
if ($ptype ne 'reseller') {
|
||||
$provider_type = 'carrier';
|
||||
$is_carrier = 1;
|
||||
} else {
|
||||
$provider_type = 'reseller';
|
||||
$is_carrier = 0;
|
||||
}
|
||||
my $total_reseller_call_costs = 0.0;
|
||||
foreach my $prepaid ((0,1)) { # prepaid, postpaid
|
||||
foreach my $balance ((0.0,30.0)) { # zero balance, enough balance
|
||||
|
||||
my $callee_fee = ($prepaid ? $provider->{subscriber_fees}->[1] : $provider->{subscriber_fees}->[0]);
|
||||
my $callee = Utils::Api::setup_subscriber($provider,$callee_fee->{profile},$balance,{ cc => 888, ac => '2<n>', sn => '<t>' });
|
||||
|
||||
my $caller_call_costs = 0;
|
||||
my $caller_reseller_call_costs = 0;
|
||||
|
||||
my $callee_call_costs = $callee_fee->{fees}->[1]->{onpeak_init_rate} *
|
||||
$callee_fee->{fees}->[1]->{onpeak_init_interval} +
|
||||
$callee_fee->{fees}->[1]->{onpeak_follow_rate} *
|
||||
$callee_fee->{fees}->[1]->{onpeak_follow_interval};
|
||||
my $callee_reseller_call_costs = $provider->{provider_fee}->{fees}->[1]->{onpeak_init_rate} *
|
||||
$provider->{provider_fee}->{fees}->[1]->{onpeak_init_interval} +
|
||||
$provider->{provider_fee}->{fees}->[1]->{onpeak_follow_rate} *
|
||||
$provider->{provider_fee}->{fees}->[1]->{onpeak_follow_interval};
|
||||
|
||||
my $start_time = Utils::Api::current_unix() - 5;
|
||||
my @cdr_ids = map { $_->{id}; } @{ Utils::Rateomat::create_cdrs([ map {
|
||||
Utils::Rateomat::prepare_cdr(undef, $_ ,undef,
|
||||
$callee->{subscriber},undef,$callee->{reseller},
|
||||
'192.168.0.1',$start_time += 1,$init_secs + $follow_secs);
|
||||
} @offnet_subscribers ]) };
|
||||
|
||||
if (ok((scalar @cdr_ids) > 0 && Utils::Rateomat::run_rateomat_threads(),'rate-o-mat executed')) {
|
||||
my $no_balance = ($balance <= 0.0);
|
||||
my $prepaid_label = ($prepaid ? 'prepaid, ' : 'postpaid, ');
|
||||
my $no_balance_label = ($no_balance ? 'no balance' : 'balance');
|
||||
|
||||
ok(Utils::Rateomat::check_cdrs($prefix.$prepaid_label.$no_balance_label.': ',
|
||||
map { $_ => {
|
||||
id => $_,
|
||||
rating_status => 'ok',
|
||||
source_customer_cost => Utils::Rateomat::decimal_to_string($caller_call_costs),
|
||||
destination_customer_cost => Utils::Rateomat::decimal_to_string((($prepaid || $no_balance) ? $callee_call_costs : 0.0)),
|
||||
'source_'.$provider_type.'_cost' => Utils::Rateomat::decimal_to_string($caller_reseller_call_costs),
|
||||
'destination_'.$provider_type.'_cost' => Utils::Rateomat::decimal_to_string($callee_reseller_call_costs),
|
||||
}; } @cdr_ids
|
||||
),'cdrs were all processed');
|
||||
|
||||
my $label = $prefix.$prepaid_label.$no_balance_label.', callee: ';
|
||||
my $cash_balance = 100.0 * $balance - ($no_balance ? 0.0 : 3 * $callee_call_costs);
|
||||
my $balance_id = Utils::Rateomat::get_cdr_relation_data($label,$cdr_ids[0],'destination','customer','contract_balance_id');
|
||||
Utils::Api::check_interval_history($label,$callee->{customer}->{id},[
|
||||
{ cash => $cash_balance/100.0,
|
||||
debit => ($no_balance ? 3 * $callee_call_costs : 0.0)/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
my $bal = 100.0 * $balance;
|
||||
my $bal_decrease = ($no_balance ? 0.0 : $callee_call_costs);
|
||||
foreach (@cdr_ids) { # ensure id also orders cdrs by start_time
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','customer','contract_balance_id',$balance_id);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','customer','cash_balance',
|
||||
{ before => $bal, after => $bal - $bal_decrease });
|
||||
$bal -= $bal_decrease;
|
||||
}
|
||||
|
||||
$label = $prefix.$prepaid_label.$no_balance_label.', callee\'s provider: ';
|
||||
$balance_id = Utils::Rateomat::get_cdr_relation_data($label,$cdr_ids[0],'destination',$provider_type,'contract_balance_id');
|
||||
$total_reseller_call_costs += 3 * $callee_reseller_call_costs;
|
||||
Utils::Api::check_interval_history($label,$callee->{reseller}->{contract_id},[
|
||||
{ debit => $total_reseller_call_costs/100.0,
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
|
||||
$label = $prefix.$prepaid_label.$no_balance_label.' providers and subscriber must not have a profile package: ';
|
||||
foreach (@cdr_ids) {
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','carrier','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','reseller','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'source','customer','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','carrier','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','reseller','profile_package_id',undef);
|
||||
Utils::Rateomat::check_cdr_relation_data($label,$_,'destination','customer','profile_package_id',undef);
|
||||
}
|
||||
$label = $prefix.$prepaid_label.$no_balance_label.' providers and subscriber must have zero free time: ';
|
||||
my $free_time_balance_before_after = { before => 0.0, after => 0.0 };
|
||||
foreach (@cdr_ids) {
|
||||
if ($is_carrier) {
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','carrier','free_time_balance',$free_time_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','reseller','free_time_balance',undef);
|
||||
} else {
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','carrier','free_time_balance',undef);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','reseller','free_time_balance',$free_time_balance_before_after);
|
||||
}
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'destination','customer','free_time_balance',$free_time_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','carrier','free_time_balance',undef);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','reseller','free_time_balance',undef);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$_,'source','customer','free_time_balance',undef);
|
||||
}
|
||||
$label = $prefix.$prepaid_label.$no_balance_label.' providers and destination customers must have zero balance: ';
|
||||
my $cash_balance_before_after = { before => 0.0, after => 0.0 };
|
||||
foreach (@cdr_ids) {
|
||||
if ($is_carrier) {
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','carrier','cash_balance',$cash_balance_before_after);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','reseller','cash_balance',undef);
|
||||
} else {
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','carrier','cash_balance',undef);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'destination','reseller','cash_balance',$cash_balance_before_after);
|
||||
}
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','customer','cash_balance',undef);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','carrier','cash_balance',undef);
|
||||
Utils::Rateomat::check_cdr_cash_balance_data($label,$_,'source','reseller','cash_balance',undef);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
done_testing();
|
||||
exit;
|
||||
|
||||
sub create_subscriber {
|
||||
my $type = shift;
|
||||
return Utils::Api::setup_provider('test<n>.com',
|
||||
[ #subscriber rates:
|
||||
{ prepaid => 0,
|
||||
fees => [{ #outgoing:
|
||||
direction => 'out',
|
||||
destination => '^999.+',
|
||||
onpeak_init_rate => 6,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 6,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
},
|
||||
{ #incoming:
|
||||
direction => 'in',
|
||||
destination => '.',
|
||||
source => '^999.+',
|
||||
onpeak_init_rate => 5,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 5,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
}]},
|
||||
{ prepaid => 1,
|
||||
fees => [{ #outgoing:
|
||||
direction => 'out',
|
||||
destination => '^999.+',
|
||||
onpeak_init_rate => 4,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 4,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
},
|
||||
{ #incoming:
|
||||
direction => 'in',
|
||||
destination => '.',
|
||||
source => '^999.+',
|
||||
onpeak_init_rate => 3,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 3,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
}]},
|
||||
],
|
||||
undef, # no billing networks in this test suite
|
||||
# provider rate:
|
||||
{ prepaid => 0,
|
||||
fees => [{ #outgoing:
|
||||
direction => 'out',
|
||||
destination => '^999.+',
|
||||
onpeak_init_rate => 2,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 2,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
},
|
||||
{ #incoming:
|
||||
direction => 'in',
|
||||
destination => '.',
|
||||
source => '^999.+',
|
||||
onpeak_init_rate => 1,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 1,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
}]},
|
||||
$type
|
||||
);
|
||||
}
|
@ -0,0 +1,121 @@
|
||||
|
||||
use strict;
|
||||
|
||||
use Utils::Api qw();
|
||||
use Utils::Rateomat qw();
|
||||
use Test::More;
|
||||
|
||||
### testcase outline:
|
||||
### onnet calls that consume profile's freetime
|
||||
###
|
||||
### this tests verify that rating correctly
|
||||
### consumes up free time before cash balance.
|
||||
|
||||
my $init_secs = 50;
|
||||
my $follow_secs = 20;
|
||||
my $in_free_time = $init_secs + 20*$follow_secs;
|
||||
my $out_free_time = $init_secs + 30*$follow_secs;
|
||||
|
||||
{
|
||||
my $now = Utils::Api::get_now();
|
||||
my $begin = $now->clone->truncate(to => 'month'); # prevent ratio
|
||||
Utils::Api::set_time($begin);
|
||||
my $provider = create_provider($in_free_time,$out_free_time);
|
||||
my $balance = 5;
|
||||
my $caller = Utils::Api::setup_subscriber($provider,$provider->{subscriber_fees}->[0]->{profile},$balance,{ cc => 888, ac => '1<n>', sn => '<t>' });
|
||||
my $callee = Utils::Api::setup_subscriber($provider,$provider->{subscriber_fees}->[1]->{profile},$balance,{ cc => 888, ac => '2<n>', sn => '<t>' });
|
||||
my $caller_costs = 2 * ($provider->{subscriber_fees}->[0]->{fees}->[0]->{onpeak_follow_rate} *
|
||||
$provider->{subscriber_fees}->[0]->{fees}->[0]->{onpeak_follow_interval})/100.0;
|
||||
my $callee_costs = 2 * ($provider->{subscriber_fees}->[1]->{fees}->[0]->{onpeak_follow_rate} *
|
||||
$provider->{subscriber_fees}->[1]->{fees}->[0]->{onpeak_follow_interval})/100.0;
|
||||
|
||||
my $max_free_time = ($in_free_time, $out_free_time)[$in_free_time < $out_free_time];
|
||||
my $call_duration = $follow_secs + $max_free_time + 1;
|
||||
Utils::Api::set_time($begin->clone->add(seconds => $call_duration + 20));
|
||||
my $start_time = Utils::Api::current_unix() - $call_duration - 1;
|
||||
Utils::Api::set_time();
|
||||
my @cdr_ids = map { $_->{id}; } @{ Utils::Rateomat::create_cdrs([
|
||||
Utils::Rateomat::prepare_cdr($caller->{subscriber},undef,$caller->{reseller},
|
||||
$callee->{subscriber},undef,$callee->{reseller},
|
||||
'192.168.0.1',$start_time,$call_duration),
|
||||
]) };
|
||||
|
||||
if (ok((scalar @cdr_ids) > 0 && Utils::Rateomat::run_rateomat_threads(),'rate-o-mat executed')) {
|
||||
ok(Utils::Rateomat::check_cdrs('',
|
||||
map { $_ => {
|
||||
id => $_,
|
||||
rating_status => 'ok',
|
||||
source_customer_free_time => $out_free_time,
|
||||
destination_customer_free_time => $in_free_time,
|
||||
}; } @cdr_ids
|
||||
),'cdrs were all processed');
|
||||
my $label = 'freetime - caller: ';
|
||||
my $balance_id = Utils::Rateomat::get_cdr_relation_data($label,$cdr_ids[0],'source','customer','contract_balance_id');
|
||||
Utils::Api::check_interval_history($label,$caller->{customer}->{id},[
|
||||
{ (($in_free_time < $out_free_time) ? (cash => $balance - $caller_costs) : ()),
|
||||
profile => $provider->{subscriber_fees}->[0]->{profile}->{id},
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$cdr_ids[0],'source','customer','free_time_balance',
|
||||
{ before => $out_free_time, after => 0 });
|
||||
$label = 'freetime - callee: ';
|
||||
$balance_id = Utils::Rateomat::get_cdr_relation_data($label,$cdr_ids[0],'destination','customer','contract_balance_id');
|
||||
Utils::Api::check_interval_history($label,$callee->{customer}->{id},[
|
||||
{ (($in_free_time > $out_free_time) ? (cash => $balance - $callee_costs) : ()),
|
||||
profile => $provider->{subscriber_fees}->[1]->{profile}->{id},
|
||||
id => $balance_id,
|
||||
},
|
||||
]);
|
||||
Utils::Rateomat::check_cdr_time_balance_data($label,$cdr_ids[0],'destination','customer','free_time_balance',
|
||||
{ before => $in_free_time, after => 0 });
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
done_testing();
|
||||
exit;
|
||||
|
||||
sub create_provider {
|
||||
my ($free_time_in,$free_time_out) = @_;
|
||||
return Utils::Api::setup_provider('test<n>.com',
|
||||
[ #rates:
|
||||
{ interval_free_time => $free_time_out,
|
||||
fees => [
|
||||
{
|
||||
direction => 'out',
|
||||
destination => '.',
|
||||
onpeak_init_rate => 3,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 3,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 2,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 2,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
use_free_time => 1,
|
||||
},
|
||||
]},
|
||||
{ interval_free_time => $free_time_in,
|
||||
fees => [
|
||||
{
|
||||
direction => 'in',
|
||||
destination => '.',
|
||||
source => '.',
|
||||
onpeak_init_rate => 4,
|
||||
onpeak_init_interval => $init_secs,
|
||||
onpeak_follow_rate => 4,
|
||||
onpeak_follow_interval => $follow_secs,
|
||||
offpeak_init_rate => 2,
|
||||
offpeak_init_interval => $init_secs,
|
||||
offpeak_follow_rate => 2,
|
||||
offpeak_follow_interval => $follow_secs,
|
||||
interval_free_time => $free_time_in,
|
||||
use_free_time => 1,
|
||||
},
|
||||
]},
|
||||
],
|
||||
[ #billing networks:
|
||||
]
|
||||
);
|
||||
}
|
@ -1,74 +0,0 @@
|
||||
|
||||
use strict;
|
||||
|
||||
use Utils::Api qw();
|
||||
use Utils::Rateomat qw();
|
||||
use Test::More;
|
||||
|
||||
{
|
||||
|
||||
Utils::Rateomat::run_rateomat_threads(3,6);
|
||||
|
||||
}
|
||||
|
||||
#{
|
||||
# my $provider = create_provider();
|
||||
# my $profile = $provider->{subscriber_fees}->[0]->{profile};
|
||||
# my $balance = 5;
|
||||
# my $caller = Utils::Api::setup_subscriber($provider,$profile,$balance,{ cc => 888, ac => '1<n>', sn => '<t>' });
|
||||
# my $callee = Utils::Api::setup_subscriber($provider,$profile,$balance,{ cc => 888, ac => '2<n>', sn => '<t>' });
|
||||
# my $caller_costs = ($provider->{subscriber_fees}->[0]->{fees}->[0]->{onpeak_init_rate} *
|
||||
# $provider->{subscriber_fees}->[0]->{fees}->[0]->{onpeak_init_interval} +
|
||||
# $provider->{subscriber_fees}->[0]->{fees}->[0]->{onpeak_follow_rate} *
|
||||
# $provider->{subscriber_fees}->[0]->{fees}->[0]->{onpeak_follow_interval})/100.0;
|
||||
# my $callee_costs = ($provider->{subscriber_fees}->[0]->{fees}->[1]->{onpeak_init_rate} *
|
||||
# $provider->{subscriber_fees}->[0]->{fees}->[1]->{onpeak_init_interval} +
|
||||
# $provider->{subscriber_fees}->[0]->{fees}->[1]->{onpeak_follow_rate} *
|
||||
# $provider->{subscriber_fees}->[0]->{fees}->[1]->{onpeak_follow_interval})/100.0; #negative!
|
||||
#
|
||||
# my $now = Utils::Api::get_now();
|
||||
# my @cdr_ids = map { $_->{id}; } @{ Utils::Rateomat::create_cdrs([
|
||||
# Utils::Rateomat::prepare_cdr($caller->{subscriber},undef,$caller->{reseller},
|
||||
# $callee->{subscriber},undef,$callee->{reseller},
|
||||
# '192.168.0.1',$now->epoch,61),
|
||||
# ]) };
|
||||
#
|
||||
# if (ok((scalar @cdr_ids) > 0 && Utils::Rateomat::run_rateomat(),'rate-o-mat executed')) {
|
||||
# ok(Utils::Rateomat::check_cdrs('',
|
||||
# map { $_ => { id => $_, rating_status => 'ok', }; } @cdr_ids
|
||||
# ),'cdrs were all processed');
|
||||
# Utils::Api::check_interval_history('negative fees - caller',$caller->{customer}->{id},[
|
||||
# { cash => $balance - $caller_costs,
|
||||
# profile => $provider->{subscriber_fees}->[0]->{profile}->{id} },
|
||||
# ]);
|
||||
# Utils::Api::check_interval_history('negative fees - callee',$callee->{customer}->{id},[
|
||||
# { cash => $balance - $callee_costs,
|
||||
# profile => $provider->{subscriber_fees}->[0]->{profile}->{id} },
|
||||
# ]);
|
||||
# }
|
||||
#
|
||||
#}
|
||||
|
||||
done_testing();
|
||||
exit;
|
||||
|
||||
sub create_provider {
|
||||
my $rate_interval = shift;
|
||||
$rate_interval //= 60;
|
||||
return Utils::Api::setup_provider('test<n>.com',
|
||||
[ #rates:
|
||||
{ #any
|
||||
onpeak_init_rate => 2,
|
||||
onpeak_init_interval => $rate_interval,
|
||||
onpeak_follow_rate => 1,
|
||||
onpeak_follow_interval => $rate_interval,
|
||||
offpeak_init_rate => 2,
|
||||
offpeak_init_interval => $rate_interval,
|
||||
offpeak_follow_rate => 1,
|
||||
offpeak_follow_interval => $rate_interval,
|
||||
},
|
||||
],
|
||||
[ #billing networks:
|
||||
]
|
||||
);
|
||||
}
|
Loading…
Reference in new issue