X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_svc.pm;h=986c5ae494b41e402fcc0d262b227c586d40cd20;hb=3a2d8bbc434fbcb96563bd4d437b31db38c76f09;hp=a7aeadaf15a7491e4b77927794bc5a0a21056e53;hpb=47cb646c89d4a798d35063f04db39c707eac4f4c;p=freeside.git diff --git a/FS/FS/cust_svc.pm b/FS/FS/cust_svc.pm index a7aeadaf1..986c5ae49 100644 --- a/FS/FS/cust_svc.pm +++ b/FS/FS/cust_svc.pm @@ -118,8 +118,42 @@ sub delete { my $cust_pkg = $self->cust_pkg; my $custnum = $cust_pkg->custnum if $cust_pkg; + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + my $error = $self->SUPER::delete; - return $error if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + foreach my $part_svc_link ( $self->part_svc_link( + link_type => 'cust_svc_unprovision_cascade', + ) + ) { + foreach my $cust_svc ( qsearch( 'cust_svc', { + 'pkgnum' => $self->pkgnum, + 'svcpart' => $part_svc_link->dst_svcpart, + }) + ) { + my $error = $cust_svc->svc_x->delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; if ( $ticket_system eq 'RT_Internal' ) { unless ( $rt_session ) { @@ -144,6 +178,40 @@ sub delete { warn "error unlinking ticket $svcnum: $msg\n" if !$val; } } + + ''; + +} + +=item suspend + +Suspends the relevant service by calling the B method of the associated +FS::svc_XXX object (i.e. an FS::svc_acct object or FS::svc_domain object). + +If there is an error, returns the error, otherwise returns false. + +=cut + +sub suspend { + my( $self, %opt ) = @_; + + $self->part_svc->svcdb =~ /^([\w\-]+)$/ or return 'Illegal part_svc.svcdb'; + my $svcdb = $1; + require "FS/$svcdb.pm"; + + my $svc = qsearchs( $svcdb, { 'svcnum' => $self->svcnum } ) + or return ''; + + my $error = $svc->suspend; + return $error if $error; + + if ( $opt{labels_arryref} ) { + my( $label, $value ) = $self->label; + push @{ $opt{labels_arrayref} }, "$label: $value"; + } + + ''; + } =item cancel @@ -456,6 +524,35 @@ sub check { $self->SUPER::check; } +=item check_part_svc_link_unprovision + +Checks service dependency unprovision rules for this service. + +If there is an error, returns the error, otherwise returns false. + +=cut + +sub check_part_svc_link_unprovision { + my $self = shift; + + foreach my $part_svc_link ( $self->part_svc_link( + link_type => 'cust_svc_unprovision_restrict', + ) + ) { + return $part_svc_link->dst_svc. ' must be unprovisioned before '. + $part_svc_link->src_svc + if qsearchs({ + 'table' => 'cust_svc', + 'hashref' => { 'pkgnum' => $self->pkgnum, + 'svcpart' => $part_svc_link->dst_svcpart, + }, + 'order_by' => 'LIMIT 1', + }); + } + + ''; +} + =item part_svc_link Returns the service dependencies (see L) for the given