X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=httemplate%2Fview%2Fcust_main%2Fpayment_history.html;h=099bc4f2b5ec04d9cdacbc4b048475851c9a1c40;hb=eb4ff7f73c5d4bdf74a3472448b5a195598ff4cd;hp=f0cd993ff33c291428b88268085edff546028907;hpb=2c757d7db4cb6a7b9655de13206fcc84fb7ce61f;p=freeside.git
diff --git a/httemplate/view/cust_main/payment_history.html b/httemplate/view/cust_main/payment_history.html
index f0cd993ff..099bc4f2b 100644
--- a/httemplate/view/cust_main/payment_history.html
+++ b/httemplate/view/cust_main/payment_history.html
@@ -1,436 +1,615 @@
-<%
- my( $cust_main ) = @_;
- my $custnum = $cust_main->custnum;
-
- my $conf = new FS::Conf;
-
- my @payby = grep /\w/, $conf->config('payby');
- #@payby = (qw( CARD DCRD CHEK DCHK LECB BILL CASH WEST COMP ))
- @payby = (qw( CARD DCRD CHEK DCHK LECB BILL CASH COMP ))
- unless @payby;
- my %payby = map { $_=>1 } @payby;
-
- my $s = 0;
-
-%>
-
Payment History
-<% if ( $payby{'BILL'} ) { %>
-
- <%= $s++ ? ' | ' : '' %>
- Post check payment
-
-<% } %>
-
-<% if ( $payby{'CASH'} ) { %>
-
- <%= $s++ ? ' | ' : '' %>
- Post cash payment
-
-<% } %>
-
-<% if ( $payby{'WEST'} ) { %>
-
- <%= $s++ ? ' | ' : '' %>
- Post Western Union payment
-
-<% } %>
-
-<% if ( $payby{'CARD'} || $payby{'DCRD'} ) { %>
-
- <%= $s++ ? ' | ' : '' %>
- Process credit card payment
-
-<% } %>
-
-<% if ( $payby{'CHEK'} || $payby{'DCHK'} ) { %>
-
- <%= $s++ ? ' | ' : '' %>
- Process electronic check (ACH) payment
-
-<% } %>
-
-<% if ( $payby{'MCRD'} ) { %>
-
- <%= $s++ ? ' | ' : '' %>
- Post manual credit card payment
-
-<% } %>
-
-
-
-Post credit
+% my $s = 0;
+% if ( $payby{'BILL'} && $curuser->access_right('Post payment') ) {
+ <% $s++ ? ' | ' : '' %>
+ Enter check payment
+% }
+
+% if ( $payby{'CASH'} && $curuser->access_right('Post payment') ) {
+ <% $s++ ? ' | ' : '' %>
+ Enter cash payment
+% }
+
+% if ( $payby{'WEST'} && $curuser->access_right('Post payment') ) {
+ <% $s++ ? ' | ' : '' %>
+ Enter Western Union payment
+% }
+
+% if ( ( $payby{'CARD'} || $payby{'DCRD'} )
+% && $curuser->access_right('Process payment')
+% && ! $cust_main->is_encrypted($cust_main->payinfo)
+% ) {
+ <% $s++ ? ' | ' : '' %>
+ Process credit card payment
+% }
+
+% if ( ( $payby{'CHEK'} || $payby{'DCHK'} )
+% && $curuser->access_right('Process payment')
+% && ! $cust_main->is_encrypted($cust_main->payinfo)
+% ) {
+ <% $s++ ? ' | ' : '' %>
+ Process electronic check (ACH) payment
+% }
+
+% if ( $payby{'MCRD'} && $curuser->access_right('Post payment') ) {
+ <% $s++ ? ' | ' : '' %>
+ Post manual (offline) credit card payment
+% }
-<%
-#get payment history
-my @history = ();
-
-#invoices
-foreach my $cust_bill ($cust_main->cust_bill) {
- my $pre = ( $cust_bill->owed > 0 )
- ? 'Open '
- : '';
- my $post = ( $cust_bill->owed > 0 ) ? '' : '';
- my $invnum = $cust_bill->invnum;
- push @history, {
- 'date' => $cust_bill->_date,
- 'desc' => qq!!. $pre.
- "Invoice #$invnum (Balance \$". $cust_bill->owed. ')'.
- $post. '',
- 'charge' => $cust_bill->charged,
- };
-}
-
-#payments (some false laziness w/credits)
-foreach my $cust_pay ($cust_main->cust_pay) {
-
- my $payby = $cust_pay->payby;
+% if ( $curuser->access_right('Post credit') ) {
+ Enter credit
+
+% }
+
+% if ( $curuser->access_right('View customer tax exemptions') ) {
+ View tax exemptions
+
+% }
+
+% if ( $conf->exists('batch-enable')
+% #&& $curuser->access_right('View customer tax exemptions')
+% ) {
+ View batched payments:
+% foreach my $status (qw( Queued In-transit Complete All )) {
+ <% $status %>
+ <% $status ne 'All' ? '|' : '' %>
+% }
+
+% }
+
+%#get payment history
+%my @history = ();
+%
+%#invoices
+%foreach my $cust_bill ($cust_main->cust_bill) {
+% my $pre = ( $cust_bill->owed > 0 )
+% ? 'Open '
+% : '';
+% my $post = ( $cust_bill->owed > 0 ) ? '' : '';
+% my $invnum = $cust_bill->invnum;
+% my $link = $curuser->access_right('View invoices')
+% ? qq!!
+% : '';
+% my $events = '';
+% if ( $cust_bill->num_cust_event
+% && ( $curuser->access_right('Billing event reports')
+% || $curuser->access_right('View customer billing events')
+% )
+% ) {
+% $events =
+% qq!
( View invoice events )';
+% }
+% push @history, {
+% 'date' => $cust_bill->_date,
+% 'desc' => $link. $pre.
+% "Invoice #$invnum (Balance \$". $cust_bill->owed. ')'.
+% $post. ( $link ? '' : '' ). $events,
+% 'charge' => $cust_bill->charged,
+% };
+%}
+%
+%#payments (some false laziness w/credits)
+%foreach my $cust_pay ($cust_main->cust_pay) {
+%
+% my $payby = $cust_pay->payby;
+%
+% my $payinfo;
+% if ( $payby eq 'CARD' ) {
+% $payinfo = $cust_pay->paymask;
+% } elsif ( $payby eq 'CHEK' && $cust_pay->payinfo =~ /^(\d+)\@(\d+)$/ ) {
+% $payinfo = "ABA $2, Acct# $1";
+% } else {
+% $payinfo = $cust_pay->payinfo;
+% }
+% my @cust_bill_pay = $cust_pay->cust_bill_pay;
+% my @cust_pay_refund = $cust_pay->cust_pay_refund;
+%
+% my $target = "$payby$payinfo";
+% $payby =~ s/^BILL$/Check #/ if $payinfo;
+% $payby =~ s/^CHEK$/Electronic check /;
+% $payby =~ s/^PREP$/Prepaid card /;
+% $payby =~ s/^CARD$/Credit card #/;
+% $payby =~ s/^COMP$/Complimentary by /;
+% $payby =~ s/^CASH$/Cash/;
+% $payby =~ s/^WEST$/Western Union/;
+% $payby =~ s/^MCRD$/Manual credit card/;
+% $payby =~ s/^BILL$//;
+% my $info = $payby ? " ($payby$payinfo)" : '';
+%
+% my( $pre, $post, $desc, $apply, $ext ) = ( '', '', '', '', '' );
+% if ( scalar(@cust_bill_pay) == 0
+% && scalar(@cust_pay_refund) == 0 ) {
+% #completely unapplied
+% $pre = 'Unapplied ';
+% $post = '';
+% $apply = qq! (apply)!;
+%
+% } elsif ( scalar(@cust_bill_pay) == 1
+% && scalar(@cust_pay_refund) == 0
+% && $cust_pay->unapplied == 0 ) {
+% #applied to one invoice, the usual situation
+% $desc = ' applied to Invoice #'. $cust_bill_pay[0]->invnum;
+% } elsif ( scalar(@cust_bill_pay) == 0
+% && scalar(@cust_pay_refund) == 1
+% && $cust_pay->unapplied == 0 ) {
+% #applied to one refund
+% $desc = ' refunded on '. time2str("%D", $cust_pay_refund[0]->_date);
+% } else {
+% #complicated
+% $desc = '
';
+% foreach my $app ( sort { $a->_date <=> $b->_date }
+% ( @cust_bill_pay, @cust_pay_refund ) ) {
+% if ( $app->isa('FS::cust_bill_pay') ) {
+% $desc .= ' '.
+% '$'. $app->amount.
+% ' applied to Invoice #'. $app->invnum.
+% '
';
+% #' on '. time2str("%D", $cust_bill_pay->_date).
+% } elsif ( $app->isa('FS::cust_pay_refund') ) {
+% $desc .= ' '.
+% '$'. $app->amount.
+% ' refunded on '. time2str("%D", $app->_date).
+% '
';
+% } else {
+% die "$app is not a FS::cust_bill_pay or FS::cust_pay_refund";
+% }
+% }
+% if ( $cust_pay->unapplied > 0 ) {
+% $desc .= ' '.
+% '$'.
+% $cust_pay->unapplied. ' unapplied'.
+% qq! (apply)!.
+% '
';
+% }
+% }
+%
+% my $refund = '';
+% my $refund_days = $conf->config('card_refund-days') || 120;
+% if ( $cust_pay->closed !~ /^Y/i
+% && $cust_pay->payby =~ /^(CARD|CHEK)$/
+% && time-$cust_pay->_date < $refund_days*86400
+% && $cust_pay->unrefunded > 0
+% && $curuser->access_right('Refund payment')
+% ) {
+% $refund = qq! (refund)!;
+% }
+%
+% my $void = '';
+% if ( $cust_pay->closed !~ /^Y/i
+% && ( ( $cust_pay->payby eq 'CARD'
+% && $curuser->access_right('Credit card void')
+% )
+% || ( $cust_pay->payby eq 'CHEK'
+% && $curuser->access_right('Echeck void')
+% )
+% || ( $cust_pay->payby !~ /^(CARD|CHEK)$/
+% && $curuser->access_right('Regular void')
+% )
+% )
+% )
+% {
+% $void = qq! (void)!;
+% }
+%
+% my $delete = '';
+% if ( $cust_pay->closed !~ /^Y/i
+% && $conf->exists('deletepayments')
+% && $curuser->access_right('Delete payment')
+% )
+% {
+% $delete = qq! (delete)!;
+% }
+%
+% my $unapply = '';
+% if ( $cust_pay->closed !~ /^Y/i
+% && scalar(@cust_bill_pay)
+% && $curuser->access_right('Unapply payment')
+% )
+% {
+% $unapply = qq! (unapply)!;
+% }
+%
+% push @history, {
+% 'date' => $cust_pay->_date,
+% 'desc' => $pre. "Payment$post$info$desc".
+% "$apply$refund$void$delete$unapply",
+% 'payment' => $cust_pay->paid,
+% 'target' => $target,
+% };
+%}
+%
+%#voided payments
+%foreach my $cust_pay_void ($cust_main->cust_pay_void) {
+%
+% my $payby = $cust_pay_void->payby;
+% my $payinfo = $payby eq 'CARD'
+% ? $cust_pay_void->paymask
+% : $cust_pay_void->payinfo;
+%
+% $payby =~ s/^BILL$/Check #/ if $payinfo;
+% $payby =~ s/^CHEK$/Electronic check /;
+% $payby =~ s/^BILL$//;
+% $payby =~ s/^(CARD|COMP)$/$1 /;
+% my $info = $payby ? " ($payby$payinfo)" : '';
+%
+% my $unvoid = '';
+% if ( $cust_pay_void->closed !~ /^Y/i
+% && $curuser->access_right('Unvoid')
+% )
+% {
+% $unvoid = qq! (unvoid)!;
+% }
+%
+% push @history, {
+% 'date' => $cust_pay_void->_date,
+% 'desc' => "Payment $info voided ".
+% time2str("%D", $cust_pay_void->void_date).
+% " by ". $cust_pay_void->otaker. ''. $unvoid,
+% 'void_payment' => $cust_pay_void->paid,
+% };
+%
+%}
+%
+%#credits (some false laziness w/payments)
+%foreach my $cust_credit ($cust_main->cust_credit) {
+%
+% my @cust_credit_bill = $cust_credit->cust_credit_bill;
+% my @cust_credit_refund = $cust_credit->cust_credit_refund;
+%
+% my( $pre, $post, $desc, $apply, $ext ) = ( '', '', '', '', '' );
+% if ( scalar(@cust_credit_bill) == 0
+% && scalar(@cust_credit_refund) == 0 ) {
+% #completely unapplied
+% $pre = 'Unapplied ';
+% $post = '';
+% $apply = qq! (apply)!;
+% } elsif ( scalar(@cust_credit_bill) == 1
+% && scalar(@cust_credit_refund) == 0
+% && $cust_credit->credited == 0 ) {
+% #applied to one invoice, the usual situation
+% $desc = ' applied to Invoice #'. $cust_credit_bill[0]->invnum;
+% } elsif ( scalar(@cust_credit_bill) == 0
+% && scalar(@cust_credit_refund) == 1
+% && $cust_credit->credited == 0 ) {
+% #applied to one refund
+% $desc = ' refunded on '. time2str("%D", $cust_credit_refund[0]->_date);
+% } else {
+% #complicated
+% $desc = '
';
+% foreach my $app ( sort { $a->_date <=> $b->_date }
+% ( @cust_credit_bill, @cust_credit_refund ) ) {
+% if ( $app->isa('FS::cust_credit_bill') ) {
+% $desc .= ' '.
+% '$'. $app->amount.
+% ' applied to Invoice #'. $app->invnum.
+% '
';
+% #' on '. time2str("%D", $app->_date).
+% } elsif ( $app->isa('FS::cust_credit_refund') ) {
+% $desc .= ' '.
+% '$'. $app->amount.
+% ' refunded on '. time2str("%D", $app->_date).
+% '
';
+% } else {
+% die "$app is not a FS::cust_credit_bill or a FS::cust_credit_refund";
+% }
+% }
+% if ( $cust_credit->credited > 0 ) {
+% $desc .= ' $'.
+% $cust_credit->credited. ' unapplied'.
+% qq! (apply)!.
+% '
';
+% }
+% }
+%#
+% my $delete = '';
+% if ( $cust_credit->closed !~ /^Y/i
+%
+% #s'pose deleting a credit isn't bad like deleting a payment
+% # and this needs to be generally available until we have credit voiding..
+% #&& $conf->exists('deletecredits')
+%
+% && $curuser->access_right('Delete credit')
+% )
+% {
+% $delete = qq! (!.
+% qq!delete)!;
+% }
+%
+% my $unapply = '';
+% if ( $cust_credit->closed !~ /^Y/i
+% && scalar(@cust_credit_bill)
+% && $curuser->access_right('Unapply credit')
+% )
+% {
+% $unapply = qq! (!.
+% qq!unapply)!;
+% }
+%
+% push @history, {
+% 'date' => $cust_credit->_date,
+% 'desc' => $pre. "Credit$post by ". $cust_credit->otaker.
+% ( $cust_credit->reason
+% ? ' ('. $cust_credit->reason. ')'
+% : ''
+% ).
+% "$desc$apply$delete$unapply",
+% 'credit' => $cust_credit->amount,
+% };
+%
+%}
+%
+%#refunds
+%foreach my $cust_refund ($cust_main->cust_refund) {
+%
+% my $payby = $cust_refund->payby;
+% my $payinfo = $payby eq 'CARD'
+% ? $cust_refund->paymask
+% : $cust_refund->payinfo;
+%
+% $payby =~ s/^BILL$/Check #/ if $payinfo;
+% $payby =~ s/^CHEK$/Electronic check /;
+% $payby =~ s/^(CARD|COMP)$/$1 /;
+%
+% my $delete = '';
+% if ( $cust_refund->closed !~ /^Y/i
+% && $conf->exists('deleterefunds')
+% && $curuser->access_right('Delete refund')
+% )
+% {
+% $delete = qq! (delete)!;
+% }
+%
+% push @history, {
+% 'date' => $cust_refund->_date,
+% 'desc' => "Refund ($payby$payinfo) by ". $cust_refund->otaker. "
".
+% $delete,
+% 'refund' => $cust_refund->refund,
+% };
+%
+%}
+%
+%
+
+
+<% include("/elements/table-grid.html") %>
+% my $bgcolor1 = '#eeeeee';
+% my $bgcolor2 = '#ffffff';
+% my $bgcolor = '';
+%
- my $payinfo;
- if ( $payby eq 'CARD' ) {
- $payinfo = $cust_pay->payinfo_masked;
- } elsif ( $payby eq 'CHEK' && $cust_pay->payinfo =~ /^(\d+)\@(\d+)$/ ) {
- $payinfo = "ABA $2, Acct# $1";
- } else {
- $payinfo = $cust_pay->payinfo;
- }
- my @cust_bill_pay = $cust_pay->cust_bill_pay;
- my @cust_pay_refund = $cust_pay->cust_pay_refund;
-
- my $target = "$payby$payinfo";
- $payby =~ s/^BILL$/Check #/ if $payinfo;
- $payby =~ s/^CHEK$/Electronic check /;
- $payby =~ s/^PREP$/Prepaid card /;
- $payby =~ s/^CARD$/Credit card #/;
- $payby =~ s/^COMP$/Complimentary by /;
- $payby =~ s/^CASH$/Cash/;
- $payby =~ s/^WEST$/Western Union/;
- $payby =~ s/^MCRD$/Manual credit card/;
- $payby =~ s/^BILL$//;
- my $info = $payby ? " ($payby$payinfo)" : '';
-
- my( $pre, $post, $desc, $apply, $ext ) = ( '', '', '', '', '' );
- if ( scalar(@cust_bill_pay) == 0
- && scalar(@cust_pay_refund) == 0 ) {
- #completely unapplied
- $pre = 'Unapplied ';
- $post = '';
- $apply = qq! (apply)!;
-
- } elsif ( scalar(@cust_bill_pay) == 1
- && scalar(@cust_pay_refund) == 0
- && $cust_pay->unapplied == 0 ) {
- #applied to one invoice, the usual situation
- $desc = ' applied to Invoice #'. $cust_bill_pay[0]->invnum;
- } elsif ( scalar(@cust_bill_pay) == 0
- && scalar(@cust_pay_refund) == 1
- && $cust_pay->unapplied == 0 ) {
- #applied to one refund
- $desc = ' refunded on '. time2str("%D", $cust_pay_refund[0]->_date);
- } else {
- #complicated
- $desc = '
';
- foreach my $app ( sort { $a->_date <=> $b->_date }
- ( @cust_bill_pay, @cust_pay_refund ) ) {
- if ( $app->isa('FS::cust_bill_pay') ) {
- $desc .= ' '.
- '$'. $app->amount.
- ' applied to Invoice #'. $app->invnum.
- '
';
- #' on '. time2str("%D", $cust_bill_pay->_date).
- } elsif ( $app->isa('FS::cust_pay_refund') ) {
- $desc .= ' '.
- '$'. $app->amount.
- ' refunded on'. time2str("%D", $app->_date).
- '
';
- } else {
- die "$app is not a FS::cust_bill_pay or FS::cust_pay_refund";
- }
- }
- if ( $cust_pay->unapplied > 0 ) {
- $desc .= ' '.
- '$'.
- $cust_pay->unapplied. ' unapplied'.
- qq! (apply)!.
- '
';
- }
- }
- my $refund = '';
- my $refund_days = $conf->config('card_refund-days') || 120;
- if ( $cust_pay->closed !~ /^Y/i
- && $cust_pay->payby =~ /^(CARD|CHEK)$/
- && time-$cust_pay->_date < $refund_days*86400
- && $cust_pay->unrefunded > 0
- ) {
- $refund = qq! (refund)!;
- }
+