[freeside-commits] branch FREESIDE_3_BRANCH updated. 3a7bc0d57b87bd8f570e208b758cbab73996fa00

Christopher Burger burgerc at freeside.biz
Tue Apr 30 10:52:09 PDT 2019


The branch, FREESIDE_3_BRANCH has been updated
       via  3a7bc0d57b87bd8f570e208b758cbab73996fa00 (commit)
       via  aa8b421f5b51cebbffbe8d0686a63f72d274106a (commit)
       via  710841aeba1632f57ab34d4e2abce3d65b531f69 (commit)
      from  69a13395159bf8df783d74cbcb5f9444e1a946d5 (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 3a7bc0d57b87bd8f570e208b758cbab73996fa00
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Tue Apr 30 13:43:18 2019 -0400

    RT# 83211 - added new report

diff --git a/httemplate/search/report_svc_export_test.cgi b/httemplate/search/report_svc_export_test.cgi
new file mode 100644
index 000000000..b02f0e216
--- /dev/null
+++ b/httemplate/search/report_svc_export_test.cgi
@@ -0,0 +1,44 @@
+<& /elements/header.html, $title &>
+
+% #foreach my $group (keys(%$errors)) {
+% foreach my $error (@$errors) {
+% my $group = (keys %$error)[0];	
+<TABLE>
+  <TR><TH ALIGN="left" COLSPAN="3"><FONT SIZE="+1">
+    Found <% $error->{$group}->{'count'} %> <% $error->{$group}->{'description'} %> attached to <% $export %> export.
+% if ($error->{$group}->{'errors'}) {
+    <FONT COLOR="red">(<% scalar(keys %{$error->{$group}->{'errors'}}) %>) error(s)</FONT>
+% }
+  </FONT></TH></TR>
+% unless ($error->{$group}->{'errors'}) {
+    <TR><TD> </TD><TD COLSPAN=2><FONT COLOR="green">No errors found</FONT></TD></TR>
+%}
+% foreach my $e (keys(%{$error->{$group}->{'errors'}})) {
+    <TR><TD> </TD><TD COLSPAN=2>
+      <% $error->{$group}->{'errors'}->{$e}->{'description'} %>
+%     if ($error->{$group}->{'errors'}->{$e}->{'link'}) {
+	   <A HREF="<% $error->{$group}->{'errors'}->{$e}->{'link'} %>">(edit)</A>
+%     }
+    </TD></TR>
+%   foreach my $err (keys(%{$error->{$group}->{'errors'}->{$e}->{'errors'}})) {
+      <TR><TD> </TD><TD> </TD><TD><FONT COLOR="red" SIZE="-1"><% $error->{$group}->{'errors'}->{$e}->{'errors'}->{$err} %></FONT></TD></TR>
+%   }
+% }  
+</TABLE>
+% }
+<& /elements/footer.html &>
+
+<%init>
+
+my $DEBUG = $cgi->param('debug') || 0;
+my $conf = new FS::Conf;
+my $export = $cgi->param('export');
+my $title = $export." export test";
+
+my $opts = { 'fsurl' => $fsurl, };
+
+my $exports = FS::part_export::export_info();
+my $class = "FS::part_export::$export" if $exports->{$export};
+my $errors = $class->test_export_report($opts);
+
+</%init>
\ No newline at end of file

commit aa8b421f5b51cebbffbe8d0686a63f72d274106a
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Tue Apr 30 08:42:20 2019 -0400

    RT# 83211 - Added service export error test report

diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
index f479c309e..783c1d006 100644
--- a/FS/FS/part_export/saisei.pm
+++ b/FS/FS/part_export/saisei.pm
@@ -549,8 +549,8 @@ Creates a rateplan.
 sub api_create_rateplan {
   my ($self, $svc, $rateplan) = @_;
 
-  $self->{'__saisei_error'} = "There is no download speed set for the service !--service,".$svc->svcnum.",".$rateplan."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a download speed set for them." if !$svc->{Hash}->{speed_down};
-  $self->{'__saisei_error'} = "There is no upload speed set for the service !--service,".$svc->svcnum.",".$rateplan."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a upload speed set for them." if !$svc->{Hash}->{speed_up};
+  $self->{'__saisei_error'} = "There is no download speed set for the service !--service,".$svc->{Hash}->{svcnum}.",".$rateplan."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a download speed set for them." if !$svc->{Hash}->{speed_down};
+  $self->{'__saisei_error'} = "There is no upload speed set for the service !--service,".$svc->{Hash}->{svcnum}.",".$rateplan."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a upload speed set for them." if !$svc->{Hash}->{speed_up};
 
   my $new_rateplan = $self->api_call(
       "PUT", 
@@ -612,8 +612,8 @@ Modify a existing rateplan.
 sub api_modify_existing_rateplan {
   my ($self,$svc,$rateplan_name) = @_;
 
-  $self->{'__saisei_error'} = "There is no download speed set for the service !--service,".$svc->svcnum.",".$rateplan_name."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a download speed set for them." if !$svc->{Hash}->{speed_down};
-  $self->{'__saisei_error'} = "There is no upload speed set for the service !--service,".$svc->svcnum.",".$rateplan_name."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a upload speed set for them." if !$svc->{Hash}->{speed_up};
+  $self->{'__saisei_error'} = "There is no download speed set for the service !--service,".$svc->{Hash}->{svcnum}.",".$rateplan_name."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a download speed set for them." if !$svc->{Hash}->{speed_down};
+  $self->{'__saisei_error'} = "There is no upload speed set for the service !--service,".$svc->{Hash}->{svcnum}.",".$rateplan_name."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a upload speed set for them." if !$svc->{Hash}->{speed_up};
 
   my $modified_rateplan = $self->api_call(
     "PUT",
@@ -968,6 +968,139 @@ sub export_provisioned_services {
 
 }
 
+sub test_export_report {
+  my ($self, $opts) = @_;
+  my @export_error;
+
+  ##  check all part services for export errors
+  my @exports = FS::Record::qsearch('part_export', { 'exporttype' => "saisei", } );
+  my $export_nums = join "', '", map { $_->{Hash}->{exportnum} } @exports;
+
+  my $svc_part_export_error;
+  my @svcparts = FS::Record::qsearch({
+    'table' => 'part_svc',
+    'addl_from' => 'LEFT JOIN export_svc USING ( svcpart  ) ',
+    'extra_sql' => " WHERE export_svc.exportnum in ('".$export_nums."')",
+  });
+  my $part_count = scalar @svcparts;
+
+  my $svc_part_error;
+  foreach (@svcparts) {
+    my $part_error->{'description'} = $_->svc;
+    $part_error->{'link'} = $opts->{'fsurl'}."/edit/part_svc.cgi?".$_->svcpart;
+
+    foreach my $s ('speed_up', 'speed_down') {
+      my $speed = $_->part_svc_column($s);
+      if ($speed->columnflag eq "" || $speed->columnflag eq "D") {
+        $part_error->{'errors'}->{$speed->columnname} = "Field ".$speed->columnname." is not set to be required and can be set while provisioning the service." unless $speed->required eq "Y";
+      }
+      elsif ($speed->columnflag eq "F" || $speed->columnflag eq "S") {
+        $part_error->{'errors'}->{$speed->columnname} = "Field ".$speed->columnname." is set to auto fill while provisioning the service but there is no value set." unless $speed->columnvalue;
+      }
+      elsif ($speed->columnflag eq "P") {
+        my $fcc_speed_name = "broadband_".$speed->columnvalue."stream";
+        foreach my $part_pkg ( FS::Record::qsearchs({
+                                 'table'   => 'part_pkg',
+                                 'addl_from' => 'LEFT JOIN pkg_svc USING ( pkgpart  ) ',
+                                 'extra_sql' => " WHERE pkg_svc.svcpart = ".$_->svcpart,
+                              })) {
+          my $pkglink = '<a href="'.$opts->{'fsurl'}.'/edit/part_pkg.cgi?'.$part_pkg->pkgpart.'"><FONT COLOR="red"><B>'.$part_pkg->pkg.'</B></FONT></a>';
+          $part_error->{'errors'}->{$speed->columnname} = "Field ".$speed->columnname." is set to package FCC 477 information, but package ".$pkglink." does not have FCC ".$fcc_speed_name." set."
+            unless $part_pkg->fcc_option($fcc_speed_name);
+        }
+      }
+    }
+    $part_error->{'errors'}->{'ip_addr'}    = "Field IP Address is not set to required" if $_->part_svc_column("ip_addr")->required ne "Y";
+    $svc_part_error->{$_->svcpart} = $part_error if $part_error->{'errors'};
+  }
+
+  $svc_part_export_error->{"services"}->{'description'} = "Service definitions";
+  $svc_part_export_error->{"services"}->{'count'} = $part_count;
+  $svc_part_export_error->{"services"}->{'errors'} = $svc_part_error if $svc_part_error;
+
+  push @export_error, $svc_part_export_error;
+
+  ##  check all provisioned cust services for export errors
+  my $parts = join "', '", map { $_->{Hash}->{svcpart} } @svcparts;
+  my $cust_svc_export_error;
+  my @svcs = FS::Record::qsearch({
+    'table' => 'cust_svc',
+    'addl_from' => 'LEFT JOIN svc_broadband USING ( svcnum  ) ',
+    'extra_sql' => " WHERE svcpart in ('".$parts."')",
+  }) unless !$parts;
+  my $svc_count = scalar @svcs;
+
+  my $cust_svc_error;
+  foreach (@svcs) {
+    my $svc_error->{'description'} = $_->description;
+    $svc_error->{'link'} = $opts->{'fsurl'}."/edit/svc_broadband.cgi?".$_->svcnum;
+
+    foreach my $s ('speed_up', 'speed_down', 'ip_addr') {
+        $svc_error->{'errors'}->{$s} = "Field ".$s." is not set and is required for this service to be exported to Saisei." unless $_->$s;
+    }
+
+    my $sector = FS::Record::qsearchs({
+        'table' => 'tower_sector',
+        'extra_sql' => " WHERE sectornum = ".$_->sectornum." AND sectorname != '_default'",
+    }) if $_->sectornum;
+    if (!$sector) {
+      $svc_error->{'errors'}->{'sectornum'} = "No tower sector is set for this service. There needs to be a tower and sector set to be exported to Saisei.";
+    }
+    else {
+      foreach my $s ('up_rate_limit', 'down_rate_limit') {
+        $svc_error->{'errors'}->{'sectornum'} = "The sector ".$sector->description." does not have a ".$s." set. The sector needs a ".$s." set to be exported to Saisei."
+          unless $sector->$s;
+      }
+    }
+    $cust_svc_error->{$_->svcnum} = $svc_error if $svc_error->{'errors'};
+  }
+
+  $cust_svc_export_error->{"provisioned_services"}->{'description'} = "Provisioned services";
+  $cust_svc_export_error->{"provisioned_services"}->{'count'} = $svc_count;
+  $cust_svc_export_error->{"provisioned_services"}->{'errors'} = $cust_svc_error if $cust_svc_error;
+
+  push @export_error, $cust_svc_export_error;
+
+
+  ##  check all towers and sectors for export errors
+  my $tower_sector_export_error;
+  my @towers = FS::Record::qsearch({
+    'table' => 'tower',
+  });
+  my $tower_count = scalar @towers;
+
+  my $towers_error;
+  foreach (@towers) {
+    my $tower_error->{'description'} = $_->towername;
+    $tower_error->{'link'} = $opts->{'fsurl'}."/edit/tower.html?".$_->towernum;
+
+    foreach my $s ('up_rate_limit', 'down_rate_limit') {
+        $tower_error->{'errors'}->{$s} = "Field ".$s." is not set for the tower, this is required for this tower to be exported to Saisei." unless $_->$s;
+    }
+
+    my @sectors = FS::Record::qsearch({
+        'table' => 'tower_sector',
+        'extra_sql' => " WHERE towernum = ".$_->towernum." AND sectorname != '_default' AND (up_rate_limit IS NULL OR down_rate_limit IS NULL)",
+    }) if $_->towernum;
+    foreach my $sector (@sectors) {
+      foreach my $s ('up_rate_limit', 'down_rate_limit') {
+        $tower_error->{'errors'}->{'sector_'.$s} = "The sector ".$sector->description." does not have a ".$s." set. The sector needs a ".$s." set to be exported to Saisei."
+          if !$sector->$s;
+      }
+    }
+    $towers_error->{$_->towernum} = $tower_error if $tower_error->{'errors'};
+  }
+
+  $tower_sector_export_error->{"tower_sector"}->{'description'} = "Tower / Sector";
+  $tower_sector_export_error->{"tower_sector"}->{'count'} = $tower_count;
+  $tower_sector_export_error->{"tower_sector"}->{'errors'} = $towers_error if $towers_error;
+
+  push @export_error, $tower_sector_export_error;
+
+  return [@export_error];
+
+}
+
 =head1 SEE ALSO
 
 L<FS::part_export>
diff --git a/httemplate/edit/process/elements/process.html b/httemplate/edit/process/elements/process.html
index 4356621ed..d9973c6bb 100644
--- a/httemplate/edit/process/elements/process.html
+++ b/httemplate/edit/process/elements/process.html
@@ -460,7 +460,13 @@ foreach my $value ( @values ) {
 
   if ( $error ) {
 
-    $cgi->param('error', $error);
+    if ($opt{'update_svc'}) {
+      my $encoded_error = encode_base64($error);
+      $cgi->param('error_link', $encoded_error);
+    } else {
+      $cgi->param('error', $error);
+    }
+
     if ( $opt{'clear_on_error'} && scalar(@{$opt{'clear_on_error'}}) ) {
       foreach my $field (@{$opt{'clear_on_error'}}) {
         $cgi->param($field, '')
diff --git a/httemplate/elements/menu.html b/httemplate/elements/menu.html
index 8aa19529e..ca7be2736 100644
--- a/httemplate/elements/menu.html
+++ b/httemplate/elements/menu.html
@@ -273,6 +273,25 @@ foreach my $svcdb ( FS::part_svc->svc_tables() ) {
 
 }
 
+## adding export test reports
+tie my %report_exports, 'Tie::IxHash';
+my $exports = FS::part_export::export_info();
+my $exportname;
+tie my %export_list, 'Tie::IxHash',
+  '' => '',
+  map { $_ => "$_ - ". $exports->{$_}{desc} }
+  sort { $a cmp $b }
+  keys %$exports;
+;
+
+foreach my $export (keys %export_list) {
+  $report_exports{"$export export test"} =
+    [ $fsurl. 'search/report_svc_export_test.cgi?export='.$export,
+      "Report of invalid service setup for services tied to $export export",
+    ] if "FS::part_export::$export"->can('test_export_report');
+}
+$report_services{'exports'} = [ \%report_exports, "Exports" ];
+
 tie my %report_packages, 'Tie::IxHash';
 $report_packages{'Package definitions (by # active)'} =  [ $fsurl.'browse/part_pkg.cgi?active=1', 'Package definitions by number of active packages' ]
   if    $curuser->access_right('Edit package definitions')

commit 710841aeba1632f57ab34d4e2abce3d65b531f69
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Sun Apr 28 19:14:49 2019 -0400

    RT# 83204 - added link to service or tower causing error.
    
    Conflicts:
            httemplate/misc/progress-popup.html

diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
index ba6bc622f..f479c309e 100644
--- a/FS/FS/part_export/saisei.pm
+++ b/FS/FS/part_export/saisei.pm
@@ -62,6 +62,8 @@ tie my %scripts, 'Tie::IxHash',
                                       label     => 'Export provisioned services',
                                       description => 'will export provisioned services of part service with Saisei export attached.',
                                       html_label => '<b>Export provisioned services attached to this export.</b>',
+                                      error_url  => '/edit/part_export.cgi?',
+                                      success_message => 'Saisei export of provisioned services successful',
                                     },
 ;
 
@@ -169,6 +171,7 @@ sub _export_insert {
                       tower.up_rate_limit as tower_upratelimit,
                       tower.down_rate_limit as tower_downratelimit,
                       tower_sector.sectorname,
+                      tower_sector.towernum,
                       tower_sector.up_rate_limit as sector_upratelimit,
                       tower_sector.down_rate_limit as sector_downratelimit ',
       'addl_from' => 'LEFT JOIN tower USING ( towernum )',
@@ -182,6 +185,7 @@ sub _export_insert {
 
     my $tower_opt = {
       'tower_name'           => $tower_name,
+      'tower_num'            => $tower_sector->{Hash}->{towernum},
       'tower_uprate_limit'   => $tower_sector->{Hash}->{tower_upratelimit},
       'tower_downrate_limit' => $tower_sector->{Hash}->{tower_downratelimit},
     };
@@ -194,6 +198,7 @@ sub _export_insert {
 
     my $sector_opt = {
       'tower_name'            => $tower_name,
+      'tower_num'             => $tower_sector->{Hash}->{towernum},
       'sector_name'           => $sector_name,
       'sector_uprate_limit'   => $tower_sector->{Hash}->{sector_upratelimit},
       'sector_downrate_limit' => $tower_sector->{Hash}->{sector_downratelimit},
@@ -319,6 +324,7 @@ sub export_tower_sector {
   $tower_name =~ s/\s/_/g;
   my $tower_opt = {
     'tower_name'           => $tower_name,
+    'tower_num'            => $tower->{Hash}->{towernum},
     'tower_uprate_limit'   => $tower->{Hash}->{up_rate_limit},
     'tower_downrate_limit' => $tower->{Hash}->{down_rate_limit},
     'modify_existing'      => '1', # modify an existing access point with this info
@@ -340,6 +346,7 @@ sub export_tower_sector {
     $sector_name =~ s/\s/_/g;
     my $sector_opt = {
       'tower_name'            => $tower_name,
+      'tower_num'             => $tower_sector->{Hash}->{towernum},
       'sector_name'           => $sector_name,
       'sector_uprate_limit'   => $tower_sector->{Hash}->{up_rate_limit},
       'sector_downrate_limit' => $tower_sector->{Hash}->{down_rate_limit},
@@ -425,7 +432,7 @@ sub api_call {
     return;
   }
   elsif ($client->responseCode() eq '500') {
-    $self->{'__saisei_error'} = "Could not connect to the host (".$self->{Hash}->{machine}.':'.$self->option('port').") during $method , we received the responce code: " . $client->responseCode();
+    $self->{'__saisei_error'} = "Could not connect to the Saisei export host machine (".$self->{Hash}->{machine}.':'.$self->option('port').") during $method , we received the responce code: " . $client->responseCode();
     warn "Saisei Response Content is\n".$client->responseContent."\n" if $self->option('debug');
     return;
   }
@@ -542,8 +549,8 @@ Creates a rateplan.
 sub api_create_rateplan {
   my ($self, $svc, $rateplan) = @_;
 
-  $self->{'__saisei_error'} = "There is no download speed set for the service $rateplan with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a download speed set for them." if !$svc->{Hash}->{speed_down};
-  $self->{'__saisei_error'} = "There is no upload speed set for the service $rateplan with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a upload speed set for them." if !$svc->{Hash}->{speed_up};
+  $self->{'__saisei_error'} = "There is no download speed set for the service !--service,".$svc->svcnum.",".$rateplan."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a download speed set for them." if !$svc->{Hash}->{speed_down};
+  $self->{'__saisei_error'} = "There is no upload speed set for the service !--service,".$svc->svcnum.",".$rateplan."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a upload speed set for them." if !$svc->{Hash}->{speed_up};
 
   my $new_rateplan = $self->api_call(
       "PUT", 
@@ -605,6 +612,9 @@ Modify a existing rateplan.
 sub api_modify_existing_rateplan {
   my ($self,$svc,$rateplan_name) = @_;
 
+  $self->{'__saisei_error'} = "There is no download speed set for the service !--service,".$svc->svcnum.",".$rateplan_name."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a download speed set for them." if !$svc->{Hash}->{speed_down};
+  $self->{'__saisei_error'} = "There is no upload speed set for the service !--service,".$svc->svcnum.",".$rateplan_name."--! with host (".$svc->{Hash}->{ip_addr}."). All services that are to be exported to Saisei need to have a upload speed set for them." if !$svc->{Hash}->{speed_up};
+
   my $modified_rateplan = $self->api_call(
     "PUT",
     "/rate_plans/$rateplan_name",
@@ -783,7 +793,7 @@ sub process_tower {
   my ($self, $opt) = @_;
 
   if (!$opt->{tower_uprate_limit} || !$opt->{tower_downrate_limit}) {
-    $self->{'__saisei_error'} = "Could not export tower ".$opt->{tower_name}." because there was no up or down rates attached to the tower.  Saisei requires a up and down rate be attached to each tower.";
+    $self->{'__saisei_error'} = "Could not export tower !--tower,".$opt->{tower_num}.",".$opt->{tower_name}."--! because there was no up or down rates attached to the tower.  Saisei requires a up and down rate be attached to each tower.";
     return { error => $self->api_error, };
   }
 
@@ -823,7 +833,7 @@ sub process_sector {
   }
 
   if (!$opt->{sector_uprate_limit} || !$opt->{sector_downrate_limit}) {
-    $self->{'__saisei_error'} = "Could not export sector ".$opt->{tower_name}." because there was no up or down rates attached to the sector.  Saisei requires a up and down rate be attached to each sector.";
+    $self->{'__saisei_error'} = "Could not export sector !--tower,".$opt->{tower_num}.",".$opt->{sector_name}."--! because there was no up or down rates attached to the sector.  Saisei requires a up and down rate be attached to each sector.";
     return { error => $self->api_error, };
   }
 
diff --git a/httemplate/edit/part_export.cgi b/httemplate/edit/part_export.cgi
index f6ec208be..f8a46c7fd 100644
--- a/httemplate/edit/part_export.cgi
+++ b/httemplate/edit/part_export.cgi
@@ -63,6 +63,8 @@ if ( $cgi->param('error') ) {
   $part_export = new FS::part_export ( {
     map { $_, scalar($cgi->param($_)) } fields('part_export')
   } );
+} elsif ( $cgi->param('exportnum') ) {
+  $part_export = qsearchs('part_export', { 'exportnum' => $cgi->param('exportnum') } );
 } elsif ( $query =~ /^(\d+)$/ ) {
   $part_export = qsearchs('part_export', { 'exportnum' => $1 } );
 } else {
@@ -296,7 +298,12 @@ my $widget = new HTML::Widgets::SelectLayers(
               $part_export->exporttype,
               [ $script.'_exportnum', $script.'_script' ],
               rooturl().'view/svc_export/run_script.cgi',
-              rooturl().'edit/part_export.cgi?'.$part_export->{Hash}->{exportnum},
+              {
+                'error_url' => rooturl().$exports->{$layer}{scripts}{$script}->{error_url}."exportnum=".$part_export->{Hash}->{exportnum},
+                'reload_with_error' => '1',
+                'url'       => rooturl().'edit/part_export.cgi?'.$part_export->{Hash}->{exportnum},
+                'message'   => $exports->{$layer}{scripts}{$script}->{success_message},
+              },
               $script,
         ) .
         '<INPUT TYPE="hidden" NAME="'.$script.'_exportnum" VALUE="'.$part_export->{Hash}->{exportnum}.'">
diff --git a/httemplate/edit/process/elements/process.html b/httemplate/edit/process/elements/process.html
index e954d0b47..4356621ed 100644
--- a/httemplate/edit/process/elements/process.html
+++ b/httemplate/edit/process/elements/process.html
@@ -486,7 +486,11 @@ if ($class eq "FS::tower" && !$error) {
       $error = $export_tower->{'error'} if $export_tower;
     }
   }
-  $cgi->param('error', $error) if $error;
+  if ($error) {
+    my $encoded_error = encode_base64($error);
+    $cgi->param('error_link', $encoded_error) if $error;
+
+  }
 }
 
 # set up redirect URLs
diff --git a/httemplate/elements/error.html b/httemplate/elements/error.html
index f9664bd65..5083799fa 100644
--- a/httemplate/elements/error.html
+++ b/httemplate/elements/error.html
@@ -1,5 +1,28 @@
 % if ( $cgi->param('error') ) { 
 %   $m->notes('error', $cgi->param('error'));
   <FONT SIZE="+1" COLOR="#ff0000"><% mt("Error: [_1]", $cgi->param('error')) |h %></FONT>
-  <BR><BR>
-% } 
+  <BR>
+% }
+
+% if ( $cgi->param('error_link') ) {
+%   $m->notes('error', $error_link);
+  <FONT SIZE="+1" COLOR="#ff0000"><% $error_link %></FONT>
+  <BR>
+% }
+<BR>
+
+<%init>
+
+my %type_error_links = (
+  'service' => rooturl()."/view/svc_broadband.cgi?",
+  'tower'   => rooturl()."/edit/tower.html?",
+);
+
+my $error_link;
+
+if ( $cgi->param('error_link') ) {
+  $error_link = encode_entities(decode_base64($cgi->param('error_link')));
+  $error_link =~ s/!--(.*)\,(.*)\,(.*)--!/<a href=$type_error_links{$1}$2><font color=red><b>$3<\/b><\/font><\/a>/g;
+}
+
+</%init>
\ No newline at end of file
diff --git a/httemplate/elements/progress-init.html b/httemplate/elements/progress-init.html
index 0c2b8165a..24ad55939 100644
--- a/httemplate/elements/progress-init.html
+++ b/httemplate/elements/progress-init.html
@@ -155,7 +155,7 @@ my %dest_info;
 if ( ref($url_or_message) ) { #its a message or something
   %dest_info = map { $_ => $url_or_message->{$_} }
                grep { $url_or_message->{$_} }
-               qw( message url popup_url error_url );
+               qw( message url popup_url error_url reload_with_error );
 } else {
   # it can also just be a url
   %dest_info = ( 'url' => $url_or_message );
diff --git a/httemplate/misc/progress-popup.html b/httemplate/misc/progress-popup.html
index 8e2d6760b..f75a9c792 100644
--- a/httemplate/misc/progress-popup.html
+++ b/httemplate/misc/progress-popup.html
@@ -5,6 +5,7 @@
 %  my $popup_url = $cgi->param('popup_url');
 %  my $formname = scalar($cgi->param('formname'));
 %  my $error_url = $cgi->param('error_url');
+%  my $reload_with_error = $cgi->param('reload_with_error');
 %
 
 <HTML>
@@ -86,7 +87,13 @@ function updateStatus( status_statustext ) {
 % # default behavior: just close the popup
 % my $onClick = 'parent.nd(1);';
 % if ( $error_url ) { # then on clicking to confirm, redirect somewhere
-%   $onClick = "window.top.location.href = \\'$error_url\\';";
+%   if ( $reload_with_error ) {
+       var encodedString = btoa(statustext);
+       parent.nd(1);
+       window.top.location.href = '<% $error_url."&error_link="  %>'+encodedString;
+%   }
+%
+%     $onClick = "window.top.location.href = \\'$error_url\\';";
 % }
 
     document.getElementById("progress_message").innerHTML = '<FONT SIZE="+1" COLOR="#FF0000">Error: ' + statustext + '</FONT>';
@@ -131,5 +138,4 @@ function updateStatus( status_statustext ) {
     </TABLE>
 
   </BODY>
-</HTML>
-
+</HTML>
\ No newline at end of file

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

Summary of changes:
 FS/FS/part_export/saisei.pm                   | 153 +++++++++++++++++++++++++-
 httemplate/edit/part_export.cgi               |   9 +-
 httemplate/edit/process/elements/process.html |  14 ++-
 httemplate/elements/error.html                |  27 ++++-
 httemplate/elements/menu.html                 |  19 ++++
 httemplate/elements/progress-init.html        |   2 +-
 httemplate/misc/progress-popup.html           |  12 +-
 httemplate/search/report_svc_export_test.cgi  |  44 ++++++++
 8 files changed, 266 insertions(+), 14 deletions(-)
 create mode 100644 httemplate/search/report_svc_export_test.cgi




More information about the freeside-commits mailing list