[freeside-commits] branch FREESIDE_4_BRANCH updated. fba4614e057708bc585b869a517938f29bff25d8

Jonathan Prykop jonathan at 420.am
Thu Jul 7 16:56:24 PDT 2016


The branch, FREESIDE_4_BRANCH has been updated
       via  fba4614e057708bc585b869a517938f29bff25d8 (commit)
       via  f23b09e7f67e0975958bdbbf4209f7c9d5cca38e (commit)
       via  d64f1a567fc1e01033df7b063a13ddd063021995 (commit)
       via  6ac1fddfd60de538bc449090253aa752cfd1fa0b (commit)
      from  699ce50d19af95623f33173c38bb7618553adfc7 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit fba4614e057708bc585b869a517938f29bff25d8
Author: Jonathan Prykop <jonathan at freeside.biz>
Date:   Tue Jul 5 18:35:41 2016 -0500

    RT#17599: display cancelled services from history [bug fixes]

diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index cd801d9..9d20fd6 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -1272,7 +1272,13 @@ sub uncancel_svc_summary {
           'uncancel_svcnum' => $svc_x->get('_h_svc_x')->svcnum,
         };
         $svc_x->pkgnum($self->pkgnum); # provisioning services on a canceled package, will be rolled back
-        if ($opt{'no_test_reprovision'} or $svc_x->insert) {
+        my $insert_error;
+        unless ($opt{'no_test_reprovision'}) {
+          # avoid possibly fatal errors from missing linked records
+          eval { $insert_error = $svc_x->insert };
+          $insert_error ||= $@;
+        }
+        if ($opt{'no_test_reprovision'} or $insert_error) {
           # avoid possibly fatal errors from missing linked records
           eval { $out->{'label'} = $svc_x->label };
           eval { $out->{'label'} = $svc_x->get('_h_svc_x')->label } unless defined($out->{'label'});
diff --git a/FS/FS/h_svc_acct.pm b/FS/FS/h_svc_acct.pm
index 6e127a2..6bc55eb 100644
--- a/FS/FS/h_svc_acct.pm
+++ b/FS/FS/h_svc_acct.pm
@@ -29,6 +29,7 @@ FS::h_svc_acct - Historical account objects
 sub svc_domain {
   my $self = shift;
   local($FS::Record::qsearch_qualify_columns) = 0;
+  $_[0] ||= $self->history_date;
   qsearchs( 'h_svc_domain',
             { 'svcnum' => $self->domsvc },
             FS::h_svc_domain->sql_h_searchs(@_),
diff --git a/FS/FS/h_svc_forward.pm b/FS/FS/h_svc_forward.pm
index 7f6a5cc..bc24fe9 100644
--- a/FS/FS/h_svc_forward.pm
+++ b/FS/FS/h_svc_forward.pm
@@ -35,6 +35,7 @@ sub srcsvc_acct {
 
   local($FS::Record::qsearch_qualify_columns) = 0;
 
+  $_[0] ||= $self->history_date;
   my $h_svc_acct = qsearchs(
     'h_svc_acct',
     { 'svcnum' => $self->srcsvc },
@@ -58,6 +59,7 @@ sub dstsvc_acct {
 
   local($FS::Record::qsearch_qualify_columns) = 0;
 
+  $_[0] ||= $self->history_date;
   my $h_svc_acct = qsearchs(
     'h_svc_acct',
     { 'svcnum' => $self->dstsvc },
diff --git a/FS/FS/h_svc_www.pm b/FS/FS/h_svc_www.pm
index e719f1b..d3f9811 100644
--- a/FS/FS/h_svc_www.pm
+++ b/FS/FS/h_svc_www.pm
@@ -34,6 +34,7 @@ sub domain_record {
   carp 'Called FS::h_svc_www->domain_record on svcnum ' . $self->svcnum if $DEBUG;
 
   local($FS::Record::qsearch_qualify_columns) = 0;
+  $_[0] ||= $self->history_date;
   my $domain_record = qsearchs(
     'h_domain_record',
     { 'recnum' => $self->recnum },

commit f23b09e7f67e0975958bdbbf4209f7c9d5cca38e
Author: Jonathan Prykop <jonathan at freeside.biz>
Date:   Thu Jun 30 23:21:17 2016 -0500

    RT#17599: display cancelled services from history [display unprovisionable services from history]

diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index 5455bae..cd801d9 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -1140,14 +1140,12 @@ sub cancel_if_expired {
 
 For cancelled cust_pkg, returns a list of new, uninserted FS::svc_X records 
 for services that would be inserted by L</uncancel>.  Returned objects also
-include the field '_uncancel_svcnum' that contains the original svcnum.
+include the field _h_svc_x, which contains the service history object.
+
 Set pkgnum before inserting.
 
 Accepts the following options:
 
-summarize_size - if true, returns empty list if number of potential services is 
-equal to or greater than this
-
 only_svcnum - arrayref of svcnum, only returns objects for these svcnum 
 (and only if they would otherwise be returned by this)
 
@@ -1165,19 +1163,20 @@ sub uncancel_svc_x {
   my($end, $start) = ( $self->get('cancel'), $self->get('cancel') - $fuzz );
   my @h_cust_svc = $self->h_cust_svc( $end, $start );
 
-  return () if $opt{'summarize_size'} and @h_cust_svc >= $opt{'summarize_size'};
-
   my @svc_x;
   foreach my $h_cust_svc (@h_cust_svc) {
     next if $opt{'only_svcnum'} && !(grep { $_ == $h_cust_svc->svcnum } @{$opt{'only_svcnum'}});
+    # filter out services that still exist on this package (ie preserved svcs)
+    # but keep services that have since been provisioned on another package (for informational purposes)
+    next if qsearchs('cust_svc',{ 'svcnum' => $h_cust_svc->svcnum, 'pkgnum' => $self->pkgnum });
     my $h_svc_x = $h_cust_svc->h_svc_x( $end, $start );
-    #next unless $h_svc_x; #should this happen?
+    next unless $h_svc_x; # this probably doesn't happen, but just in case
     (my $table = $h_svc_x->table) =~ s/^h_//;
     require "FS/$table.pm";
     my $class = "FS::$table";
     my $svc_x = $class->new( {
       'svcpart' => $h_cust_svc->svcpart,
-      '_uncancel_svcnum' => $h_cust_svc->svcnum,
+      '_h_svc_x' => $h_svc_x,
       map { $_ => $h_svc_x->get($_) } fields($table)
     } );
 
@@ -1218,18 +1217,22 @@ svc
 
 uncancel_svcnum
 
-label
+label - from history table if not currently calculable, undefined if it can't be loaded
 
 reprovisionable - 1 if test reprovision succeeded, otherwise 0
 
+num_cust_svc - number of svcs for this svcpart, only if summarizing (see below)
+
 Cannot be run from within a transaction.  Performs inserts
 to test the results, and then rolls back the transaction.
 Does not perform exports, so does not catch if export would fail.
 
 Also accepts the following options:
 
-summarize_size - if true, returns empty list if number of potential services is 
-equal to or greater than this
+no_test_reprovision - skip the test inserts (reprovisionable field will not exist)
+
+summarize_size - if true, returns a single summary record for svcparts with at
+least this many svcs, will have key num_cust_svc but not uncancel_svcnum, label or reprovisionable
 
 =cut
 
@@ -1242,23 +1245,45 @@ sub uncancel_svc_summary {
   local $FS::svc_Common::noexport_hack = 1; # very important not to run exports!!!
   local $FS::UID::AutoCommit = 0;
 
+  # sort by svcpart, to check summarize_size
+  my $uncancel_svc_x = {};
+  foreach my $svc_x (sort { $a->{'svcpart'} <=> $b->{'svcpart'} } $self->uncancel_svc_x) {
+    $uncancel_svc_x->{$svc_x->svcpart} = [] unless $uncancel_svc_x->{$svc_x->svcpart};
+    push @{$uncancel_svc_x->{$svc_x->svcpart}}, $svc_x;
+  }
+
   my @out;
-  foreach my $svc_x ($self->uncancel_svc_x(%opt)) {
-    $svc_x->pkgnum($self->pkgnum); # provisioning services on a canceled package, will be rolled back
-    my $part_svc = $svc_x->part_svc;
-    my $out = {
-      'svcpart' => $part_svc->svcpart,
-      'svc'     => $part_svc->svc,
-      'uncancel_svcnum' => $svc_x->get('_uncancel_svcnum'),
-    };
-    if ($svc_x->insert) { # if error inserting
-      $out->{'label'} = "(cannot re-provision)";
-      $out->{'reprovisionable'} = 0;
+  foreach my $svcpart (keys %$uncancel_svc_x) {
+    my @svcpart_svc_x = @{$uncancel_svc_x->{$svcpart}};
+    if ($opt{'summarize_size'} && (@svcpart_svc_x >= $opt{'summarize_size'})) {
+      my $svc_x = $svcpart_svc_x[0]; #grab first one for access to $part_svc
+      my $part_svc = $svc_x->part_svc;
+      push @out, {
+        'svcpart'      => $part_svc->svcpart,
+        'svc'          => $part_svc->svc,
+        'num_cust_svc' => scalar(@svcpart_svc_x),
+      };
     } else {
-      $out->{'label'} = $svc_x->label;
-      $out->{'reprovisionable'} = 1;
+      foreach my $svc_x (@svcpart_svc_x) {
+        my $part_svc = $svc_x->part_svc;
+        my $out = {
+          'svcpart' => $part_svc->svcpart,
+          'svc'     => $part_svc->svc,
+          'uncancel_svcnum' => $svc_x->get('_h_svc_x')->svcnum,
+        };
+        $svc_x->pkgnum($self->pkgnum); # provisioning services on a canceled package, will be rolled back
+        if ($opt{'no_test_reprovision'} or $svc_x->insert) {
+          # avoid possibly fatal errors from missing linked records
+          eval { $out->{'label'} = $svc_x->label };
+          eval { $out->{'label'} = $svc_x->get('_h_svc_x')->label } unless defined($out->{'label'});
+          $out->{'reprovisionable'} = 0 unless $opt{'no_test_reprovision'};
+        } else {
+          $out->{'label'} = $svc_x->label;
+          $out->{'reprovisionable'} = 1;
+        }
+        push @out, $out;
+      }
     }
-    push @out, $out;
   }
 
   dbh->rollback;
diff --git a/httemplate/misc/cancel_pkg.html b/httemplate/misc/cancel_pkg.html
index c802897..d3ca996 100755
--- a/httemplate/misc/cancel_pkg.html
+++ b/httemplate/misc/cancel_pkg.html
@@ -60,12 +60,14 @@
 %     foreach my $uncancel_svc (@uncancel_svcs) {
 %       my $uncancel_curr_value = $uncancel_svc->{'uncancel_svcnum'};
 %       my $uncancel_disabled = '';
+%       my $uncancel_postfix = '';
 %       if ($cgi->param('error')) {
-%         $uncancel_curr_value = '' unless grep { $_ == $uncancel_svc->{'_uncancel_svcnum'} } $cgi->param('only_svcnum');
+%         $uncancel_curr_value = '' unless grep { $_ == $uncancel_svc->{'uncancel_svcnum'} } $cgi->param('only_svcnum');
 %       }
 %       unless ($uncancel_svc->{'reprovisionable'}) {
 %         $uncancel_curr_value = '';
 %         $uncancel_disabled = 1;
+%         $uncancel_postfix = '<I>(' . emt('Cannot be reprovisioned') . ')</I>';
 %       }
   <& /elements/tr-checkbox.html,
        'label'  => $uncancel_svc->{'svc'} . ': ' . $uncancel_svc->{'label'},
@@ -73,7 +75,8 @@
        'value'  => $uncancel_svc->{'uncancel_svcnum'},
        'curr_value' => $uncancel_curr_value,
        'disabled'   => $uncancel_disabled,
-       'cell_style' => 'font-weight: normal;'
+       'cell_style' => 'font-weight: normal',
+       'postfix' => $uncancel_postfix,
   &>
 %     }
 %   }
diff --git a/httemplate/view/cust_main/packages/services.html b/httemplate/view/cust_main/packages/services.html
index 352f5ea..a23a4c2 100644
--- a/httemplate/view/cust_main/packages/services.html
+++ b/httemplate/view/cust_main/packages/services.html
@@ -110,13 +110,16 @@ function clearhint_search_cust_svc(obj, str) {
 % } #foreach part_svc
 
 % if ($cust_pkg->get('cancel')) {
-%   foreach my $svc (sort { $a->{'svcpart'} <=> $b->{'svcpart'} } 
-%                      $cust_pkg->uncancel_svc_summary('summarize_size' => $opt{'cust_pkg-large_pkg_size'})
+%   foreach my $svc (
+%     $cust_pkg->uncancel_svc_summary('summarize_size' => $opt{'cust_pkg-large_pkg_size'}, 'no_test_reprovision' => 1)
 %   ) {
-%     next unless $svc->{'reprovisionable'};
       <TR>
         <TD ALIGN="right" VALIGN="top"><% $svc->{'svc'} |h %></TD>
-        <TD STYLE="padding-bottom:0px; font-style: italic"><% $svc->{'label'} |h %></TD>
+        <TD STYLE="padding-bottom:0px; font-style: italic">
+        <% $svc->{'num_cust_svc'} 
+           ? $svc->{'num_cust_svc'} . ' ' . emt('services in history') 
+           : (defined($svc->{'label'}) ? $svc->{'label'} : emt('(cannot load svc label)')) |h %>
+        </TD>
       </TR>
 %   }
 % }
diff --git a/httemplate/view/cust_main/packages/status.html b/httemplate/view/cust_main/packages/status.html
index 1d3de85..2d2ffb2 100644
--- a/httemplate/view/cust_main/packages/status.html
+++ b/httemplate/view/cust_main/packages/status.html
@@ -715,6 +715,8 @@ sub pkg_uncancel_link {
              'actionlabel' => emt('Un-cancel'),
              #'color'       =>  #?
              'cust_pkg'    => shift,
+             'width'       => 960,
+             'height'      => 740,
          )
 }
 

commit d64f1a567fc1e01033df7b063a13ddd063021995
Author: Jonathan Prykop <jonathan at freeside.biz>
Date:   Tue Jun 21 01:13:55 2016 -0500

    RT#17599: display cancelled services from history [doc fix]

diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index 0cce60b..5455bae 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -1209,8 +1209,8 @@ sub uncancel_svc_x {
 
 =item uncancel_svc_summary
 
-Returns an array of hashrefs, one for each service that could be 
-successfully reprovisioned by L</uncancel>, with the following keys:
+Returns an array of hashrefs, one for each service that could 
+potentially be reprovisioned by L</uncancel>, with the following keys:
 
 svcpart
 

commit 6ac1fddfd60de538bc449090253aa752cfd1fa0b
Author: Jonathan Prykop <jonathan at freeside.biz>
Date:   Tue Jun 21 01:11:43 2016 -0500

    RT#17599: display cancelled services from history

diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm
index 4320249..0cce60b 100644
--- a/FS/FS/cust_pkg.pm
+++ b/FS/FS/cust_pkg.pm
@@ -1136,6 +1136,135 @@ sub cancel_if_expired {
   '';
 }
 
+=item uncancel_svc_x
+
+For cancelled cust_pkg, returns a list of new, uninserted FS::svc_X records 
+for services that would be inserted by L</uncancel>.  Returned objects also
+include the field '_uncancel_svcnum' that contains the original svcnum.
+Set pkgnum before inserting.
+
+Accepts the following options:
+
+summarize_size - if true, returns empty list if number of potential services is 
+equal to or greater than this
+
+only_svcnum - arrayref of svcnum, only returns objects for these svcnum 
+(and only if they would otherwise be returned by this)
+
+=cut
+
+sub uncancel_svc_x {
+  my ($self, %opt) = @_;
+
+  die 'uncancel_svc_x called on a non-cancelled cust_pkg' unless $self->get('cancel');
+
+  #find historical services within this timeframe before the package cancel
+  # (incompatible with "time" option to cust_pkg->cancel?)
+  my $fuzz = 2 * 60; #2 minutes?  too much?   (might catch separate unprovision)
+                     #            too little? (unprovisioing export delay?)
+  my($end, $start) = ( $self->get('cancel'), $self->get('cancel') - $fuzz );
+  my @h_cust_svc = $self->h_cust_svc( $end, $start );
+
+  return () if $opt{'summarize_size'} and @h_cust_svc >= $opt{'summarize_size'};
+
+  my @svc_x;
+  foreach my $h_cust_svc (@h_cust_svc) {
+    next if $opt{'only_svcnum'} && !(grep { $_ == $h_cust_svc->svcnum } @{$opt{'only_svcnum'}});
+    my $h_svc_x = $h_cust_svc->h_svc_x( $end, $start );
+    #next unless $h_svc_x; #should this happen?
+    (my $table = $h_svc_x->table) =~ s/^h_//;
+    require "FS/$table.pm";
+    my $class = "FS::$table";
+    my $svc_x = $class->new( {
+      'svcpart' => $h_cust_svc->svcpart,
+      '_uncancel_svcnum' => $h_cust_svc->svcnum,
+      map { $_ => $h_svc_x->get($_) } fields($table)
+    } );
+
+    # radius_usergroup
+    if ( $h_svc_x->isa('FS::h_svc_Radius_Mixin') ) {
+      $svc_x->usergroup( [ $h_svc_x->h_usergroup($end, $start) ] );
+    }
+
+    #these are pretty rare, but should handle them
+    # - dsl_device (mac addresses)
+    # - phone_device (mac addresses)
+    # - dsl_note (ikano notes)
+    # - domain_record (i.e. restore DNS information w/domains)
+    # - inventory_item(?) (inventory w/un-cancelling service?)
+    # - nas (svc_broaband nas stuff)
+    #this stuff is unused in the wild afaik
+    # - mailinglistmember
+    # - router.svcnum?
+    # - svc_domain.parent_svcnum?
+    # - acct_snarf (ancient mail fetching config)
+    # - cgp_rule (communigate)
+    # - cust_svc_option (used by our Tron stuff)
+    # - acct_rt_transaction (used by our time worked stuff)
+
+    push @svc_x, $svc_x;
+  }
+  return @svc_x;
+}
+
+=item uncancel_svc_summary
+
+Returns an array of hashrefs, one for each service that could be 
+successfully reprovisioned by L</uncancel>, with the following keys:
+
+svcpart
+
+svc
+
+uncancel_svcnum
+
+label
+
+reprovisionable - 1 if test reprovision succeeded, otherwise 0
+
+Cannot be run from within a transaction.  Performs inserts
+to test the results, and then rolls back the transaction.
+Does not perform exports, so does not catch if export would fail.
+
+Also accepts the following options:
+
+summarize_size - if true, returns empty list if number of potential services is 
+equal to or greater than this
+
+=cut
+
+sub uncancel_svc_summary {
+  my ($self, %opt) = @_;
+
+  die 'uncancel_svc_summary called on a non-cancelled cust_pkg' unless $self->get('cancel');
+  die 'uncancel_svc_summary called from within a transaction' unless $FS::UID::AutoCommit;
+
+  local $FS::svc_Common::noexport_hack = 1; # very important not to run exports!!!
+  local $FS::UID::AutoCommit = 0;
+
+  my @out;
+  foreach my $svc_x ($self->uncancel_svc_x(%opt)) {
+    $svc_x->pkgnum($self->pkgnum); # provisioning services on a canceled package, will be rolled back
+    my $part_svc = $svc_x->part_svc;
+    my $out = {
+      'svcpart' => $part_svc->svcpart,
+      'svc'     => $part_svc->svc,
+      'uncancel_svcnum' => $svc_x->get('_uncancel_svcnum'),
+    };
+    if ($svc_x->insert) { # if error inserting
+      $out->{'label'} = "(cannot re-provision)";
+      $out->{'reprovisionable'} = 0;
+    } else {
+      $out->{'label'} = $svc_x->label;
+      $out->{'reprovisionable'} = 1;
+    }
+    push @out, $out;
+  }
+
+  dbh->rollback;
+  return @out;
+}
+
 =item uncancel
 
 "Un-cancels" this package: Orders a new package with the same custnum, pkgpart,
@@ -1148,6 +1277,8 @@ svc_fatal: service provisioning errors are fatal
 
 svc_errors: pass an array reference, will be filled in with any provisioning errors
 
+only_svcnum: arrayref, only attempt to re-provision these cancelled services
+
 main_pkgnum: link the package as a supplemental package of this one.  For 
 internal use only.
 
@@ -1204,32 +1335,12 @@ sub uncancel {
   # insert services
   ##
 
-  #find historical services within this timeframe before the package cancel
-  # (incompatible with "time" option to cust_pkg->cancel?)
-  my $fuzz = 2 * 60; #2 minutes?  too much?   (might catch separate unprovision)
-                     #            too little? (unprovisioing export delay?)
-  my($end, $start) = ( $self->get('cancel'), $self->get('cancel') - $fuzz );
-  my @h_cust_svc = $self->h_cust_svc( $end, $start );
-
   my @svc_errors;
-  foreach my $h_cust_svc (@h_cust_svc) {
-    my $h_svc_x = $h_cust_svc->h_svc_x( $end, $start );
-    #next unless $h_svc_x; #should this happen?
-    (my $table = $h_svc_x->table) =~ s/^h_//;
-    require "FS/$table.pm";
-    my $class = "FS::$table";
-    my $svc_x = $class->new( {
-      'pkgnum'  => $cust_pkg->pkgnum,
-      'svcpart' => $h_cust_svc->svcpart,
-      map { $_ => $h_svc_x->get($_) } fields($table)
-    } );
-
-    # radius_usergroup
-    if ( $h_svc_x->isa('FS::h_svc_Radius_Mixin') ) {
-      $svc_x->usergroup( [ $h_svc_x->h_usergroup($end, $start) ] );
-    }
+  foreach my $svc_x ($self->uncancel_svc_x('only_svcnum' => $options{'only_svcnum'})) {
 
+    $svc_x->pkgnum($cust_pkg->pkgnum);
     my $svc_error = $svc_x->insert;
+
     if ( $svc_error ) {
       if ( $options{svc_fatal} ) {
         $dbh->rollback if $oldAutoCommit;
@@ -1253,23 +1364,7 @@ sub uncancel {
         }
       } # svc_fatal
     } # svc_error
-  } #foreach $h_cust_svc
-
-  #these are pretty rare, but should handle them
-  # - dsl_device (mac addresses)
-  # - phone_device (mac addresses)
-  # - dsl_note (ikano notes)
-  # - domain_record (i.e. restore DNS information w/domains)
-  # - inventory_item(?) (inventory w/un-cancelling service?)
-  # - nas (svc_broaband nas stuff)
-  #this stuff is unused in the wild afaik
-  # - mailinglistmember
-  # - router.svcnum?
-  # - svc_domain.parent_svcnum?
-  # - acct_snarf (ancient mail fetching config)
-  # - cgp_rule (communigate)
-  # - cust_svc_option (used by our Tron stuff)
-  # - acct_rt_transaction (used by our time worked stuff)
+  } #foreach uncancel_svc_x
 
   ##
   # also move over any services that didn't unprovision at cancellation
diff --git a/httemplate/misc/cancel_pkg.html b/httemplate/misc/cancel_pkg.html
index 81c5c48..c802897 100755
--- a/httemplate/misc/cancel_pkg.html
+++ b/httemplate/misc/cancel_pkg.html
@@ -45,12 +45,38 @@
   } &>
 
   <& /elements/tr-checkbox.html,
-       'label'  => mt("Uncancel even if a service can't be re-provisioned"),
+       'label'  => mt("Uncancel even if service reprovisioning fails"),
        'field'  => 'svc_not_fatal',
        'value'  => 'Y',
   &>
 
 %   $date_init = 1;
+%   my @uncancel_svcs = sort { $b->{'reprovisionable'} <=> $a->{'reprovisionable'} }
+%                       sort { $a->{'svcpart'} <=> $b->{'svcpart'} } 
+%                       $cust_pkg->uncancel_svc_summary();
+%   if (@uncancel_svcs) {
+<TR><TD COLSPAN="2"> </TD></TR>
+<TR><TH ALIGN="right"><% emt("Re-provision the following services") %></TH><TD></TD>
+%     foreach my $uncancel_svc (@uncancel_svcs) {
+%       my $uncancel_curr_value = $uncancel_svc->{'uncancel_svcnum'};
+%       my $uncancel_disabled = '';
+%       if ($cgi->param('error')) {
+%         $uncancel_curr_value = '' unless grep { $_ == $uncancel_svc->{'_uncancel_svcnum'} } $cgi->param('only_svcnum');
+%       }
+%       unless ($uncancel_svc->{'reprovisionable'}) {
+%         $uncancel_curr_value = '';
+%         $uncancel_disabled = 1;
+%       }
+  <& /elements/tr-checkbox.html,
+       'label'  => $uncancel_svc->{'svc'} . ': ' . $uncancel_svc->{'label'},
+       'field'  => 'only_svcnum',
+       'value'  => $uncancel_svc->{'uncancel_svcnum'},
+       'curr_value' => $uncancel_curr_value,
+       'disabled'   => $uncancel_disabled,
+       'cell_style' => 'font-weight: normal;'
+  &>
+%     }
+%   }
 % }
 
 % unless ( $method eq 'resume' || $method eq 'uncancel' ) {
diff --git a/httemplate/misc/process/cancel_pkg.html b/httemplate/misc/process/cancel_pkg.html
index 6972a49..eb3b2ef 100755
--- a/httemplate/misc/process/cancel_pkg.html
+++ b/httemplate/misc/process/cancel_pkg.html
@@ -85,6 +85,8 @@ my $bill =
 
 my $svc_fatal = ( $cgi->param('svc_not_fatal') ne 'Y' );
 
+my $only_svcnum = ($method eq 'uncancel') ? [ $cgi->param('only_svcnum') ] : undef;
+
 $error ||=  $cust_pkg->$method( 'reason'      => $reasonnum,
                                 'date'        => $date,
                                 'resume_date' => $resume_date,
@@ -92,6 +94,7 @@ $error ||=  $cust_pkg->$method( 'reason'      => $reasonnum,
                                 'bill'        => $bill,
                                 'svc_fatal'   => $svc_fatal,
                                 'options'     => $options,
+                                'only_svcnum' => $only_svcnum,
                               );
 
 if ($error) {
diff --git a/httemplate/view/cust_main/packages/services.html b/httemplate/view/cust_main/packages/services.html
index 39055f4..352f5ea 100644
--- a/httemplate/view/cust_main/packages/services.html
+++ b/httemplate/view/cust_main/packages/services.html
@@ -105,9 +105,22 @@ function clearhint_search_cust_svc(obj, str) {
         </TD>
       </TR>
 
-%   } 
+%   }
+
+% } #foreach part_svc
+
+% if ($cust_pkg->get('cancel')) {
+%   foreach my $svc (sort { $a->{'svcpart'} <=> $b->{'svcpart'} } 
+%                      $cust_pkg->uncancel_svc_summary('summarize_size' => $opt{'cust_pkg-large_pkg_size'})
+%   ) {
+%     next unless $svc->{'reprovisionable'};
+      <TR>
+        <TD ALIGN="right" VALIGN="top"><% $svc->{'svc'} |h %></TD>
+        <TD STYLE="padding-bottom:0px; font-style: italic"><% $svc->{'label'} |h %></TD>
+      </TR>
+%   }
+% }
 
-% } 
 
     </TABLE>
   </TD>

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/cust_pkg.pm                                |  206 +++++++++++++++++-----
 FS/FS/h_svc_acct.pm                              |    1 +
 FS/FS/h_svc_forward.pm                           |    2 +
 FS/FS/h_svc_www.pm                               |    1 +
 httemplate/misc/cancel_pkg.html                  |   31 +++-
 httemplate/misc/process/cancel_pkg.html          |    3 +
 httemplate/view/cust_main/packages/services.html |   20 ++-
 httemplate/view/cust_main/packages/status.html   |    2 +
 8 files changed, 223 insertions(+), 43 deletions(-)




More information about the freeside-commits mailing list