X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_pay.pm;h=4d06862d6d6c9c16ba36a47da07bc7d93f9a83bf;hb=55c7e3cc18a45620f48ae62d3bc044a830bd8c95;hp=59d77742c45fbf3af86343c90de16b9f23258a1a;hpb=46bbbb1a78fd822805226abea832b6206273c091;p=freeside.git diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm index 59d77742c..4d06862d6 100644 --- a/FS/FS/cust_pay.pm +++ b/FS/FS/cust_pay.pm @@ -2,9 +2,9 @@ package FS::cust_pay; use strict; use base qw( FS::otaker_Mixin FS::payinfo_transaction_Mixin FS::cust_main_Mixin - FS::Record ); + FS::reason_Mixin FS::Record); use vars qw( $DEBUG $me $conf @encrypted_fields - $unsuspendauto $ignore_noapply + $unsuspendauto $ignore_noapply ); use Date::Format; use Business::CreditCard; @@ -24,6 +24,8 @@ use FS::cust_pkg; use FS::cust_pay_void; use FS::upgrade_journal; use FS::Cursor; +use FS::reason; +use FS::reason_type; $DEBUG = 0; @@ -409,6 +411,22 @@ sub insert { warn "can't send payment receipt/statement: $error" if $error; } + #run payment events immediately + my $due_cust_event = $self->cust_main->due_cust_event( + 'eventtable' => 'cust_pay', + 'objects' => [ $self ], + ); + if ( !ref($due_cust_event) ) { + warn "Error searching for cust_pay billing events: $due_cust_event\n"; + } else { + foreach my $cust_event (@$due_cust_event) { + next unless $cust_event->test_conditions; + if ( my $error = $cust_event->do_event() ) { + warn "Error running cust_pay billing event: $error\n"; + } + } + } + ''; } @@ -422,6 +440,15 @@ adds a record of the voided payment to the FS::cust_pay_void table. sub void { my $self = shift; + my $reason = shift; + + unless (ref($reason) || !$reason) { + $reason = FS::reason->new_or_existing( + 'class' => 'X', + 'type' => 'Void payment', + 'reason' => $reason + ); + } local $SIG{HUP} = 'IGNORE'; local $SIG{INT} = 'IGNORE'; @@ -437,7 +464,7 @@ sub void { my $cust_pay_void = new FS::cust_pay_void ( { map { $_ => $self->get($_) } $self->fields } ); - $cust_pay_void->reason(shift) if scalar(@_); + $cust_pay_void->reasonnum($reason->reasonnum) if $reason; my $error = $cust_pay_void->insert; my $cust_pay_pending = @@ -645,72 +672,31 @@ sub send_receipt { my %substitutions = (); $substitutions{invnum} = $opt->{cust_bill}->invnum if $opt->{cust_bill}; - my $queue = new FS::queue { - 'job' => 'FS::Misc::process_send_email', - 'paynum' => $self->paynum, - 'custnum' => $cust_main->custnum, - }; - $error = $queue->insert( - FS::msg_template->by_key($msgnum)->prepare( + my $msg_template = qsearchs('msg_template',{ msgnum => $msgnum}); + unless ($msg_template) { + warn "send_receipt could not load msg_template"; + return; + } + + my $cust_msg = $msg_template->prepare( 'cust_main' => $cust_main, 'object' => $self, 'from_config' => 'payment_receipt_from', 'substitutions' => \%substitutions, - ), - 'msgtype' => 'receipt', # override msg_template's default - ); - - } elsif ( $conf->exists('payment_receipt_email') ) { - - my $receipt_template = new Text::Template ( - TYPE => 'ARRAY', - SOURCE => [ map "$_\n", $conf->config('payment_receipt_email') ], - ) or do { - warn "can't create payment receipt template: $Text::Template::ERROR"; - return ''; - }; - - my $payby = $self->payby; - my $payinfo = $self->payinfo; - $payby =~ s/^BILL$/Check/ if $payinfo; - if ( $payby eq 'CARD' || $payby eq 'CHEK' ) { - $payinfo = $self->paymask - } else { - $payinfo = $self->decrypt($payinfo); - } - $payby =~ s/^CHEK$/Electronic check/; - - my %fill_in = ( - 'date' => time2str("%a %B %o, %Y", $self->_date), - 'name' => $cust_main->name, - 'paynum' => $self->paynum, - 'paid' => sprintf("%.2f", $self->paid), - 'payby' => ucfirst(lc($payby)), - 'payinfo' => $payinfo, - 'balance' => $cust_main->balance, - 'company_name' => $conf->config('company_name', $cust_main->agentnum), + 'msgtype' => 'receipt', ); - - $fill_in{'invnum'} = $opt->{cust_bill}->invnum if $opt->{cust_bill}; - - if ( $opt->{'cust_pkg'} ) { - $fill_in{'pkg'} = $opt->{'cust_pkg'}->part_pkg->pkg; - #setup date, other things? + $error = $cust_msg ? $cust_msg->insert : 'error preparing msg_template'; + if ($error) { + warn "send_receipt: $error"; + return; } my $queue = new FS::queue { - 'job' => 'FS::Misc::process_send_generated_email', + 'job' => 'FS::cust_msg::process_send', 'paynum' => $self->paynum, 'custnum' => $cust_main->custnum, - 'msgtype' => 'receipt', }; - $error = $queue->insert( - 'from' => $conf->invoice_from_full( $cust_main->agentnum ), - #invoice_from??? well as good as any - 'to' => \@invoicing_list, - 'subject' => 'Payment receipt', - 'body' => [ $receipt_template->fill_in( HASH => \%fill_in ) ], - ); + $error = $queue->insert( $cust_msg->custmsgnum ); } else { @@ -985,7 +971,7 @@ sub batch_insert { } } elsif ( !$error ) { #normal case: apply payments as usual - $cust_pay->cust_main->apply_payments; + $cust_pay->cust_main->apply_payments( 'manual'=>1 ); } } @@ -1048,6 +1034,8 @@ sub _upgrade_data { #class method warn "$me upgrading $class\n" if $DEBUG; + $class->_upgrade_reasonnum(%opt); + local $FS::payinfo_Mixin::ignore_masked_payinfo = 1; ## @@ -1336,7 +1324,7 @@ sub process_batch_import { my $cust_pay = shift; my $cust_main = $cust_pay->cust_main or return "can't find customer to which payments apply"; - my $error = $cust_main->apply_payments_and_credits; + my $error = $cust_main->apply_payments_and_credits( 'manual'=>1 ); return $error ? "can't apply payments to customer ".$cust_pay->custnum."$error" : '';