#'upstream_rateplanid' => '',
#'ratedetailnum' => '',
'rated_price' => 'Rated price',
#'upstream_rateplanid' => '',
#'ratedetailnum' => '',
'rated_price' => 'Rated price',
'freesiderewritestatus' => 'Freeside rewrite status',
'cdrbatch' => 'Legacy batch',
'cdrbatchnum' => 'Batch',
'freesiderewritestatus' => 'Freeside rewrite status',
'cdrbatch' => 'Legacy batch',
'cdrbatchnum' => 'Batch',
- my $error =
- $self->ut_numbern('acctid');
+ my $error = $self->ut_numbern('acctid');
+ return $error if $error;
+
+ if ( $self->freesidestatus ne 'done' ) {
+ $self->set('detailnum', ''); # can't have this on an unbilled call
+ }
# # Telstra =1, Optus = 2, RSL COM = 3
# || $self->ut_foreign_keyn('carrierid', 'cdr_carrier', 'carrierid' )
# # Telstra =1, Optus = 2, RSL COM = 3
# || $self->ut_foreign_keyn('carrierid', 'cdr_carrier', 'carrierid' )
my $field = scalar(@_) ? shift : 'dst';
my $country = $conf->config('tollfree-country') || '';
if ( $country eq 'AU' ) {
my $field = scalar(@_) ? shift : 'dst';
my $country = $conf->config('tollfree-country') || '';
if ( $country eq 'AU' ) {
} elsif ( $country eq 'NZ' ) {
( $self->$field() =~ /^(\+?64)?(800|508)/ ) ? 1 : 0;
} else { #NANPA (US/Canaada)
} elsif ( $country eq 'NZ' ) {
( $self->$field() =~ /^(\+?64)?(800|508)/ ) ? 1 : 0;
} else { #NANPA (US/Canaada)
Available options are: inbound, rated_pretty_dst, rated_regionname,
rated_seconds, rated_minutes, rated_granularity, rated_ratedetailnum,
Available options are: inbound, rated_pretty_dst, rated_regionname,
rated_seconds, rated_minutes, rated_granularity, rated_ratedetailnum,
-rated_classnum, rated_ratename.
+rated_classnum, rated_ratename, and set_rate_cost (if true, will set
+a recalculated L</rate_cost> in the rated_cost field after the other
+fields are set; does not work with inbound.)
qw( pretty_dst regionname seconds minutes granularity
ratedetailnum classnum ratename );
$self->svcnum($svcnum) if $svcnum;
qw( pretty_dst regionname seconds minutes granularity
ratedetailnum classnum ratename );
$self->svcnum($svcnum) if $svcnum;
+ # before doing anything else, if there's an upstream multiplier and
+ # an upstream price, add that to the charge. (usually the rate detail
+ # will then have a minute charge of zero, but not necessarily.)
+ $charge += ($self->upstream_price || 0) * $rate_detail->upstream_mult_charge;
+
'rated_seconds' => $rated_seconds, #$seconds,
'rated_granularity' => $rate_detail->sec_granularity, #$granularity
'rated_ratedetailnum' => $rate_detail->ratedetailnum,
'rated_classnum' => $rate_detail->classnum, #rated_ratedetailnum?
'rated_ratename' => $ratename, #not rate_detail - Intrastate/Interstate
'rated_seconds' => $rated_seconds, #$seconds,
'rated_granularity' => $rate_detail->sec_granularity, #$granularity
'rated_ratedetailnum' => $rate_detail->ratedetailnum,
'rated_classnum' => $rate_detail->classnum, #rated_ratedetailnum?
'rated_ratename' => $ratename, #not rate_detail - Intrastate/Interstate
- my $minutes = $self->rated_seconds / 60;
- my $charge = $rate_detail->conn_cost + $minutes * $rate_detail->min_cost;
+ if ( $self->rated_granularity == 0 ) {
+ $charge += $rate_detail->min_cost;
+ } else {
+ my $minutes = $self->rated_seconds / 60;
+ $charge += $rate_detail->conn_cost + $minutes * $rate_detail->min_cost;
+ }
# optionally without seconds
($mon, $day, $year, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
$sec = 0 if !defined($sec);
# optionally without seconds
($mon, $day, $year, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
$sec = 0 if !defined($sec);
# broadsoft: 20081223201938.314
($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
} elsif ( $date =~ /^\s*(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\d+(\D|$)/ ) {
# broadsoft: 20081223201938.314
($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
} elsif ( $date =~ /^\s*(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\d+(\D|$)/ ) {
# WIP: 20100329121420
($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
} elsif ( $date =~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/) {
# WIP: 20100329121420
($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
} elsif ( $date =~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/) {
($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
$options{gmt} = 1;
} else {
($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
$options{gmt} = 1;
} else {