X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fsvc_Common.pm;h=0aea4559bb99193ec6e025b3ad5598f8d483ffc9;hb=54a357b171aa44f9399b4c146acd2afd3b686075;hp=f7f0b4094bd38950e80da07ec720595831a32971;hpb=fed12e8214a8a951377961ccbe7a09171b1e38c2;p=freeside.git diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm index f7f0b4094..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 { @@ -1315,8 +1338,7 @@ Parameters: =cut -# based on FS::svc_acct::search, both that and svc_broadband::search should -# eventually use this instead +# svc_broadband::search should eventually use this instead sub search { my ($class, $params) = @_; @@ -1329,6 +1351,8 @@ sub search { my @where = (); + $class->_search_svc($params, \@from, \@where) if $class->can('_search_svc'); + # # domain # if ( $params->{'domain'} ) { # my $svc_domain = qsearchs('svc_domain', { 'domain'=>$params->{'domain'} } ); @@ -1377,15 +1401,40 @@ sub search { } #pkgpart - if ( $params->{'pkgpart'} && scalar(@{ $params->{'pkgpart'} }) ) { - my @pkgpart = grep /^(\d+)$/, @{ $params->{'pkgpart'} }; - push @where, 'cust_pkg.pkgpart IN ('. join(',', @pkgpart ). ')'; + ##pkgpart, now properly untainted, can be arrayref + #for my $pkgpart ( $params->{'pkgpart'} ) { + # if ( ref $pkgpart ) { + # my $where = join(',', map { /^(\d+)$/ ? $1 : () } @$pkgpart ); + # push @where, "cust_pkg.pkgpart IN ($where)" if $where; + # } + # elsif ( $pkgpart =~ /^(\d+)$/ ) { + # push @where, "cust_pkg.pkgpart = $1"; + # } + #} + if ( $params->{'pkgpart'} ) { + my @pkgpart = ref( $params->{'pkgpart'} ) + ? @{ $params->{'pkgpart'} } + : $params->{'pkgpart'} + ? ( $params->{'pkgpart'} ) + : (); + @pkgpart = grep /^(\d+)$/, @pkgpart; + push @where, 'cust_pkg.pkgpart IN ('. join(',', @pkgpart ). ')' if @pkgpart; + } + + #svcnum + if ( $params->{'svcnum'} =~ /^(\d+)$/ ) { + push @where, "svcnum = $1"; } # svcpart - if ( $params->{'svcpart'} && scalar(@{ $params->{'svcpart'} }) ) { - my @svcpart = grep /^(\d+)$/, @{ $params->{'svcpart'} }; - push @where, 'svcpart IN ('. join(',', @svcpart ). ')'; + if ( $params->{'svcpart'} ) { + my @svcpart = ref( $params->{'svcpart'} ) + ? @{ $params->{'svcpart'} } + : $params->{'svcpart'} + ? ( $params->{'svcpart'} ) + : (); + @svcpart = grep /^(\d+)$/, @svcpart; + push @where, 'svcpart IN ('. join(',', @svcpart ). ')' if @svcpart; } if ( $params->{'exportnum'} =~ /^(\d+)$/ ) {