X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_svc.pm;h=2748686ccdaae7287a04e9332779a9a124e68788;hp=c471771712d3b1482c057699b2b66f9416001069;hb=5109f7d0bc4a9c3a984b9f182650425daa0acfb7;hpb=cb0c47fff7f412d2a8f9ae611f84584fcf8518de diff --git a/FS/FS/part_svc.pm b/FS/FS/part_svc.pm index c47177171..2748686cc 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 ); @@ -11,8 +12,6 @@ use FS::export_svc; use FS::cust_svc; use FS::part_svc_class; -@ISA = qw(FS::Record); - $DEBUG = 0; =head1 NAME @@ -58,6 +57,17 @@ L, and L, among others. =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 @@ -103,12 +113,8 @@ TODOC: JOB sub insert { my $self = shift; my @fields = (); - my @exportnums = (); @fields = @{shift(@_)} if @_; - if ( @_ ) { - my $exportnums = shift; - @exportnums = grep $exportnums->{$_}, keys %$exportnums; - } + my $exportnums = shift || {}; my $job = ''; $job = shift if @_; @@ -181,12 +187,14 @@ sub insert { } # add export_svc records + my @exportnums = grep $exportnums->{$_}, keys %$exportnums; my $slice = 100/scalar(@exportnums) if @exportnums; my $done = 0; foreach my $exportnum ( @exportnums ) { my $export_svc = new FS::export_svc ( { 'exportnum' => $exportnum, 'svcpart' => $self->svcpart, + 'role' => $exportnums->{$exportnum}, } ); $error = $export_svc->insert($job, $slice*$done++, $slice); if ( $error ) { @@ -317,9 +325,10 @@ sub replace { # maintain export_svc records - if ( $exportnums ) { + if ( $exportnums ) { # hash of exportnum => role #false laziness w/ edit/process/agent_type.cgi + #and, more importantly, with m2m_Common my @new_export_svc = (); foreach my $part_export ( qsearch('part_export', {}) ) { my $exportnum = $part_export->exportnum; @@ -329,13 +338,23 @@ sub replace { }; my $export_svc = qsearchs('export_svc', $hashref); - if ( $export_svc && ! $exportnums->{$exportnum} ) { - $error = $export_svc->delete; - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return $error; + if ( $export_svc ) { + my $old_role = $export_svc->role || 1; # 1 = null in the db + if ( ! $exportnums->{$exportnum} + or $old_role ne $exportnums->{$exportnum} ) { + + $error = $export_svc->delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + undef $export_svc; # on a role change, force it to be reinserted + } - } elsif ( ! $export_svc && $exportnums->{$exportnum} ) { + } # if $export_svc + if ( ! $export_svc && $exportnums->{$exportnum} ) { + # also applies if it's been undef'd because of role change + $hashref->{role} = $exportnums->{$exportnum}; push @new_export_svc, new FS::export_svc ( $hashref ); } @@ -387,11 +406,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 @@ -468,7 +489,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 @@ -710,13 +731,10 @@ Job-queue processor for web interface adds/edits =cut -use Storable qw(thaw); use Data::Dumper; -use MIME::Base64; sub process { my $job = shift; - - my $param = thaw(decode_base64(shift)); + my $param = shift; warn Dumper($param) if $DEBUG; my $old = qsearchs('part_svc', { 'svcpart' => $param->{'svcpart'} }) @@ -749,11 +767,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' ); } @@ -766,7 +782,13 @@ sub process { my %exportnums = map { $_->exportnum => ( $param->{'exportnum'.$_->exportnum} || '') } qsearch('part_export', {} ); - + foreach my $exportnum (%exportnums) { + my $role = $param->{'exportnum'.$exportnum.'_role'}; + # role is undef if the export has no role selector + if ( $exportnums{$exportnum} && $role ) { + $exportnums{$exportnum} = $role; + } + } my $error; if ( $param->{'svcpart'} ) { $error = $new->replace( $old, @@ -792,13 +814,10 @@ Job-queue processor for web interface bulk customer service changes =cut -use Storable qw(thaw); use Data::Dumper; -use MIME::Base64; sub process_bulk_cust_svc { my $job = shift; - - my $param = thaw(decode_base64(shift)); + my $param = shift; warn Dumper($param) if $DEBUG; local($FS::svc_Common::noexport_hack) = 1