[freeside-commits] freeside/httemplate/view/cust_main/payment_history credit.html, NONE, 1.1 invoice.html, NONE, 1.1 payment.html, NONE, 1.1 refund.html, NONE, 1.1 voided_payment.html, NONE, 1.1

Ivan,,, ivan at wavetail.420.am
Sun Jun 1 15:48:17 PDT 2008


Update of /home/cvs/cvsroot/freeside/httemplate/view/cust_main/payment_history
In directory wavetail.420.am:/tmp/cvs-serv3210/httemplate/view/cust_main/payment_history

Added Files:
	credit.html invoice.html payment.html refund.html 
	voided_payment.html 
Log Message:
refactor payment history slightly, add refund receipts, have "unapplied" refunds show like other unapplied/open things, RT#3545

--- NEW FILE: voided_payment.html ---
<DEL>Payment <% $info %></DEL>
<I>voided <% time2str("%D", $cust_pay_void->void_date) %>
by <% $cust_pay_void->otaker %></I><% $unvoid %>
<%init>

my( $cust_pay_void, %opt ) = @_;

my $curuser = $FS::CurrentUser::CurrentUser;

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! (<A HREF="javascript:areyousure('!.
            qq!${p}misc/unvoid-cust_pay_void.cgi?!. $cust_pay_void->paynum.
            qq!', 'Are you sure you want to unvoid this payment?')"!.
            qq! TITLE="Unvoid this payment from the database!.
              ( $cust_pay_void->payby =~ /^(CARD|CHEK)$/
                ? ' (do not send anything to the payment gateway)'
                : '' 
              ). '"'.
            qq!>unvoid</A>)!;
}

</%init>

--- NEW FILE: refund.html ---
<% $pre %>Refund<% $post %>
(<% $payby. $payinfo %>)
by <% $cust_refund->otaker %><% $view %><% $delete %>
<%init>

my( $cust_refund, %opt ) = @_;

my $conf = new FS::Conf;
my $curuser = $FS::CurrentUser::CurrentUser;

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($pre, $post) = ('', '');
if ( $cust_refund->unapplied > 0 ) {
  $pre = '<B><FONT COLOR="#FF0000">Unapplied ';
  $post = '</FONT></B>';
}

my $view =
  ' ('. include('/elements/popup_link.html',
                  'label'     => 'view receipt',
                  'action'    => "${p}view/cust_refund.html?link=popup;".
                                 'refundnum='. $cust_refund->refundnum,
                  'actionlabel' => 'Payment Receipt',
               ).
   ')';


my $delete = '';
if ( $cust_refund->closed !~ /^Y/i
     && $conf->exists('deleterefunds')
     && $curuser->access_right('Delete refund')
   )
{
  $delete = qq! (<A HREF="javascript:areyousure('!.
            qq!${p}misc/delete-cust_refund.cgi?!. $cust_refund->refundnum.
            qq!', 'Are you sure you want to delete this refund?')"!.
            qq! TITLE="Delete this refund from the database completely - not recommended"!.
            qq!>delete</A>)!;
}

</%init>


--- NEW FILE: invoice.html ---
<% $link %><% $pre %>Invoice #<% $invnum %>
(Balance $ <% $cust_bill->owed %>)<% $post %><% $link ? '</A>' : '' %><% $events %>
<%init>

my( $cust_bill, %opt ) = @_;

my $curuser = $FS::CurrentUser::CurrentUser;

my($pre, $post) = ('', '');
if ( $cust_bill->owed > 0 ) {
  $pre = '<B><FONT SIZE="+1" COLOR="#FF0000">Open ';
  $post = '</FONT></B>';
}

my $invnum = $cust_bill->invnum;

my $link = $curuser->access_right('View invoices')
             ? qq!<A HREF="${p}view/cust_bill.cgi?$invnum">!
             : '';

my $events = '';
#1.9
if ( $cust_bill->num_cust_event
     && (    $curuser->access_right('Billing event reports')
          || $curuser->access_right('View customer billing events')
        )
   ) {
  $events =
    qq!<BR><FONT SIZE="-1"><A HREF="${p}search/cust_event.html?invnum=!.
    $cust_bill->invnum. '">(&nbsp;View invoice events&nbsp;)</A></FONT>';
}
#

</%init>

