[freeside-commits] freeside/FS/FS Schema.pm, 1.268, 1.269 cdr_type.pm, 1.1, 1.2 rate.pm, 1.13, 1.14 rate_detail.pm, 1.13, 1.14
Mark Wells
mark at wavetail.420.am
Fri Feb 11 15:59:30 PST 2011
Update of /home/cvs/cvsroot/freeside/FS/FS
In directory wavetail.420.am:/tmp/cvs-serv19280/FS/FS
Modified Files:
Schema.pm cdr_type.pm rate.pm rate_detail.pm
Log Message:
rate selection by CDR type, RT#10991
Index: cdr_type.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cdr_type.pm,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -w -d -r1.1 -r1.2
--- cdr_type.pm 18 Feb 2006 11:14:19 -0000 1.1
+++ cdr_type.pm 11 Feb 2011 23:59:28 -0000 1.2
@@ -34,7 +34,7 @@
=item cdrtypenum - primary key
-=item typename - CDR type name
+=item cdrtypename - CDR type name
=back
@@ -98,7 +98,7 @@
my $error =
$self->ut_numbern('cdrtypenum')
- || $self->ut_text('typename')
+ || $self->ut_text('cdrtypename')
;
return $error if $error;
Index: Schema.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/Schema.pm,v
retrieving revision 1.268
retrieving revision 1.269
diff -u -w -d -r1.268 -r1.269
--- Schema.pm 22 Jan 2011 20:03:50 -0000 1.268
+++ Schema.pm 11 Feb 2011 23:59:28 -0000 1.269
@@ -2489,6 +2489,7 @@
'sec_granularity', 'int', '', '', '', '',
'ratetimenum', 'int', 'NULL', '', '', '',
'classnum', 'int', 'NULL', '', '', '',
+ 'cdrtypenum', 'int', 'NULL', '', '', '',
],
'primary_key' => 'ratedetailnum',
'unique' => [ [ 'ratenum', 'orig_regionnum', 'dest_regionnum' ] ],
Index: rate_detail.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/rate_detail.pm,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -w -d -r1.13 -r1.14
--- rate_detail.pm 1 Jul 2010 01:53:49 -0000 1.13
+++ rate_detail.pm 11 Feb 2011 23:59:28 -0000 1.14
@@ -57,6 +57,8 @@
=item ratetimenum - rating time period (see L<FS::rate_time) if any
+=item cdrtypenum - CDR type (see L<FS::cdr_type>) if any for this rate
+
=back
=head1 METHODS
@@ -234,6 +236,20 @@
$usage_class ? $usage_class->classname : '';
}
+=item cdrtypename
+
+Returns the name of the CDR type (see L<FS::cdr_type) associated with this
+rate, if there is one. If not, returns the cdrtypenum itself. This will
+only return an empty string if cdrtypenum is NULL.
+
+=cut
+
+sub cdrtypename {
+ my $self = shift;
+ my $cdrtypenum = $self->cdrtypenum or return '';
+ my $cdr_type = qsearchs('cdr_type', { cdrtypenum => $cdrtypenum });
+ return $cdr_type ? $cdr_type->cdrtypename : $cdrtypenum;
+}
=back
Index: rate.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/rate.pm,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -w -d -r1.13 -r1.14
--- rate.pm 1 Jul 2010 01:53:49 -0000 1.13
+++ rate.pm 11 Feb 2011 23:59:28 -0000 1.14
@@ -276,25 +276,34 @@
the given destination.
Destination can be specified as an FS::rate_detail object or regionnum
-(see L<FS::rate_detail>), or as a hashref with two keys: I<countrycode>
-and I<phonenum>.
+(see L<FS::rate_detail>), or as a hashref containing the following keys:
-An optional third key, I<weektime>, will return a timed rate (one with
-a non-null I<ratetimenum>) if one exists for a call at that time. If
-no matching timed rate exists, the non-timed rate will be returned.
+=over 2
+
+=item I<countrycode> - required.
+
+=item I<phonenum> - required.
+
+=item I<weektime> - optional. Specifies a time in seconds from the start
+of the week, and will return a timed rate (one with a non-null I<ratetimenum>)
+if one exists at that time. If not, returns a non-timed rate.
+
+=item I<cdrtypenum> - 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 $weektime;
+ 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
@@ -315,36 +324,47 @@
$regionnum = $rate_prefix->regionnum;
- #$rate_region = $rate_prefix->rate_region;
-
} else {
$regionnum = ref($_[0]) ? shift->regionnum : shift;
}
- if(!defined($weektime)) {
- return qsearchs( 'rate_detail',
- { 'ratenum' => $self->ratenum,
+ my %hash = (
+ 'ratenum' => $self->ratenum,
'dest_regionnum' => $regionnum,
- 'ratetimenum' => '',
+ );
+
+ # 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' => ''
} );
}
- else {
- my @details = grep { my $rate_time = $_->rate_time;
- $rate_time && $rate_time->contains($weektime) }
- qsearch( 'rate_detail',
- { 'ratenum' => $self->ratenum,
- 'dest_regionnum' => $regionnum, } );
- if(!@details) {
- # this may change at some point
- return $self->dest_detail($regionnum);
+ # 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(@details == 1) {
- return $details[0];
+ elsif ( @exact > 1 ) {
+ die "overlapping rate_detail times (region $regionnum, time $weektime)\n"
}
- else {
- 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
More information about the freeside-commits
mailing list