X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_svc.pm;h=01f3034948b4b7f9411c4faa8ad7610e896d82e9;hb=e9e0cf0989259b94d9758eceff448666a2e5a5cc;hp=1306d41990290ef128c506c881ba835b630b2779;hpb=c405e80203f323a83b447d6fc899dbba32d52f2a;p=freeside.git diff --git a/FS/FS/part_svc.pm b/FS/FS/part_svc.pm index 1306d4199..01f303494 100644 --- a/FS/FS/part_svc.pm +++ b/FS/FS/part_svc.pm @@ -1,7 +1,8 @@ package FS::part_svc; +use base qw(FS::Record); use strict; -use vars qw( @ISA $DEBUG ); +use vars qw( $DEBUG ); use Tie::IxHash; use FS::Record qw( qsearch qsearchs fields dbh ); use FS::Schema qw( dbdef ); @@ -9,8 +10,7 @@ use FS::part_svc_column; use FS::part_export; use FS::export_svc; use FS::cust_svc; - -@ISA = qw(FS::Record); +use FS::part_svc_class; $DEBUG = 0; @@ -51,10 +51,23 @@ FS::Record. The following fields are currently supported: =item svcdb - table used for this service. See L, L, and L, among others. +=item classnum - Optional service class (see L) + =item disabled - Disabled flag, empty or `Y' =item preserve - Preserve after cancellation, empty or 'Y' +=item selfservice_access - Access allowed to the service via self-service: +empty for full access, "readonly" for read-only, "hidden" to hide it entirely + +=item restrict_edit_password - Require the "Provision customer service" access +right to change the password field, rather than just "Edit password". Only +relevant to svc_acct for now. + +=item has_router - Allow the service to have an L connected +through it. Probably only relevant to svc_broadband, svc_acct, and svc_dsl +for now. + =back =head1 METHODS @@ -82,7 +95,7 @@ the part_svc_column table appropriately (see L). =item I__I - Default or fixed value for I in I. -=item I__I_flag - defines I__I action: null or empty (no default), `D' for default, `F' for fixed (unchangeable), `M' for manual selection from inventory, or `A' for automatic selection from inventory. +=item I__I_flag - defines I__I action: null or empty (no default), `D' for default, `F' for fixed (unchangeable), , `S' for selectable choice, `M' for manual selection from inventory, or `A' for automatic selection from inventory. For virtual fields, can also be 'X' for excluded. =back @@ -192,6 +205,8 @@ sub insert { } } + # XXX shouldn't this update fixed values? + $dbh->commit or die $dbh->errstr if $oldAutoCommit; ''; @@ -382,9 +397,13 @@ sub check { $self->ut_numbern('svcpart') || $self->ut_text('svc') || $self->ut_alpha('svcdb') - || $self->ut_enum('disabled', [ '', 'Y' ] ) - || $self->ut_enum('preserve', [ '', 'Y' ] ) - ; + || $self->ut_flag('disabled') + || $self->ut_flag('preserve') + || $self->ut_enum('selfservice_access', [ '', 'hidden', 'readonly' ] ) + || $self->ut_foreign_keyn('classnum', 'part_svc_class', 'classnum' ) + || $self->ut_flag('restrict_edit_password') + || $self->ut_flag('has_router') +; return $error if $error; my @fields = eval { fields( $self->svcdb ) }; #might die @@ -434,8 +453,10 @@ sub part_export { my $self = shift; my %search; $search{'exporttype'} = shift if @_; - map { qsearchs('part_export', { 'exportnum' => $_->exportnum, %search } ) } - qsearch('export_svc', { 'svcpart' => $self->svcpart } ); + map { $_ } #behavior of sort undefined in scalar context + sort { $a->weight <=> $b->weight } + map { qsearchs('part_export', { 'exportnum'=>$_->exportnum, %search } ) } + qsearch('export_svc', { 'svcpart'=>$self->svcpart } ); } =item part_export_usage @@ -459,7 +480,7 @@ are capable of returing available DID (phone number) information. sub part_export_did { my $self = shift; - grep $_->can('get_dids'), $self->part_export; + grep $_->can_get_dids, $self->part_export; } =item part_export_dsl_pull @@ -583,7 +604,7 @@ sub _svc_defs { }; my $mod = $1; - if ( $mod =~ /^svc_[A-Z]/ or $mod =~ /^svc_acct_pop$/ ) { + if ( $mod =~ /^svc_[A-Z]/ or $mod =~ /^(svc_acct_pop|svc_export_machine)$/ ) { warn "skipping FS::$mod" if $DEBUG; next; } @@ -713,11 +734,6 @@ sub process { my $old = qsearchs('part_svc', { 'svcpart' => $param->{'svcpart'} }) if $param->{'svcpart'}; - $param->{'svc_acct__usergroup'} = - ref($param->{'svc_acct__usergroup'}) - ? join(',', @{$param->{'svc_acct__usergroup'}} ) - : $param->{'svc_acct__usergroup'}; - #unmunge cgp_accessmodes (falze laziness-ish w/edit/process/svc_acct.cgi) $param->{'svc_acct__cgp_accessmodes'} ||= join(' ', sort @@ -736,17 +752,18 @@ sub process { } ( fields('part_svc'), map { my $svcdb = $_; my @fields = fields($svcdb); - push @fields, 'usergroup' if $svcdb eq 'svc_acct'; #kludge + push @fields, 'usergroup' if $svcdb eq 'svc_acct' + or $svcdb eq 'svc_broadband'; #kludge map { my $f = $svcdb.'__'.$_; - if ( $param->{ $f.'_flag' } =~ /^[MAH]$/ ) { + my $flag = $param->{ $f.'_flag' } || ''; #silence warnings + if ( $flag =~ /^[MAH]$/ ) { $param->{ $f } = delete( $param->{ $f.'_classnum' } ); } - if ( $param->{ $f.'_flag' } =~ /^S$/ ) { - $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' ); } @@ -862,7 +879,8 @@ sub _upgrade_data { #class method 'description' => $groupname, }; $error = $g->insert; - die $error if $error; + die "Error inserting new radius_group for service definition group \"$groupname\": $error" + if $error; } push @groupnums, $g->groupnum; } @@ -871,6 +889,21 @@ sub _upgrade_data { #class method die $error if $error; } + my @badlabels = qsearch({ + 'table' => 'part_svc_column', + 'hashref' => {}, + 'extra_sql' => 'WHERE columnlabel IN ('. + "'Descriptive label for this particular device.',". + "'IP address. Leave blank for automatic assignment.',". + "'Maximum upload speed for this service in Kbps. 0 denotes unlimited.',". + "'Maximum download speed for this service in Kbps. 0 denotes unlimited.')" + }); + foreach my $col ( @badlabels ) { + $col->columnlabel(''); + my $error = $col->replace; + die $error if $error; + } + } =head1 BUGS