X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpart_export.pm;h=96fb85fc38883de1fa834b003d001958ba6bb3a4;hp=f3d977480398c7db83dc67d15c4b7694f784f103;hb=8d0e8149e7b19ad8543ac6c8c663be63dbc34762;hpb=e3503e19a5a6c876f410903a3946dd9f1597aa46 diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm index f3d977480..96fb85fc3 100644 --- a/FS/FS/part_export.pm +++ b/FS/FS/part_export.pm @@ -10,6 +10,7 @@ use FS::part_svc; use FS::part_export_option; use FS::part_export_machine; use FS::svc_export_machine; +use FS::export_cust_svc; #for export modules, though they should probably just use it themselves use FS::queue; @@ -58,6 +59,12 @@ fields are currently supported: =item nodomain - blank or "Y" : usernames are exported to this service with no domain +=item default_machine - For exports that require a machine to be selected for +each service (see L), the one to use as the default. + +=item no_suspend - Don't export service suspensions. In the future there may +be "no_*" options for the other service actions. + =back =head1 METHODS @@ -156,6 +163,17 @@ sub delete { local $FS::UID::AutoCommit = 0; my $dbh = dbh; + # delete associated export_cust_svc + foreach my $export_cust_svc ( + qsearch('export_cust_svc',{ 'exportnum' => $self->exportnum }) + ) { + my $error = $export_cust_svc->delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + # clean up export_nas records my $error = $self->process_m2m( 'link_table' => 'export_nas', @@ -337,6 +355,7 @@ sub check { || $self->ut_textn('exportname') || $self->ut_domainn('machine') || $self->ut_alpha('exporttype') + || $self->ut_flag('no_suspend') ; if ( $self->machine eq '_SVC_MACHINE' ) { @@ -535,15 +554,19 @@ sub default_export_machine { die "no default export hostname for export ".$self->exportnum; } -#these should probably all go away, just let the subclasses define em - =item export_insert SVC_OBJECT =cut +# Do not overload! Overload _export_insert instead + sub export_insert { my $self = shift; #$self->rebless; + if ( $FS::svc_Common::noexport_hack ) { + carp "export_insert() suppressed by noexport_hack" if $DEBUG; + return; + } $self->_export_insert(@_); } @@ -560,9 +583,15 @@ sub export_insert { =cut +# Do not overload! Overload _export_replace instead + sub export_replace { my $self = shift; #$self->rebless; + if ( $FS::svc_Common::noexport_hack ) { + carp "export_replace() suppressed by noexport_hack" if $DEBUG; + return; + } $self->_export_replace(@_); } @@ -570,9 +599,15 @@ sub export_replace { =cut +# Do not overload! Overload _export_delete instead + sub export_delete { my $self = shift; #$self->rebless; + if ( $FS::svc_Common::noexport_hack ) { + carp "export_delete() suppressed by noexport_hack" if $DEBUG; + return; + } $self->_export_delete(@_); } @@ -580,9 +615,15 @@ sub export_delete { =cut +# Do not overload! Overload _export_suspend instead + sub export_suspend { my $self = shift; #$self->rebless; + if ( $FS::svc_Common::noexport_hack ) { + carp "export_suspend() suppressed by noexport_hack" if $DEBUG; + return; + } $self->_export_suspend(@_); } @@ -590,9 +631,15 @@ sub export_suspend { =cut +# Do not overload! Overload _export_unsuspend instead + sub export_unsuspend { my $self = shift; #$self->rebless; + if ( $FS::svc_Common::noexport_hack ) { + carp "export_unsuspend() suppressed by noexport_hack" if $DEBUG; + return; + } $self->_export_unsuspend(@_); } @@ -619,7 +666,7 @@ sub _export_suspend { #warn "warning: _export_suspened unimplemented for". ref($self); my $svc_x = shift; my $new = $svc_x->clone_suspended; - $self->_export_replace( $new, $svc_x ); + $self->export_replace( $new, $svc_x ); } sub _export_unsuspend { @@ -627,7 +674,82 @@ sub _export_unsuspend { #warn "warning: _export_unsuspend unimplemented for ". ref($self); my $svc_x = shift; my $old = $svc_x->clone_kludge_unsuspend; - $self->_export_replace( $svc_x, $old ); + $self->export_replace( $svc_x, $old ); +} + +=item get_remoteid SVC + +Returns the remote id for this export for the given service. + +=cut + +sub get_remoteid { + my ($self, $svc_x) = @_; + + my $export_cust_svc = qsearchs('export_cust_svc',{ + 'exportnum' => $self->exportnum, + 'svcnum' => $svc_x->svcnum + }); + + return $export_cust_svc ? $export_cust_svc->remoteid : ''; +} + +=item set_remoteid SVC VALUE + +Sets the remote id for this export for the given service. +See L. + +If value is true, inserts or updates export_cust_svc record. +If value is false, deletes any existing record. + +Returns error message, blank on success. + +=cut + +sub set_remoteid { + my ($self, $svc_x, $value) = @_; + + my $export_cust_svc = qsearchs('export_cust_svc',{ + 'exportnum' => $self->exportnum, + 'svcnum' => $svc_x->svcnum + }); + + 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 = ''; + if ($value) { + if ($export_cust_svc) { + $export_cust_svc->set('remoteid',$value); + $error = $export_cust_svc->replace; + } else { + $export_cust_svc = new FS::export_cust_svc { + 'exportnum' => $self->exportnum, + 'svcnum' => $svc_x->svcnum, + 'remoteid' => $value + }; + $error = $export_cust_svc->insert; + } + } else { + if ($export_cust_svc) { + $error = $export_cust_svc->delete; + } #otherwise, it already doesn't exist + } + + if ($oldAutoCommit) { + $dbh->rollback if $error; + $dbh->commit unless $error; + } + + return $error; } =item export_links SVC_OBJECT ARRAYREF @@ -697,8 +819,12 @@ actual DIDs except at the lowest level. Generally, 'state' alone will return an array of area codes or region names in the state. -'state' and 'areacode' together will return an array of exchanges (NXX -prefixes), or for some exports, an array of ratecenter names. +'state' and 'areacode' together will return an array of either: +- exchange strings of the form "New York (212-555-XXXX)" +- ratecenter names of the form "New York, NY" + +These strings are sent back to the UI and offered as options so that the user +can choose the local calling area they like. 'areacode' and 'exchange', or 'state' and 'ratecenter', or 'region' by itself will return an array of actual DID numbers. @@ -706,6 +832,8 @@ will return an array of actual DID numbers. Passing 'tollfree' with a true value will override the whole hierarchy and return an array of tollfree numbers. +C methods should report errors via die(). + =cut # no stub; can('get_dids') should return false by default