X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fsvc_Common.pm;h=65b34c70971c7a2cae3dafb14312c00f73e17bec;hb=0a7ecc6aaf613683a7d1ccd65c80b09da1fff93e;hp=52226d20b05ba5efab977f55571a2bec84b52125;hpb=5a322e9cf2be599b4c6bcf3959178506dd5992be;p=freeside.git diff --git a/FS/FS/svc_Common.pm b/FS/FS/svc_Common.pm index 52226d20b..65b34c709 100644 --- a/FS/FS/svc_Common.pm +++ b/FS/FS/svc_Common.pm @@ -3,6 +3,7 @@ package FS::svc_Common; use strict; use vars qw( @ISA $noexport_hack $DEBUG $me ); use Carp qw( cluck carp croak ); #specify cluck have to specify them all.. +use Scalar::Util qw( blessed ); use FS::Record qw( qsearch qsearchs fields dbh ); use FS::cust_main_Mixin; use FS::cust_svc; @@ -40,13 +41,15 @@ inherit from, i.e. FS::svc_acct. FS::svc_Common inherits from FS::Record. Class method which returns an SQL fragment to search for STRING in FIELD. +It is now case-insensitive by default. + =cut sub search_sql_field { my( $class, $field, $string ) = @_; my $table = $class->table; my $q_string = dbh->quote($string); - "$table.$field = $q_string"; + "LOWER($table.$field) = LOWER($q_string)"; } #fallback for services that don't provide a search... @@ -128,7 +131,7 @@ sub virtual_fields { my %flags = map { $_->columnname, $_->columnflag } ( qsearch ('part_svc_column', { svcpart => $svcpart } ) ); - return grep { not ($flags{$_} eq 'X') } @vfields; + return grep { not ( defined($flags{$_}) && $flags{$_} eq 'X') } @vfields; } else { # Case 3 return @vfields; } @@ -187,6 +190,9 @@ If I is set (to a scalar jobnum or an array reference of jobnums), all provisioning jobs will have a dependancy on the supplied jobnum(s) (they will not run until the specific job(s) complete(s)). +If I is set to an array reference, the referenced list will be +passed to export commands. + =cut sub insert { @@ -203,7 +209,6 @@ sub insert { my $objects = $options{'child_objects'} || []; my $depend_jobnums = $options{'depend_jobnum'} || []; $depend_jobnums = [ $depend_jobnums ] unless ref($depend_jobnums); - my $error; local $SIG{HUP} = 'IGNORE'; local $SIG{INT} = 'IGNORE'; @@ -216,9 +221,6 @@ sub insert { local $FS::UID::AutoCommit = 0; my $dbh = dbh; - $error = $self->check; - return $error if $error; - my $svcnum = $self->svcnum; my $cust_svc = $svcnum ? qsearchs('cust_svc',{'svcnum'=>$self->svcnum}) : ''; #unless ( $svcnum ) { @@ -229,7 +231,7 @@ sub insert { 'pkgnum' => $self->pkgnum, 'svcpart' => $self->svcpart, } ); - $error = $cust_svc->insert; + my $error = $cust_svc->insert; if ( $error ) { $dbh->rollback if $oldAutoCommit; return $error; @@ -245,13 +247,9 @@ sub insert { $self->svcpart($cust_svc->svcpart); } - $error = $self->set_auto_inventory; - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return $error; - } - - $error = $self->SUPER::insert; + my $error = $self->set_auto_inventory + || $self->check + || $self->SUPER::insert; if ( $error ) { $dbh->rollback if $oldAutoCommit; return $error; @@ -279,8 +277,10 @@ sub insert { warn "[$me] insert: \$FS::queue::jobnums is $FS::queue::jobnums\n" if $DEBUG; + my $export_args = $options{'export_args'} || []; + foreach my $part_export ( $self->cust_svc->part_svc->part_export ) { - my $error = $part_export->export_insert($self); + my $error = $part_export->export_insert($self, @$export_args); if ( $error ) { $dbh->rollback if $oldAutoCommit; return "exporting to ". $part_export->exporttype. @@ -314,7 +314,7 @@ sub insert { ''; } -=item delete +=item delete [ , OPTION => VALUE ... ] Deletes this account from the database. If there is an error, returns the error, otherwise returns false. @@ -325,7 +325,8 @@ The corresponding FS::cust_svc record will be deleted as well. sub delete { my $self = shift; - my $error; + my %options = @_; + my $export_args = $options{'export_args'} || []; local $SIG{HUP} = 'IGNORE'; local $SIG{INT} = 'IGNORE'; @@ -338,10 +339,10 @@ sub delete { local $FS::UID::AutoCommit = 0; my $dbh = dbh; - $error = $self->SUPER::delete - || $self->export('delete') - || $self->return_inventory - || $self->cust_svc->delete + my $error = $self->SUPER::delete + || $self->export('delete', @$export_args) + || $self->return_inventory + || $self->cust_svc->delete ; if ( $error ) { $dbh->rollback if $oldAutoCommit; @@ -353,7 +354,7 @@ sub delete { ''; } -=item replace OLD_RECORD +=item replace [ OLD_RECORD ] [ HASHREF | OPTION => VALUE ] Replaces OLD_RECORD with this one. If there is an error, returns the error, otherwise returns false. @@ -361,7 +362,16 @@ otherwise returns false. =cut sub replace { - my ($new, $old) = (shift, shift); + my $new = shift; + + my $old = ( blessed($_[0]) && $_[0]->isa('FS::Record') ) + ? shift + : $new->replace_old; + + my $options = + ( ref($_[0]) eq 'HASH' ) + ? shift + : { @_ }; local $SIG{HUP} = 'IGNORE'; local $SIG{INT} = 'IGNORE'; @@ -374,9 +384,6 @@ sub replace { local $FS::UID::AutoCommit = 0; my $dbh = dbh; - # We absolutely have to have an old vs. new record to make this work. - $old = $new->replace_old unless defined($old); - my $error = $new->set_auto_inventory; if ( $error ) { $dbh->rollback if $oldAutoCommit; @@ -392,6 +399,8 @@ sub replace { #new-style exports! unless ( $noexport_hack ) { + my $export_args = $options->{'export_args'} || []; + #not quite false laziness, but same pattern as FS::svc_acct::replace and #FS::part_export::sqlradius::_export_replace. List::Compare or something #would be useful but too much of a pain in the ass to deploy @@ -407,7 +416,7 @@ sub replace { foreach my $delete_part_export ( grep { ! $new_exportnum{$_->exportnum} } @old_part_export ) { - my $error = $delete_part_export->export_delete($old); + my $error = $delete_part_export->export_delete($old, @$export_args); if ( $error ) { $dbh->rollback if $oldAutoCommit; return "error deleting, export to ". $delete_part_export->exporttype. @@ -418,7 +427,8 @@ sub replace { foreach my $replace_part_export ( grep { $old_exportnum{$_->exportnum} } @new_part_export ) { - my $error = $replace_part_export->export_replace($new,$old); + my $error = + $replace_part_export->export_replace( $new, $old, @$export_args); if ( $error ) { $dbh->rollback if $oldAutoCommit; return "error exporting to ". $replace_part_export->exporttype. @@ -429,7 +439,7 @@ sub replace { foreach my $insert_part_export ( grep { ! $old_exportnum{$_->exportnum} } @new_part_export ) { - my $error = $insert_part_export->export_insert($new); + my $error = $insert_part_export->export_insert($new, @$export_args ); if ( $error ) { $dbh->rollback if $oldAutoCommit; return "error inserting export to ". $insert_part_export->exporttype. @@ -443,7 +453,6 @@ sub replace { ''; } - =item setfixed Sets any fixed fields for this service (see L). If there is an @@ -681,7 +690,9 @@ Runs export_suspend callbacks. sub suspend { my $self = shift; - $self->export('suspend'); + my %options = @_; + my $export_args = $options{'export_args'} || []; + $self->export('suspend', @$export_args); } =item unsuspend @@ -692,7 +703,22 @@ Runs export_unsuspend callbacks. sub unsuspend { my $self = shift; - $self->export('unsuspend'); + my %options = @_; + my $export_args = $options{'export_args'} || []; + $self->export('unsuspend', @$export_args); +} + +=item export_links + +Runs export_links callbacks and returns the links. + +=cut + +sub export_links { + my $self = shift; + my $return = []; + $self->export('links', $return); + $return; } =item export HOOK [ EXPORT_ARGS ]