--- NEW FILE: payment.html ---
<% $pre %>Payment<% $post %> by <% $otaker %>
<% "$info$desc$view$apply$refund$void$delete$unapply" %>
<%init>

my( $cust_pay, %opt ) = @_;

my $conf = new FS::Conf;
my $curuser = $FS::CurrentUser::CurrentUser;

my $payby = $cust_pay->payby;

my $payinfo;
if ( $payby eq 'CARD' ) {
  $payinfo = $cust_pay->paymask;
} elsif ( $payby eq 'CHEK' ) {
  my( $account, $aba ) = split('@', $cust_pay->paymask );
  $payinfo = "ABA $aba, Acct #$account";
} 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 = '<B><FONT COLOR="#FF0000">Unapplied ';
  $post = '</FONT></B>';
  if ( $curuser->access_right('Apply payment') ) {
    $apply = ' ('. include( '/elements/popup_link.html',
                              'label'       => 'apply',
                              'action'      => "${p}edit/cust_bill_pay.cgi?".
                                               $cust_pay->paynum,
                              'actionlabel' => 'Apply payment',
                              'width'       => 392,
                              #default# 'height' => 336,
                          ).
              ')';
  }
} elsif (    scalar(@cust_bill_pay)   == 1
          && scalar(@cust_pay_refund) == 0
          && $cust_pay->unapplied == 0     ) {
  #applied to one invoice, the usual situation
  $desc = ' '. $cust_bill_pay[0]->applied_to_invoice;
} 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 = '<BR>';
  foreach my $app ( sort { $a->_date <=> $b->_date }
                         ( @cust_bill_pay, @cust_pay_refund ) ) {
    if ( $app->isa('FS::cust_bill_pay') ) {
      $desc .= '&nbsp;&nbsp;'.
               '$'. $app->amount.
               ' '. $app->applied_to_invoice.
               '<BR>';
               #' on '. time2str("%D", $cust_bill_pay->_date).
    } elsif ( $app->isa('FS::cust_pay_refund') ) {
      $desc .= '&nbsp;&nbsp;'.
               '$'. $app->amount.
               ' refunded on '. time2str("%D", $app->_date).
               '<BR>';
    } else {
      die "$app is not a FS::cust_bill_pay or FS::cust_pay_refund";
    }
  }
  if ( $cust_pay->unapplied > 0 ) {
    $desc .= '&nbsp;&nbsp;'.
             '<B><FONT COLOR="#FF0000">$'.
             $cust_pay->unapplied. ' unapplied</FONT></B>';
    if ( $curuser->access_right('Apply payment') ) {
      $desc = ' ('. include( '/elements/popup_link.html',
                               'label'      => 'apply',
                               'action'     => "${p}edit/cust_bill_pay.cgi?".
                                               $cust_pay->paynum,
                               'actionlabel' => 'Apply payment',
                               'width'      => 392,
                               #default# 'height' => 336,
                          ).
              ')';
    }
    $desc .= '<BR>';
  }
}

my $view =
  ' ('. include('/elements/popup_link.html',
                  'label'     => 'view receipt',
                  'action'    => "${p}view/cust_pay.html?link=popup;paynum=".
                                  $cust_pay->paynum,
                  'actionlabel' => 'Payment Receipt',
               ).
   ')';

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! (<A HREF="${p}edit/cust_refund.cgi?payby=$1;!.
            qq!paynum=!. $cust_pay->paynum. '"'.
            qq! TITLE="Send a refund for this payment to the payment gateway"!.
            qq!>refund</A>)!;
}

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! (<A HREF="javascript:areyousure('!.
          qq!${p}misc/void-cust_pay.cgi?!. $cust_pay->paynum.
          qq!', 'Are you sure you want to void this payment?')"!.
          qq! TITLE="Void this payment from the database!.
            ( $cust_pay->payby =~ /^(CARD|CHEK)$/
              ? ' (do not send anything to the payment gateway)'
              : '' 
            ). '"'.
          qq!>void</A>)!;
}

my $delete = '';
if ( $cust_pay->closed !~ /^Y/i
     && $conf->exists('deletepayments')
     && $curuser->access_right('Delete payment')
   )
{
  $delete = qq! (<A HREF="javascript:areyousure('!.
            qq!${p}misc/delete-cust_pay.cgi?!. $cust_pay->paynum.
            qq!', 'Are you sure you want to delete this payment?')"!.
            qq! TITLE="Delete this payment from the database completely - not recommended"!.
            qq!>delete</A>)!;
}

