make svc_broadband upgrade errors non-fatal
[freeside.git] / FS / FS / svc_broadband.pm
index ac463bc..ddeab04 100755 (executable)
@@ -101,15 +101,15 @@ sub table_info {
       'description' => 'Descriptive label for this particular device',
       'speed_down'  => 'Maximum download speed for this service in Kbps.  0 denotes unlimited.',
       'speed_up'    => 'Maximum upload speed for this service in Kbps.  0 denotes unlimited.',
-      #'ip_addr'     => 'IP address.  Leave blank for automatic assignment.',
-      #'blocknum'    => 
-      #{ 'label' => 'Address block',
-      #                   'type'  => 'select',
-      #                   'select_table' => 'addr_block',
-      #                    'select_key'   => 'blocknum',
-      #                   'select_label' => 'cidr',
-      #                   'disable_inventory' => 1,
-      #                 },
+      'ip_addr'     => 'IP address.  Leave blank for automatic assignment.',
+      'blocknum'    => 
+      { 'label' => 'Address block',
+                         'type'  => 'select',
+                         'select_table' => 'addr_block',
+                          'select_key'   => 'blocknum',
+                         'select_label' => 'cidr',
+                         'disable_inventory' => 1,
+                       },
      'plan_id' => 'Service Plan Id',
      'performance_profile' => 'Peformance Profile',
      'authkey'      => 'Authentication key',
@@ -395,18 +395,21 @@ sub check {
                  ? qsearchs('cust_svc', { 'svcnum' => $self->svcnum } )
                  : '';
   my $cust_pkg;
+  my $svcpart;
   if ($cust_svc) {
     $cust_pkg = $cust_svc->cust_pkg;
+    $svcpart = $cust_svc->svcpart;
   }else{
     $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $self->pkgnum } );
     return "Invalid pkgnum" unless $cust_pkg;
+    $svcpart = $self->svcpart;
   }
   my $agentnum = $cust_pkg->cust_main->agentnum if $cust_pkg;
 
   if ($self->routernum) {
     return "Router ".$self->routernum." does not provide this service"
       unless qsearchs('part_svc_router', { 
-        svcpart => $self->cust_svc->svcpart,
+        svcpart => $svcpart,
         routernum => $self->routernum
     });
   
@@ -415,8 +418,11 @@ sub check {
       if $router->agentnum and $router->agentnum != $agentnum;
 
     if ( $router->auto_addr ) {
-      my $error = $self->assign_ip_addr;
-      return $error if $error;
+      my $addr_block = $self->addr_block;
+      unless ( $addr_block and $addr_block->manual_flag ) {
+        my $error = $self->assign_ip_addr;
+        return $error if $error;
+      }
     }
     else {
       $self->blocknum('');
@@ -543,8 +549,6 @@ sub router {
   qsearchs('router', { routernum => $self->routernum });
 }
 
-=back
-
 =item allowed_routers
 
 Returns a list of allowed FS::router objects.
@@ -553,24 +557,56 @@ Returns a list of allowed FS::router objects.
 
 sub allowed_routers {
   my $self = shift;
+  my $svcpart = $self->svcnum ? $self->cust_svc->svcpart : $self->svcpart;
   map { $_->router } qsearch('part_svc_router', 
     { svcpart => $self->cust_svc->svcpart });
 }
 
+=back
+
+
+=item mac_addr_formatted CASE DELIMITER
+
+Format the MAC address (for use by exports).  If CASE starts with "l"
+(for "lowercase"), it's returned in lowercase.  DELIMITER is inserted
+between octets.
+
+=cut
+
+sub mac_addr_formatted {
+  my $self = shift;
+  my ($case, $delim) = @_;
+  my $addr = $self->mac_addr;
+  $addr = lc($addr) if $case =~ /^l/i;
+  join( $delim || '', $addr =~ /../g );
+}
 
 #class method
 sub _upgrade_data {
   my $class = shift;
 
+  local($FS::svc_Common::noexport_hack) = 1;
+
   # set routernum to addr_block.routernum
   foreach my $self (qsearch('svc_broadband', {
       blocknum => {op => '!=', value => ''},
       routernum => ''
     })) {
     my $addr_block = $self->addr_block;
-    if ( my $routernum = $addr_block->routernum ) {
+    my $ip_addr = $self->ip_addr;
+    my $routernum = $addr_block->routernum;
+    if ( $routernum ) {
       $self->set(routernum => $routernum);
-      my $error = $self->replace;
+      my $error = $self->check;
+      # sanity check: don't allow this to change IP address or block
+      # (other than setting blocknum to null for a non-auto-assigned router)
+      if ( $self->ip_addr ne $ip_addr 
+        or ($self->blocknum and $self->blocknum != $addr_block->blocknum)) {
+        warn "WARNING: Upgrading service ".$self->svcnum." would change its block/address; skipped.\n";
+        next;
+      }
+
+      $error ||= $self->replace;
       die "error assigning routernum $routernum to service ".$self->svcnum.
           ":\n$error\n"
         if $error;
@@ -583,6 +619,8 @@ sub _upgrade_data {
   '';
 }
 
+=back
+
 =head1 BUGS
 
 The business with sb_field has been 'fixed', in a manner of speaking.