fix service definition modifiers (inventory, hardware) w/svc_broadband, RT#17659
authorIvan Kohler <ivan@freeside.biz>
Wed, 9 May 2012 03:34:47 +0000 (20:34 -0700)
committerIvan Kohler <ivan@freeside.biz>
Wed, 9 May 2012 03:34:47 +0000 (20:34 -0700)
FS/FS/Schema.pm
FS/FS/inventory_item.pm
FS/FS/svc_Common.pm
httemplate/edit/elements/edit.html
httemplate/edit/elements/svc_Common.html
httemplate/edit/process/elements/process.html
httemplate/edit/svc_broadband.cgi
httemplate/elements/select-table.html

index 84ab528..8b9d10a 100644 (file)
@@ -3171,11 +3171,12 @@ sub tables_hashref {
 
     'inventory_item' => {
       'columns' => [
-        'itemnum',  'serial',      '',      '', '', '',
-        'classnum', 'int',         '',      '', '', '',
-        'agentnum', 'int',     'NULL',      '', '', '',
-        'item',     'varchar',     '', $char_d, '', '',
-        'svcnum',   'int',     'NULL',      '', '', '',
+        'itemnum',   'serial',      '',      '', '', '',
+        'classnum',  'int',         '',      '', '', '',
+        'agentnum',  'int',     'NULL',      '', '', '',
+        'item',      'varchar',     '', $char_d, '', '',
+        'svcnum',    'int',     'NULL',      '', '', '',
+        'svc_field', 'varchar', 'NULL', $char_d, '', '',
       ],
       'primary_key' => 'itemnum',
       'unique' => [ [ 'classnum', 'item' ] ],
index 39a0dff..477c934 100644 (file)
@@ -111,6 +111,7 @@ sub check {
                                            'Edit global inventory'] )
     || $self->ut_text('item')
     || $self->ut_foreign_keyn('svcnum', 'cust_svc', 'svcnum' )
+    || $self->ut_alphan('svc_field')
   ;
   return $error if $error;
 
index ff00ce0..19f5819 100644 (file)
@@ -5,6 +5,7 @@ use vars qw( @ISA $noexport_hack $DEBUG $me
              $overlimit_missing_cust_svc_nonfatal_kludge );
 use Carp qw( cluck carp croak confess ); #specify cluck have to specify them all
 use Scalar::Util qw( blessed );
+use Lingua::EN::Inflect qw( PL_N );
 use FS::Conf;
 use FS::Record qw( qsearch qsearchs fields dbh );
 use FS::cust_main_Mixin;
@@ -844,8 +845,7 @@ sub set_auto_inventory {
         qsearchs('inventory_class', { 'classnum' => $classnum } );
       return "Can't find inventory_class.classnum $classnum"
         unless $inventory_class;
-      return "Out of ". $inventory_class->classname. "s\n"; #Lingua:: BS
-                                                            #for pluralizing
+      return "Out of ". PL_N($inventory_class->classname);
     }
 
     next if $columnflag eq 'M' && $inventory_item->svcnum == $self->svcnum;
@@ -853,31 +853,38 @@ sub set_auto_inventory {
     $self->setfield( $field, $inventory_item->item );
       #if $columnflag eq 'A' && $self->$field() eq '';
 
-    $inventory_item->svcnum( $self->svcnum );
-    my $ierror = $inventory_item->replace();
-    if ( $ierror ) {
-      $dbh->rollback if $oldAutoCommit;
-      return "Error provisioning inventory: $ierror";
-    }
-
     if ( $old && $old->$field() && $old->$field() ne $self->$field() ) {
       my $old_inv = qsearchs({
-        'table'   => 'inventory_item',
-        'hashref' => { 'classnum' => $classnum,
-                       'svcnum'   => $old->svcnum,
-                       'item'     => $old->$field(),
-                     },
+        'table'     => 'inventory_item',
+        'hashref'   => { 'classnum' => $classnum,
+                         'svcnum'   => $old->svcnum,
+                       },
+        'extra_sql' => ' AND '.
+          '( ( svc_field IS NOT NULL AND svc_field = '.$dbh->quote($field).' )'.
+          '  OR ( svc_field IS NULL AND item = '. dbh->quote($old->$field).' )'.
+          ')',
       });
       if ( $old_inv ) {
         $old_inv->svcnum('');
+        $old_inv->svc_field('');
         my $oerror = $old_inv->replace;
         if ( $oerror ) {
           $dbh->rollback if $oldAutoCommit;
           return "Error unprovisioning inventory: $oerror";
         }
+      } else {
+        warn "old inventory_item not found for $field ". $self->$field;
       }
     }
 
+    $inventory_item->svcnum( $self->svcnum );
+    $inventory_item->svc_field( $field );
+    my $ierror = $inventory_item->replace();
+    if ( $ierror ) {
+      $dbh->rollback if $oldAutoCommit;
+      return "Error provisioning inventory: $ierror";
+    }
+
   }
 
  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
@@ -906,6 +913,7 @@ sub return_inventory {
 
   foreach my $inventory_item ( $self->inventory_item ) {
     $inventory_item->svcnum('');
+    $inventory_item->svc_field('');
     my $error = $inventory_item->replace();
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;
index 73faad4..bf4e51f 100644 (file)
@@ -317,7 +317,7 @@ Example:
 %   $include_common{$_} = $f->{$_} foreach grep exists($f->{$_}),
 %     qw( js_only html_only select_only layers_only cell_style ),#selectlayers,?
 %     qw( empty_label ),                                   # select-*
-%     qw( value_col ),                                     # select-table
+%     qw( value_col compare_sub ),                         # select-table
 %     qw( table name_col ),                           #(select,checkboxes)-table
 %     qw( target_table link_table ),                       #checkboxes-table
 %     qw( hashref agent_virt agent_null agent_null_right ),#*-table
index 38716f0..0d9d36c 100644 (file)
                      $f->{'extra_sql'}  .= ' OR svcnum = '. $object->svcnum
                        if $object->svcnum;
                      $f->{'extra_sql'}  .= ' ) ';
-                     $f->{'disable_empty'} = $object->svcnum ? 1 : 0,
+                     $f->{'disable_empty'} = $object->svcnum ? 1 : 0;
+                     if ( $f->{'field'} eq 'mac_addr' ) {
+                       $f->{'compare_sub'} = sub {
+                         my($a, $b) = @_;
+                         $a =~ s/[-: ]//g;
+                         $b =~ s/[-: ]//g;
+                         lc($a) eq lc($b);
+                       };
+                     }
                    } elsif ( $flag eq 'H' ) {
                      $f->{'type'}        = 'select-hardware_type';
                      $f->{'hashref'}     = {
                      $object->set('custnum', $cust_pkg->custnum);
                    }
 
+                   if ( my $cb = $opt{'svc_field_callback'} ) {
+                     &{ $cb }( $cgi, $object, $f);
+                   }
+
                  },
 
                  'html_init' => sub {
index 12b3bd9..2d39e9d 100644 (file)
@@ -250,8 +250,6 @@ foreach my $value ( @values ) {
 
     }
 
-    $error ||= $new->check;
-
     my @args = ();
     if ( !$error && $opt{'args_callback'} ) {
       @args = &{ $opt{'args_callback'} }( $cgi, $new );
index b266928..0d4b989 100644 (file)
@@ -3,7 +3,7 @@
      'name'                 => 'broadband service',
      'table'                => 'svc_broadband',
      'fields'               => \@fields, 
-     'field_callback'       => $field_callback,
+     'svc_field_callback'   => $svc_field_callback,
      'svc_new_callback'     => $svc_edit_callback,
      'svc_edit_callback'    => $svc_edit_callback,
      'svc_error_callback'   => $svc_edit_callback,
@@ -161,20 +161,14 @@ my $svc_edit_callback = sub {
   }
 };
 
-my $field_callback = sub {
+my $svc_field_callback = sub {
   my ($cgi, $object, $fieldref) = @_;
 
   my $columndef = $part_svc->part_svc_column($fieldref->{'field'});
-  if ($columndef->columnflag eq 'F') {
-    $fieldref->{'type'} = length($columndef->columnvalue)
-                            ? 'fixed'
-                            : 'hidden';
-    $fieldref->{'value'} = $columndef->columnvalue;
+  if ($fieldref->{field} eq 'usergroup' && $columndef->columnflag eq 'F') {
     
-    if ( $fieldref->{field} eq 'usergroup' ) {
-      $fieldref->{'formatted_value'} = 
-        [ $object->radius_groups('long_description') ];
-    }
+    $fieldref->{'formatted_value'} = 
+      [ $object->radius_groups('long_description') ];
   }
 
 }; 
index c0dde74..127028e 100644 (file)
@@ -93,10 +93,17 @@ Example:
 %                    )
 % {
 %   my $recvalue = $record->$key();
+%   my $selected;
+%   if ( $opt{'all_selected'} ) {
+%     $selected = 1;
+%   } elsif ( $opt{'compare_sub'} && !ref($value) ) {
+%     $selected = &{ $opt{'compare_sub'} }( $value, $recvalue );
+%   } else {
+%     $selected =    ( ref($value) && $value->{$recvalue} )
+%                 || ( $value && $value eq $recvalue ); #not == because of value_col
+%   }
     <OPTION VALUE="<% $recvalue %>"
-            <% $opt{'all_selected'} || ref($value) && $value->{$recvalue} || $value && $value eq $recvalue # not == because of value_col
-               ? ' SELECTED' : ''
-            %>
+            <% $selected ? ' SELECTED' : '' %>
 %           foreach my $att ( @{ $opt{'extra_option_attributes'} } ) {
               data-<% $att %>="<% $record->$att() |h %>"
 %           }