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 {
=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
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;
=item delete
-Currently unimplemented.
+Unless the closed flag is set, deletes this credit and all associated
+applications (see L<FS::cust_credit_bill>). 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;
}
}
+ 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;
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
=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
sprintf( "%.2f", $amount );
}
+=item cust_main
+
+Returns the customer (see L<FS::cust_main>) 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<credited> and B<credited_sql> should probably be called B<unapplied> and
+B<unapplied_sql>.
+
=head1 SEE ALSO
L<FS::Record>, L<FS::cust_credit_refund>, L<FS::cust_refund>,