+# sort in forward order first, and calculate running balances
+my $years = $conf->config('payment_history-years') || 2;
+my $older_than = time - $years * 31556926; #60*60*24*365.2422
+my $balance = 0;
+
+@history = sort { $a->{date} <=> $b->{date}
+ or $a->{order} <=> $b->{order}
+ or $a->{num} <=> $b->{num}
+ }
+ @history;
+
+my $i = 0;
+my $balance_forward;
+foreach my $item (@history) {
+ $balance += $item->{'charge'} if exists $item->{'charge'};
+ $balance -= $item->{'payment'} if exists $item->{'payment'};
+ $balance -= $item->{'credit'} if exists $item->{'credit'};
+ $balance += $item->{'refund'} if exists $item->{'refund'};
+ $balance = sprintf("%.2f", $balance);
+ $balance =~ s/^\-0\.00$/0.00/;
+ $item->{'balance'} = $balance;
+
+ if ( $item->{'date'} < $older_than ) {
+ $item->{'hide'} = 1;
+ } elsif ( $history[$i-1]->{'hide'} ) {
+ # this is the end of the hidden section
+ $history[$i-1]->{'balance_forward'} = 1;
+ }
+ $i++;
+}
+if ( @history and $history[-1]->{'hide'} ) {
+ # then everything is hidden
+ $history[-1]->{'balance_forward'} = 1;
+}
+
+# then sort in user-pref order
+if ( $curuser->option('history_order') eq 'newest' ) {
+ @history = sort { $b->{date} <=> $a->{date}
+ or $b->{order} <=> $a->{order} #or still forward here?
+ or $b->{num} <=> $a->{num}
+ }
+ @history;
+} # else it's already oldest-first, and there are no other options yet
+
+sub translate_payby {
+ my ($payby,$payinfo) = (shift,shift);
+ my %payby = (
+ FS::payby->payby2shortname,
+ BILL => $payinfo ? emt('Check #') : '',
+ CHEK => emt('Electronic check '),
+ PREP => emt('Prepaid card '),
+ CARD => emt('Credit card #'),
+ COMP => emt('Complimentary by '),
+ #CASH => emt('Cash'),
+ #WEST => emt('Western Union'),
+ #MCRD => emt('Manual credit card'),
+ );
+ $payby = (exists $payby{$payby}) ? $payby{$payby} : $payby;
+ $payby;
+};
+
+sub translate_payby_refund {
+ my ($payby,$payinfo) = (shift,shift);
+ my %payby = (
+ FS::payby->payby2shortname,
+ BILL => $payinfo ? emt('Check #') : emt('Check'),
+ CHEK => emt('Electronic check '),
+ CARD => emt('Credit card #'),
+ COMP => emt('Complimentary by '),
+ );
+ $payby = (exists $payby{$payby}) ? $payby{$payby} : $payby;
+ $payby;
+};
+
+sub translate_payinfo {
+ my $object = shift;
+ my $payby = $object->payby;
+ my $payinfo = $object->payinfo;
+
+ if ( $payby eq 'CARD' ) {
+ $payinfo = $object->paymask;
+ } elsif ( $payby eq 'CHEK' ) {
+ #false laziness w/payinfo_Mixin::payby_payinfo_pretty, should use that
+ my( $account, $aba ) = split('@', $object->paymask );
+ if ( $aba =~ /^(\d{5})\.(\d{3})$/ ) { #blame canada
+ my($branch, $routing) = ($1, $2);
+ $payinfo = emt("Routing [_1], Branch [_2], Acct [_3]",
+ $routing, $branch, $account);
+ } else {
+ $payinfo = emt("Routing [_1], Acct [_2]", $aba, $account);
+ }
+ }
+
+ ($payby,$payinfo);
+}
+
+sub areyousure_link {
+ my ($url,$msg,$title,$label) = (shift,shift,shift,shift);
+ ' (<A HREF="javascript:areyousure(\''.$url.'\',\''.$msg.'\')" TITLE="'.$title.'">'.$label.'</A>)';
+}
+