X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=FS%2FFS%2Fcust_pkg.pm;h=cbf4ae50d38be016d2ff1f2ff54dfe184c019d18;hb=a984fa561b6493ae41215c3d26013767f9ce79cb;hp=9705827e789632dd0d31d931e8f5d28f72de2b05;hpb=15f65a0c56cbce6951d9cb4f71119725a2009f79;p=freeside.git diff --git a/FS/FS/cust_pkg.pm b/FS/FS/cust_pkg.pm index 9705827e7..cbf4ae50d 100644 --- a/FS/FS/cust_pkg.pm +++ b/FS/FS/cust_pkg.pm @@ -77,6 +77,9 @@ inherits from FS::Record. The following fields are currently supported: =item otaker - order taker (assigned automatically if null, see L) +=item manual_flag - If this field is set to 1, disables the automatic +unsuspensiond of this package when using the B config file. + =back Note: setup, bill, susp, expire and cancel are specified as UNIX timestamps; @@ -100,17 +103,19 @@ sub table { 'cust_pkg'; } Adds this billing item to the database ("Orders" the item). If there is an error, returns the error, otherwise returns false. +=cut + sub insert { my $self = shift; # custnum might not have have been defined in sub check (for one-shot new # customers), so check it here instead + # (is this still necessary with transactions?) my $error = $self->ut_number('custnum'); - return $error if $error + return $error if $error; - return "Unknown customer" - unless qsearchs( 'cust_main', { 'custnum' => $self->custnum } ); + return "Unknown customer ". $self->custnum unless $self->cust_main; $self->SUPER::insert; @@ -183,8 +188,7 @@ sub check { return $error if $error; if ( $self->custnum ) { - return "Unknown customer" - unless qsearchs( 'cust_main', { 'custnum' => $self->custnum } ); + return "Unknown customer ". $self->custnum unless $self->cust_main; } return "Unknown pkgpart" @@ -194,6 +198,11 @@ sub check { $self->otaker =~ /^(\w{0,16})$/ or return "Illegal otaker"; $self->otaker($1); + if ( $self->dbdef_table->column('manual_flag') ) { + $self->manual_flag =~ /^([01]?)$/ or return "Illegal manual_flag"; + $self->manual_flag($1); + } + ''; #no error } @@ -422,13 +431,24 @@ sub labels { map { [ $_->label ] } qsearch ( 'cust_svc', { 'pkgnum' => $self->pkgnum } ); } +=item cust_main + +Returns the parent customer object (see L). + +=cut + +sub cust_main { + my $self = shift; + qsearchs( 'cust_main', { 'custnum' => $self->custnum } ); +} + =back =head1 SUBROUTINES =over 4 -=item order CUSTNUM, PKGPARTS_ARYREF, [ REMOVE_PKGNUMS_ARYREF ] +=item order CUSTNUM, PKGPARTS_ARYREF, [ REMOVE_PKGNUMS_ARYREF [ RETURN_CUST_PKG_ARRAYREF ] ] CUSTNUM is a customer (see L) @@ -439,12 +459,17 @@ permitted. REMOVE_PKGNUMS is an optional list of pkgnums specifying the billing items to remove for this customer. The services (see L) are moved to the new billing items. An error is returned if this is not possible (see -L). +L). An empty arrayref is equivalent to not specifying this +parameter. + +RETURN_CUST_PKG_ARRAYREF, if specified, will be filled in with the +newly-created cust_pkg objects. =cut sub order { - my($custnum,$pkgparts,$remove_pkgnums)=@_; + my($custnum, $pkgparts, $remove_pkgnums, $return_cust_pkg) = @_; + $remove_pkgnums = [] unless defined($remove_pkgnums); my $oldAutoCommit = $FS::UID::AutoCommit; local $FS::UID::AutoCommit = 0; @@ -511,7 +536,7 @@ sub order { my($old) = qsearchs('cust_pkg',{'pkgnum'=>$pkgnum}); unless ( $old ) { $dbh->rollback if $oldAutoCommit; - die "Package $pkgnum not found to remove!"; + return "Package $pkgnum not found to remove!"; } my(%hash) = $old->hash; $hash{'cancel'}=time; @@ -519,7 +544,7 @@ sub order { my($error)=$new->replace($old); if ( $error ) { $dbh->rollback if $oldAutoCommit; - die "Couldn't update package $pkgnum: $error"; + return "Couldn't update package $pkgnum: $error"; } } @@ -527,26 +552,26 @@ sub order { # my($pkgpart); while ($pkgpart=shift @{$pkgparts} ) { - my($new) = new FS::cust_pkg ( { - 'custnum' => $custnum, - 'pkgpart' => $pkgpart, - } ); - my($error) = $new->insert; - if ( $error ) { + my $new = new FS::cust_pkg { + 'custnum' => $custnum, + 'pkgpart' => $pkgpart, + }; + my $error = $new->insert; + if ( $error ) { $dbh->rollback if $oldAutoCommit; - die "Couldn't insert new cust_pkg record: $error"; + return "Couldn't insert new cust_pkg record: $error"; } - my($pkgnum)=$new->getfield('pkgnum'); + push @{$return_cust_pkg}, $new if $return_cust_pkg; + my $pkgnum = $new->pkgnum; - my($cust_svc); - foreach $cust_svc ( @{ shift @cust_svc } ) { + foreach my $cust_svc ( @{ shift @cust_svc } ) { my(%hash) = $cust_svc->hash; $hash{'pkgnum'}=$pkgnum; my($new) = new FS::cust_svc ( \%hash ); my($error)=$new->replace($cust_svc); - if ( $error ) { + if ( $error ) { $dbh->rollback if $oldAutoCommit; - die "Couldn't link old service to new package: $error"; + return "Couldn't link old service to new package: $error"; } } } @@ -560,7 +585,7 @@ sub order { =head1 VERSION -$Id: cust_pkg.pm,v 1.5 2001-04-09 23:05:15 ivan Exp $ +$Id: cust_pkg.pm,v 1.10 2001-10-15 12:16:42 ivan Exp $ =head1 BUGS @@ -577,10 +602,13 @@ cancel } because they use %FS::UID::callback to load configuration values. Probably need a subroutine which decides what to do based on whether or not we've fetched the user yet, rather than a hash. See FS::UID and the TODO. +Now that things are transactional should the check in the insert method be +moved to check ? + =head1 SEE ALSO -L, L, L, L -, L, schema.html from the base documentation +L, L, L, L, +L, schema.html from the base documentation =cut