[freeside-commits] branch FREESIDE_4_BRANCH updated. 9276fddb0f6054c53daa94ae2186e7121733ba30

Christopher Burger burgerc at freeside.biz
Tue Apr 30 12:05:25 PDT 2019


The branch, FREESIDE_4_BRANCH has been updated
       via  9276fddb0f6054c53daa94ae2186e7121733ba30 (commit)
       via  83ac586a5c6fb9f0c7df725df87257552f56331e (commit)
       via  1c3b548f575b3313d9a93b391751f6ce719b0b6d (commit)
       via  27ef6158f7cca5785626e1a71b3be794e277c045 (commit)
       via  28e514ef8bd4df905d75c843f4e0b7cae98f6535 (commit)
      from  5e824e1b4862fe424ebbf0644ead3b3ba41aeb5e (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 9276fddb0f6054c53daa94ae2186e7121733ba30
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 83ac586a5c6fb9f0c7df725df87257552f56331e
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 8661651df..92b18e431 100644
--- a/FS/FS/part_export/saisei.pm
+++ b/FS/FS/part_export/saisei.pm
@@ -561,8 +561,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", 
@@ -624,8 +624,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",
@@ -980,6 +980,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 e332957eb..1b9318725 100644
--- a/httemplate/edit/process/elements/process.html
+++ b/httemplate/edit/process/elements/process.html
@@ -473,7 +473,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 a94e578ce..88c8e4c41 100644
--- a/httemplate/elements/menu.html
+++ b/httemplate/elements/menu.html
@@ -274,6 +274,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 1c3b548f575b3313d9a93b391751f6ce719b0b6d
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.

diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
index 9646879a8..8661651df 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},
@@ -331,6 +336,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
@@ -352,6 +358,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},
@@ -437,7 +444,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;
   }
@@ -554,8 +561,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", 
@@ -617,6 +624,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",
@@ -795,7 +805,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, };
   }
 
@@ -835,7 +845,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 f70875bec..e332957eb 100644
--- a/httemplate/edit/process/elements/process.html
+++ b/httemplate/edit/process/elements/process.html
@@ -499,7 +499,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 789825cc5..2a62c5e99 100644
--- a/httemplate/elements/progress-init.html
+++ b/httemplate/elements/progress-init.html
@@ -154,7 +154,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 9964bcc02..a0aa6f5d9 100644
--- a/httemplate/misc/progress-popup.html
+++ b/httemplate/misc/progress-popup.html
@@ -73,7 +73,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>';
@@ -126,5 +132,6 @@ my $message = $cgi->param('message');
 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');
 
 </%init>

commit 27ef6158f7cca5785626e1a71b3be794e277c045
Merge: 28e514ef8 5e824e1b4
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Tue Apr 30 14:03:07 2019 -0400

    Merge branch 'FREESIDE_4_BRANCH' of ssh://git.freeside.biz/home/git/freeside into FREESIDE_4_BRANCH


commit 28e514ef8bd4df905d75c843f4e0b7cae98f6535
Author: Christopher Burger <burgerc at freeside.biz>
Date:   Wed Apr 24 10:26:01 2019 -0400

    RT# 83203 - made Tower/Sector, speed_up, speed_down required

diff --git a/FS/FS/part_export/saisei.pm b/FS/FS/part_export/saisei.pm
index 61aa12d2b..9646879a8 100644
--- a/FS/FS/part_export/saisei.pm
+++ b/FS/FS/part_export/saisei.pm
@@ -880,6 +880,11 @@ sub require_tower_and_sector {
   1;
 }
 
+sub required_fields {
+  my @fields = ('svc_broadband__ip_addr_required', 'svc_broadband__speed_up_required', 'svc_broadband__speed_down_required', 'svc_broadband__sectornum_required');
+  return @fields;
+}
+
 sub process_virtual_ap {
   my ($self, $opt) = @_;
 
diff --git a/FS/FS/part_svc.pm b/FS/FS/part_svc.pm
index a565ee45b..d68a46181 100644
--- a/FS/FS/part_svc.pm
+++ b/FS/FS/part_svc.pm
@@ -903,6 +903,18 @@ sub process {
       $exportnums{$exportnum} = $role;
     }
   }
+
+  ## make sure export required fields are marked required.
+  my @required_fields;
+  foreach (keys %exportnums) {
+    my $export = qsearchs('part_export', { 'exportnum' => $_ })
+      if $exportnums{$_};
+    if ($export) {
+      push @required_fields, $export->required_fields if $export->can('required_fields');
+    }
+  }
+  foreach (@required_fields) { $new->set($_, 'Y'); }
+
   my $error;
   if ( $param->{'svcpart'} ) {
     $error = $new->replace( $old,

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

Summary of changes:
 FS/FS/part_export/saisei.pm                   | 158 +++++++++++++++++++++++++-
 FS/FS/part_svc.pm                             |  12 ++
 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           |   9 +-
 httemplate/search/report_svc_export_test.cgi  |  44 +++++++
 9 files changed, 282 insertions(+), 12 deletions(-)
 create mode 100644 httemplate/search/report_svc_export_test.cgi




More information about the freeside-commits mailing list