my $unapply = '';
if (    $cust_pay->closed !~ /^Y/i
     && scalar(@cust_bill_pay)           
     && $curuser->access_right('Unapply payment')
   )
{
  $unapply = qq! (<A HREF="javascript:areyousure('!.
             qq!${p}misc/unapply-cust_pay.cgi?!. $cust_pay->paynum.
             qq!', 'Are you sure you want to unapply this payment?')"!.
             qq! TITLE="Keep this payment, but dissociate it from the invoices it is currently applied against"!.
             qq!>unapply</A>)!;
}

my $otaker = $cust_pay->otaker;
$otaker = '<i>auto billing</i>'          if $otaker eq 'fs_daily';
$otaker = '<i>customer self-service</i>' if $otaker eq 'fs_selfservice';

</%init>

--- NEW FILE: credit.html ---
<% $pre %>Credit<% $post %>
by <% $cust_credit->otaker %><% "$reason$desc$apply$delete$unapply" %>
<%init>

my( $cust_credit, %opt ) = @_;

my $curuser = $FS::CurrentUser::CurrentUser;

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 = '<B><FONT COLOR="#FF0000">Unapplied ';
  $post = '</FONT></B>';
  if ( $curuser->access_right('Apply credit') ) {
    $apply = ' ('. include( '/elements/popup_link.html',
                              'label'    => 'apply',
                              'action'   => "${p}edit/cust_credit_bill.cgi?".
                                            $cust_credit->crednum,
                              'actionlabel' => 'Apply credit',
                              'width'    => 392,
                              #default# 'height' => 336,
                          ).
              ')';
  }
} elsif (    scalar(@cust_credit_bill)   == 1
          && scalar(@cust_credit_refund) == 0
          && $cust_credit->credited == 0      ) {
  #applied to one invoice, the usual situation
  $desc = ' '. $cust_credit_bill[0]->applied_to_invoice;
} 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 = '<BR>';
  foreach my $app ( sort { $a->_date <=> $b->_date }
                         ( @cust_credit_bill, @cust_credit_refund ) ) {
    if ( $app->isa('FS::cust_credit_bill') ) {
      $desc .= '&nbsp;&nbsp;'.
               '$'. $app->amount.
               ' '. $app->applied_to_invoice.
               '<BR>';
               #' on '. time2str("%D", $app->_date).
    } elsif ( $app->isa('FS::cust_credit_refund') ) {
      $desc .= '&nbsp;&nbsp;'.
               '$'. $app->amount.
               ' refunded on '. time2str("%D", $app->_date).
               '<BR>';
    } else {
      die "$app is not a FS::cust_credit_bill or a FS::cust_credit_refund";
    }
  }
  if ( $cust_credit->credited > 0 ) {
    $desc .= '&nbsp;&nbsp;<B><FONT COLOR="#FF0000">$'.
             $cust_credit->credited. ' unapplied</FONT></B>';
    if ( $curuser->access_right('Apply credit') ) {
      $desc = ' ('. include( '/elements/popup_link.html',
                              'label'       => 'apply',
                              'action'      => "${p}edit/cust_credit_bill.cgi?".
                                               $cust_credit->crednum,
                              'actionlabel' => 'Apply credit',
                              'width'       => 392,
                              #default# 'height' => 336,
                          ).
              ')';
    }
    $desc .= '<BR>';
  }
}
#
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! (<A HREF="javascript:areyousure('!.
            qq!${p}misc/delete-cust_credit.cgi?!. $cust_credit->crednum.
            qq!', 'Are you sure you want to delete this credit?')">!.
            qq!delete</A>)!;
}

my $unapply = '';
if (    $cust_credit->closed !~ /^Y/i
     && scalar(@cust_credit_bill)
     && $curuser->access_right('Unapply credit')
   )
{
  $unapply = qq! (<A HREF="javascript:areyousure('!.
             qq!${p}misc/unapply-cust_credit.cgi?!. $cust_credit->crednum.
             qq!', 'Are you sure you want to unapply this credit?')">!.
             qq!unapply</A>)!;
}

my $reason = $cust_credit->reason
               ? ' ('. $cust_credit->reason. ')'
               : '';

</%init>




More information about the freeside-commits mailing list