summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/part_svc.pm8
-rw-r--r--FS/FS/part_svc_column.pm10
-rw-r--r--FS/FS/svc_Common.pm41
3 files changed, 43 insertions, 16 deletions
diff --git a/FS/FS/part_svc.pm b/FS/FS/part_svc.pm
index 6ca48894a..da794dd4c 100644
--- a/FS/FS/part_svc.pm
+++ b/FS/FS/part_svc.pm
@@ -757,11 +757,9 @@ sub process {
if ( $flag =~ /^[MAH]$/ ) {
$param->{ $f } = delete( $param->{ $f.'_classnum' } );
}
- if ( $flag =~ /^S$/
- or $_ eq 'usergroup' ) {
- $param->{ $f } = ref($param->{ $f })
- ? join(',', @{$param->{ $f }} )
- : $param->{ $f };
+ if ( ( $flag =~ /^[MAHS]$/ or $_ eq 'usergroup' )
+ and ref($param->{ $f }) ) {
+ $param->{ $f } = join(',', @{ $param->{ $f } });
}
( $f, $f.'_flag', $f.'_label' );
}
diff --git a/FS/FS/part_svc_column.pm b/FS/FS/part_svc_column.pm
index d467516ed..38ce1fa80 100644
--- a/FS/FS/part_svc_column.pm
+++ b/FS/FS/part_svc_column.pm
@@ -99,8 +99,14 @@ sub check {
$self->columnflag(uc($1));
if ( $self->columnflag =~ /^[MA]$/ ) {
- $error =
- $self->ut_foreign_key( 'columnvalue', 'inventory_class', 'classnum' );
+ # split, check all values independently, and normalize
+ my @classnums = split(/\s*,\s*/, $self->columnvalue);
+ foreach (@classnums) {
+ $self->set('columnvalue', $_);
+ $error = $self->ut_foreign_key( 'columnvalue', 'inventory_class', 'classnum' );
+ return $error if $error;
+ }
+ $self->set('columnvalue', join(',', @classnums));
}
if ( $self->columnflag eq 'H' ) {
$error =
diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm
index ff465bf17..0aea4559b 100644
--- a/FS/FS/svc_Common.pm
+++ b/FS/FS/svc_Common.pm
@@ -842,13 +842,20 @@ sub set_auto_inventory {
next if $columnflag eq 'A' && $self->$field() ne '';
my $classnum = $part_svc_column->columnvalue;
- my %hash = ( 'classnum' => $classnum );
+ my %hash;
if ( $columnflag eq 'A' && $self->$field() eq '' ) {
$hash{'svcnum'} = '';
} elsif ( $columnflag eq 'M' ) {
return "Select inventory item for $field" unless $self->getfield($field);
$hash{'item'} = $self->getfield($field);
+ my $chosen_classnum = $self->getfield($field.'_classnum');
+ if ( grep {$_ == $chosen_classnum} split(',', $classnum) ) {
+ $classnum = $chosen_classnum;
+ }
+ # otherwise the chosen classnum is either (all), or somehow not on
+ # the list, so ignore it and choose the first item that's in any
+ # class on the list
}
my $agentnums_sql = $FS::CurrentUser::CurrentUser->agentnums_sql(
@@ -859,18 +866,30 @@ sub set_auto_inventory {
my $inventory_item = qsearchs({
'table' => 'inventory_item',
'hashref' => \%hash,
- 'extra_sql' => "AND $agentnums_sql",
+ 'extra_sql' => "AND classnum IN ($classnum) AND $agentnums_sql",
'order_by' => 'ORDER BY ( agentnum IS NULL ) '. #agent inventory first
' LIMIT 1 FOR UPDATE',
});
unless ( $inventory_item ) {
+ # should really only be shown if columnflag eq 'A'...
$dbh->rollback if $oldAutoCommit;
- my $inventory_class =
- qsearchs('inventory_class', { 'classnum' => $classnum } );
- return "Can't find inventory_class.classnum $classnum"
- unless $inventory_class;
- return "Out of ". PL_N($inventory_class->classname);
+ my $message = 'Out of ';
+ my @classnums = split(',', $classnum);
+ foreach ( @classnums ) {
+ my $class = FS::inventory_class->by_key($_)
+ or return "Can't find inventory_class.classnum $_";
+ $message .= PL_N($class->classname);
+ if ( scalar(@classnums) > 2 ) { # english is hard
+ if ( $_ != $classnums[-1] ) {
+ $message .= ', ';
+ }
+ }
+ if ( scalar(@classnums) > 1 and $_ == $classnums[-2] ) {
+ $message .= 'and ';
+ }
+ }
+ return $message;
}
next if $columnflag eq 'M' && $inventory_item->svcnum == $self->svcnum;
@@ -878,13 +897,14 @@ sub set_auto_inventory {
$self->setfield( $field, $inventory_item->item );
#if $columnflag eq 'A' && $self->$field() eq '';
+ # release the old inventory item, if there was one
if ( $old && $old->$field() && $old->$field() ne $self->$field() ) {
my $old_inv = qsearchs({
'table' => 'inventory_item',
- 'hashref' => { 'classnum' => $classnum,
+ 'hashref' => {
'svcnum' => $old->svcnum,
},
- 'extra_sql' => ' AND '.
+ 'extra_sql' => "AND classnum IN ($classnum) AND ".
'( ( svc_field IS NOT NULL AND svc_field = '.$dbh->quote($field).' )'.
' OR ( svc_field IS NULL AND item = '. dbh->quote($old->$field).' )'.
')',
@@ -920,6 +940,9 @@ sub set_auto_inventory {
=item return_inventory
+Release all inventory items attached to this service's fields. Call
+when unprovisioning the service.
+
=cut
sub return_inventory {