X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Frate.pm;h=02d8250ebbdc79a777132c2fcbd76c553645e270;hb=b79a8cb932946c849328a3c117c35821d9d21e66;hp=793846a7fd19a234d85b4a3864ac104e61d41c51;hpb=b4f0a47a6893de5f6b11f32307a0195f43a359fb;p=freeside.git diff --git a/FS/FS/rate.pm b/FS/FS/rate.pm index 793846a7f..02d8250eb 100644 --- a/FS/FS/rate.pm +++ b/FS/FS/rate.pm @@ -276,19 +276,34 @@ specificed destination, or the empty string if no rate can be found for the given destination. Destination can be specified as an FS::rate_detail object or regionnum -(see L), or as a hashref with two keys: I -and I. +(see L), or as a hashref containing the following keys: + +=over 2 + +=item I - required. + +=item I - required. + +=item I - optional. Specifies a time in seconds from the start +of the week, and will return a timed rate (one with a non-null I) +if one exists at that time. If not, returns a non-timed rate. + +=item I - optional. Specifies a value for the cdrtypenum +field, and will return a rate matching that, if one exists. If not, returns +a rate with null cdrtypenum. =cut sub dest_detail { my $self = shift; - my $regionnum; + my( $regionnum, $weektime, $cdrtypenum ); if ( ref($_[0]) eq 'HASH' ) { my $countrycode = $_[0]->{'countrycode'}; my $phonenum = $_[0]->{'phonenum'}; + $weektime = $_[0]->{'weektime'}; + $cdrtypenum = $_[0]->{'cdrtypenum'} || ''; #find a rate prefix, first look at most specific, then fewer digits, # finally trying the country code only @@ -309,14 +324,47 @@ sub dest_detail { $regionnum = $rate_prefix->regionnum; - #$rate_region = $rate_prefix->rate_region; - } else { $regionnum = ref($_[0]) ? shift->regionnum : shift; } - qsearchs( 'rate_detail', { 'ratenum' => $self->ratenum, - 'dest_regionnum' => $regionnum, } ); + my %hash = ( + 'ratenum' => $self->ratenum, + 'dest_regionnum' => $regionnum, + ); + + # find all rates matching ratenum, regionnum, cdrtypenum + my @details = qsearch( 'rate_detail', { + %hash, + 'cdrtypenum' => $cdrtypenum + }); + # find all rates maching ratenum, regionnum and null cdrtypenum + if ( !@details and $cdrtypenum ) { + @details = qsearch( 'rate_detail', { + %hash, + 'cdrtypenum' => '' + }); + } + # find one of those matching weektime + if ( defined($weektime) ) { + my @exact = grep { + my $rate_time = $_->rate_time; + $rate_time && $rate_time->contains($weektime) + } @details; + if ( @exact == 1 ) { + return $exact[0]; + } + elsif ( @exact > 1 ) { + die "overlapping rate_detail times (region $regionnum, time $weektime)\n" + } + # else @exact == 0 + } + # if not found or there is no weektime, find one matching null weektime + foreach (@details) { + return $_ if $_->ratetimenum eq ''; + } + # found nothing + return; } =item rate_detail