RT#37064: Add action link to manually refund a payment
[freeside.git] / httemplate / view / cust_main / payment_history / payment.html
1 <% $payment. ' '.  $info. $desc.
2    $view. $change_pkg. $apply. $refund. $void. $delete. $unapply
3 %>
4 <%init>
5
6 my( $cust_pay, %opt ) = @_;
7
8 my $date_format = $opt{'date_format'} || '%m/%d/%Y';
9
10 my @cust_bill_pay = $cust_pay->cust_bill_pay;
11 my @cust_pay_refund = $cust_pay->cust_pay_refund;
12 my $unapplied = $cust_pay->unapplied;
13
14 my ($payby,$payinfo) = translate_payinfo($cust_pay);
15 my $target = "$payby$payinfo";
16 $payby = translate_payby($payby,$payinfo);
17 my $info = $payby ? "($payby$payinfo)" : '';
18
19 my $desc = '';
20 if ( $opt{'pkg-balances'} && $cust_pay->pkgnum ) {
21   my $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $cust_pay->pkgnum } );
22   $desc .= ' for '. $cust_pkg->pkg_label_long;
23 }
24
25 my %cust_bill_pay_width = ('width' => 392);
26 my %cust_bill_pay_height = ();
27 if ( $opt{'cust_bill_pay_pkg-manual'} ) {
28   %cust_bill_pay_width = ('width' => 592);
29   %cust_bill_pay_height = ('height' => 436);
30 }
31
32 my $apply = '';
33
34 my $italicize_otaker = 0;
35 my $otaker = $cust_pay->otaker;
36 if ( $otaker eq 'fs_daily' ) {
37     $otaker = 'auto billing';
38     $italicize_otaker = 1;
39 }
40 if ( $otaker eq 'fs_selfservice' ) {
41     $otaker = 'customer self-service';
42     $italicize_otaker = 1;
43 }
44
45 my $payment = emt("Payment by [_1]",$otaker);
46 $payment =~ s/$otaker/<i>$otaker<\/i>/ if $italicize_otaker;
47
48 if (    scalar(@cust_bill_pay)   == 0
49      && scalar(@cust_pay_refund) == 0 ) {
50   #completely unapplied
51   $payment = emt("Unapplied Payment by [_1]",$otaker);
52   $payment =~ s/$otaker/<i>$otaker<\/i>/ if $italicize_otaker;
53   $payment = '<B><FONT COLOR="#FF0000">'.$payment.'</FONT></B>';
54 } elsif (    scalar(@cust_bill_pay)   == 1
55           && scalar(@cust_pay_refund) == 0
56           && $unapplied == 0     ) {
57   #applied to one invoice, the usual situation
58   $desc .= ' '. $cust_bill_pay[0]->applied_to_invoice;
59 } elsif (    scalar(@cust_bill_pay)   == 0
60           && scalar(@cust_pay_refund) == 1
61           && $unapplied == 0     ) {
62   #applied to one refund
63   $desc .= emt(" refunded on [_1]", time2str($date_format, $cust_pay_refund[0]->_date) );
64 } else {
65   #complicated
66   $desc .= '<BR>';
67   foreach my $app ( sort { $a->_date <=> $b->_date }
68                          ( @cust_bill_pay, @cust_pay_refund ) ) {
69     if ( $app->isa('FS::cust_bill_pay') ) {
70       $desc .= '&nbsp;&nbsp;' . $opt{money_char} . $app->amount . ' ' .
71                 $app->applied_to_invoice . '<BR>';
72     } elsif ( $app->isa('FS::cust_pay_refund') ) {
73       $desc .= '&nbsp;&nbsp;' .
74                emt("[_1][_2] refunded on [_3]", $opt{money_char}, $app->amount,
75                         time2str($date_format, $app->_date) ) . '<BR>';
76     } else {
77       die "$app is not a FS::cust_bill_pay or FS::cust_pay_refund";
78     }
79   }
80   if ( $unapplied > 0 ) {
81     $desc .= '&nbsp;&nbsp;'.
82              '<B><FONT COLOR="#FF0000">'.
83              emt("[_1][_2] unapplied", $opt{money_char}, $unapplied).
84              '</FONT></B>';
85     $desc .= '<BR>';
86   }
87 }
88
89 if ($unapplied > 0) {
90   if ( $opt{'Apply payment'} ) {
91     if ( $opt{total_owed} > 0 ) {
92       $apply = ' ('.
93                include( '/elements/popup_link.html',
94                           'label'       => emt('apply'),
95                           'action'      => "${p}edit/cust_bill_pay.cgi?".
96                                            $cust_pay->paynum,
97                           'actionlabel' => emt('Apply payment'),
98                           %cust_bill_pay_width,
99                           %cust_bill_pay_height,
100                       ).
101                 ')';
102     }
103     if ( $opt{total_unapplied_refunds} > 0 ) {
104       $apply.= ' ('.
105                include( '/elements/popup_link.html',
106                           'label'       => emt('apply to refund'),
107                           'action'      => "${p}edit/cust_pay_refund.cgi?".
108                                            $cust_pay->paynum,
109                           'actionlabel' => emt('Apply payment to refund'),
110                           'width'       => 392,
111                       ).
112                ')';
113     }
114     $apply .= ' (auto&#8209;apply:&nbsp;'
115            .  ($cust_pay->no_auto_apply ? 'no' : 'yes')
116            .  '&nbsp;|&nbsp;'
117            .  include( '/elements/popup_link.html',
118                           'label'       => emt($cust_pay->no_auto_apply ? 'yes' : 'no'),
119                           'action'      => "${p}edit/process/cust_pay-no_auto_apply.cgi?paynum="
120                                            . $cust_pay->paynum
121                                            . '&no_auto_apply='
122                                            . ($cust_pay->no_auto_apply ? '' : 'Y'),
123                           'actionlabel' => emt('Toggle Auto-Apply'),
124                           'width'       => 392,
125                           'height'      => 200,
126                       )
127            . ')';
128   } else { # end if $opt('Apply payment')
129     $apply .= ' (no auto-apply)' if $cust_pay->no_auto_apply;
130   }
131 } # end if $unapplied > 0
132
133 my $view =
134   ' ('. include('/elements/popup_link.html',
135                   'label'     => emt('view receipt'),
136                   'action'    => "${p}view/cust_pay.html?link=popup;paynum=".
137                                   $cust_pay->paynum,
138                   'actionlabel' => emt('Payment Receipt'),
139                ).
140    ')';
141
142 my $change_pkg = '';
143 if ( $apply && $opt{'pkg-balances'} && $cust_pay->pkgnum ) {
144   $change_pkg =
145   ' ('. include('/elements/popup_link.html',
146                   'label'       => emt('change package'),
147                   'action'      => "${p}edit/cust_pay-pkgnum.html?paynum=".
148                                     $cust_pay->paynum,
149                   'actionlabel' => emt('Change payment package'),
150                   'width'       => 763,
151                ).
152    ')';
153 }
154
155 my $refund = '';
156 my $refund_days = $opt{'card_refund-days'} || 120;
157 my @refund_right = grep { $opt{$_} } $FS::CurrentUser::CurrentUser->refund_rights($cust_pay->payby);
158 if (    $cust_pay->closed !~ /^Y/i
159      && $cust_pay->payby =~ /^(CARD|CHEK|BILL)$/
160      && time-$cust_pay->_date < $refund_days*86400
161      && $cust_pay->unrefunded > 0
162      && scalar(@refund_right)
163 ) {
164   my $refundtitle = ($cust_pay->payby =~ /^(CARD|CHEK)$/)
165             ? emt('Send a refund for this payment to the payment gateway')
166             : emt('Record a refund for this payment');
167   $refund = qq! (<A HREF="${p}edit/cust_refund.cgi?payby=$1;!.
168             qq!paynum=!. $cust_pay->paynum. '"'.
169             qq! TITLE="! . $refundtitle
170             . '">' . emt('refund') . '</A>)';
171 }
172
173 my $void = '';
174 my $voidmsg = $cust_pay->payby =~ /^(CARD|CHEK)$/
175               ? ' (' . emt('do not send anything to the payment gateway').')'
176               : '';
177 $void = areyousure_link("${p}misc/void-cust_pay.cgi?".$cust_pay->paynum,
178                         emt('Are you sure you want to void this payment?'),
179                         emt('Void this payment from the database') . $voidmsg,
180                         emt('void')
181                        )
182   if $cust_pay->closed !~ /^Y/i
183   && (    ( $cust_pay->payby eq 'CARD'          && $opt{'Credit card void'} )
184        || ( $cust_pay->payby eq 'CHEK'          && $opt{'Echeck void'}      )
185        || ( $cust_pay->payby !~ /^(CARD|CHEK)$/ && $opt{'Void payments'}    )
186      );
187
188 my $delete = '';
189 $delete = areyousure_link("${p}misc/delete-cust_pay.cgi?".$cust_pay->paynum,
190                             emt('Are you sure you want to delete this payment?'),
191                             emt('Delete this payment from the database completely - not recommended'),
192                             emt('delete')
193                          )
194   if $cust_pay->closed !~ /^Y/i
195   && $opt{'deletepayments'}
196   && $opt{'Delete payment'};
197
198 my $unapply = '';
199 $unapply = areyousure_link("${p}misc/unapply-cust_pay.cgi?".$cust_pay->paynum,
200                             emt('Are you sure you want to unapply this payment?'),
201                             emt('Keep this payment, but dissociate it from the invoices it is currently applied against'),
202                             emt('unapply')
203                           )
204   if $cust_pay->closed !~ /^Y/i
205   && scalar(@cust_bill_pay)           
206   && $opt{'Unapply payment'};
207
208 </%init>