allow a default rate detail for each CDR type, #38633
authorMark Wells <mark@freeside.biz>
Fri, 23 Oct 2015 19:03:24 +0000 (12:03 -0700)
committerMark Wells <mark@freeside.biz>
Fri, 23 Oct 2015 19:03:44 +0000 (12:03 -0700)
FS/FS/rate.pm
FS/FS/rate_detail.pm
httemplate/browse/part_pkg.cgi
httemplate/edit/elements/rate_detail.html
httemplate/edit/process/rate_detail.html
httemplate/edit/rate.cgi

index 50657ce..bdf689a 100644 (file)
@@ -55,6 +55,8 @@ it may still be processed under a different pricing addon package), or be
 marked as 'skipped', or throw a fatal error, depending on the setting of 
 the 'ignore_unrateable' package option.
 
+Deprecated; we now find the default detail by its lack of regionnum.
+
 =item 
 
 =back
@@ -348,7 +350,11 @@ sub dest_detail {
       });
     }
 
-    return $self->default_detail unless $rate_prefix;
+    if ( !$rate_prefix ) {
+      # then this call doesn't match any known region; just return the
+      # appropriate anywhere rate
+      return $self->default_detail($cdrtypenum) || $self->default_detail('');
+    }
 
     $regionnum = $rate_prefix->regionnum;
 
@@ -366,7 +372,14 @@ sub dest_detail {
       %hash,
       'cdrtypenum' => $cdrtypenum
     });
