X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_credit.pm;h=e07461d58884937ef77fdee1cdf7a46c0a6cbc4a;hb=5de882c01159bfcc5f3d91c7cdfb4c707ff2516f;hp=19a54534f1c2aea886b406792b2fee50d5adbcd5;hpb=c085c3ba3bd0677719407ce613dd24466f05abe2;p=freeside.git diff --git a/FS/FS/cust_credit.pm b/FS/FS/cust_credit.pm index 19a54534f..e07461d58 100644 --- a/FS/FS/cust_credit.pm +++ b/FS/FS/cust_credit.pm @@ -4,13 +4,14 @@ use strict; use vars qw( @ISA $conf $unsuspendauto ); use Date::Format; use FS::UID qw( dbh getotaker ); -use FS::Record qw( qsearch qsearchs ); use FS::Misc qw(send_email); +use FS::Record qw( qsearch qsearchs ); +use FS::cust_main_Mixin; use FS::cust_main; use FS::cust_refund; use FS::cust_credit_bill; -@ISA = qw( FS::Record ); +@ISA = qw( FS::cust_main_Mixin FS::Record ); #ask FS::UID to run this stuff for us later $FS::UID::callback{'FS::cust_credit'} = sub { @@ -75,6 +76,12 @@ Creates a new credit. To add the credit to the database, see L<"insert">. =cut sub table { 'cust_credit'; } +sub cust_linked { $_[0]->cust_main_custnum; } +sub cust_unlinked_msg { + my $self = shift; + "WARNING: can't find cust_main.custnum ". $self->custnum. + ' (cust_credit.crednum '. $self->crednum. ')'; +} =item insert @@ -106,6 +113,8 @@ sub insert { return "error inserting $self: $error"; } + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + #false laziness w/ cust_credit::insert if ( $unsuspendauto && $old_balance && $cust_main->balance <= 0 ) { my @errors = $cust_main->unsuspend; @@ -125,10 +134,13 @@ sub insert { =item delete -Currently unimplemented. +Unless the closed flag is set, deletes this credit and all associated +applications (see L). In most cases, you want to use +the void method instead to leave a record of the deleted credit. =cut +# very similar to FS::cust_pay::delete sub delete { my $self = shift; return "Can't delete closed credit" if $self->closed =~ /^Y/i; @@ -152,6 +164,14 @@ sub delete { } } + foreach my $cust_credit_refund ( $self->cust_credit_refund ) { + my $error = $cust_credit_refund->delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + my $error = $self->SUPER::delete(@_); if ( $error ) { $dbh->rollback if $oldAutoCommit; @@ -160,7 +180,7 @@ sub delete { if ( $conf->config('deletecredits') ne '' ) { - my $cust_main = qsearchs('cust_main',{ 'custnum' => $self->custnum }); + my $cust_main = $self->cust_main; my $error = send_email( 'from' => $conf->config('invoice_from'), #??? well as good as any @@ -194,8 +214,7 @@ sub delete { =item replace OLD_RECORD -Credits may not be modified; there would then be no record the credit was ever -posted. +You can, but probably shouldn't modify credits... =cut @@ -300,12 +319,57 @@ sub credited { sprintf( "%.2f", $amount ); } +=item cust_main + +Returns the customer (see L) for this credit. + +=cut + +sub cust_main { + my $self = shift; + qsearchs( 'cust_main', { 'custnum' => $self->custnum } ); +} + + +=back + +=head1 CLASS METHODS + +=over 4 + +=item credited_sql + +Returns an SQL fragment to retreive the unapplied amount. + +=cut + +sub credited_sql { + #my $class = shift; + + "amount + - COALESCE( + ( SELECT SUM(amount) FROM cust_credit_refund + WHERE cust_credit.crednum = cust_credit_refund.crednum ) + ,0 + ) + - COALESCE( + ( SELECT SUM(amount) FROM cust_credit_bill + WHERE cust_credit.crednum = cust_credit_bill.crednum ) + ,0 + ) + "; + +} + =back =head1 BUGS The delete method. The replace method. +B and B should probably be called B and +B. + =head1 SEE ALSO L, L, L,