-  # find all rates maching ratenum, regionnum and null cdrtypenum
+  # failing that, return the global default for this plan with the correct
+  # cdrtypenum (skips weektime processing)
+  if ( !@details and $cdrtypenum ) {
+    my $detail = $self->default_detail($cdrtypenum);
+    return $detail if $detail;
+  }
+  # failing that, find all rates maching ratenum, regionnum and null cdrtypenum
+  # (these can have weektime stuff)
   if ( !@details and $cdrtypenum ) {
     @details = qsearch( 'rate_detail', {
         %hash,
@@ -392,7 +405,7 @@ sub dest_detail {
     return $_ if $_->ratetimenum eq '';
   }
   # if still nothing, return the global default rate for this plan
-  return $self->default_detail;
+  return $self->default_detail('');
 }
 
 =item rate_detail
@@ -419,16 +432,24 @@ sub agent {
 
 =back
 
-=item default_detail
+=item default_detail [ CDRTYPENUM ]
 
-Returns the default rate detail, if there is one.
+Returns the default rate detail for CDRTYPENUM (or for null CDR type, if not
+specified).
 
 =cut
 
 sub default_detail {
   my $self = shift;
-  $self->default_detailnum ?
-    FS::rate_detail->by_key($self->default_detailnum) : ''
+  my $cdrtypenum = shift || '';
+#  $self->default_detailnum ?
+#    FS::rate_detail->by_key($self->default_detailnum) : ''
+  qsearchs( 'rate_detail', {
+      ratenum         => $self->ratenum,
+      cdrtypenum      => $cdrtypenum,
+      dest_regionnum  => '',
+      orig_regionnum  => '',
+  }) || '';
 }
 
 =head1 SUBROUTINES
index f777965..4f1c962 100644 (file)
@@ -133,6 +133,7 @@ sub check {
     || $self->ut_foreign_key('ratenum', 'rate', 'ratenum')
     || $self->ut_foreign_keyn('orig_regionnum', 'rate_region', 'regionnum' )
     || $self->ut_foreign_keyn('dest_regionnum', 'rate_region', 'regionnum' )
+    || $self->ut_foreign_keyn('cdrtypenum', 'cdr_type', 'cdrtypenum' )
     || $self->ut_number('min_included')
 
     #|| $self->ut_money('min_charge')
@@ -202,6 +203,8 @@ sub dest_regionname {
   my $self = shift;
   my $dest_region = $self->dest_region;
   $dest_region ? $dest_region->regionname : 'Global default';
+    # should be 'Anywhere' or something, to indicate that it's the
+    # cross-region default
 }
 
 =item dest_prefixes_short
@@ -238,7 +241,7 @@ associated with this rate plan.
 
 sub rate_time_name {
   my $self = shift;
-  $self->ratetimenum ? $self->rate_time->ratetimename : '(default)';
+  $self->ratetimenum ? $self->rate_time->ratetimename : '(any time)';
 }
 
 =item classname
index 11eca67..3767995 100755 (executable)
@@ -88,6 +88,14 @@ if ( $cgi->param('missing_recur_fee') ) {
                            )";
 }
 
+if ( $cgi->param('ratenum') =~ /^(\d+)$/ ) {
+  push @where, "EXISTS( SELECT 1 FROM part_pkg_option
+                          WHERE optionname LIKE '%ratenum'
+                            AND optionvalue = '$1'
+                            AND part_pkg_option.pkgpart = part_pkg.pkgpart
+                      )";
+}
+
 if ( $cgi->param('family') =~ /^(\d+)$/ ) {
   $family_pkgpart = $1;
   push @where, "family_pkgpart = $1";
index 7b5ec31..32dd502 100644 (file)
@@ -61,18 +61,18 @@ with row headers showing the region name and prefixes.
 %   $row++;
 % }# foreach @rate_region
 % if ( !$opt{regionnum} ) {
-%# global default
+%   # global default for this cdrtypenum
 <TR>
   <TD COLSPAN=2 STYLE="padding-top: 10px">
     <B>Global default</B> (for calls not matching any prefix)
   </TD>
   <TD STYLE="padding-top: 10px">
-%   # default rate: set a null region
+%   # default rate: set a null region for this cdr type
     <B>
     <& .detail_box,
-      detail      => $rate->default_detail,
+      detail      => $rate->default_detail($cdrtypenum),
       ratetimenum => '',
-      cdrtypenum  => '',
+      cdrtypenum  => $cdrtypenum,
       regionnum   => '',
       ratenum     => $rate->ratenum
     &>
index f8a7444..4020ce9 100644 (file)
@@ -2,7 +2,7 @@
   'table' => 'rate_detail',
   'popup_reload' => 'Rate changed', #a popup "parent reload" for now
               #someday change the individual element and go away instead
-  'noerror_callback' => $set_default_detail
+  #'noerror_callback' => $set_default_detail
 &>
 <%init>
 
@@ -12,19 +12,11 @@ die "access denied"
 
 my $set_default_detail = sub {
   my ($cgi, $rate_detail) = @_;
-  if (!$rate_detail->dest_regionnum) {
+  if (!$rate_detail->dest_regionnum and !$rate_detail->cdrtypenum) {
     # then this is a global default rate
+    # default_detailnum is no longer used, but maintain it anyway (and point
+    # it at the one with null cdrtypenum)
     my $rate = $rate_detail->rate;
-    if ($rate->default_detailnum) {
-      if ($rate->default_detailnum == $rate_detail->ratedetailnum) {
-        return;
-      } else {
-        # there's somehow an existing default rate. remove it.
-        my $old_default = $rate->default_detail;
-        my $error = $old_default->delete;
-        die "$error (removing old default rate)\n" if $error;
-      }
-    }
     $rate->set('default_detailnum' => $rate_detail->ratedetailnum);
     my $error = $rate->replace;
     die "$error (setting default rate)\n" if $error;
index 1b052d6..5bfc108 100644 (file)
@@ -1,7 +1,11 @@
-<% include("/elements/header.html","$action Rate plan", menubar(
+<& /elements/header.html,
+  "$action Rate plan",
+  menubar(
       'View all rate plans' => "${p}browse/rate.cgi",
-    ))
-%>
+      'View packages that use this plan' => "${p}browse/part_pkg.cgi?ratenum="
+                                            . $rate->ratenum,
+  )
+&>
 
 <% include('/elements/progress-init.html',
               'OneTrueForm',